2017-01-19 7 views
1

私は量的変数(例えば価格)を分類しています。平均値の周りでビンがずっと頻繁になるように分類したいと思います平均から。パンダのデータフレームの列カット - 平均値の周りにもっと多くのビンを追加します

私は、直線的な方法でnumpy.logspaceのおかげで対数的にcut()する可能性があることを知りましたが、平均値をビニングすることは無効であると思われています。非効率的な。

+0

どのようにカット作品見当もつかないが、線形オプションが機能するように、おそらく0の周りのデータセット全体を変換できますか? – Skirrebattie

+0

標準化またはスケーリングを意味しますか?以前と同じ結果が得られますか?正規分布のために非常に人気のあるカテゴリを持つ。 – st6mm

+0

私は以下の答えで意味したことを実行しようとしました。これがあなたの望むものなのかどうかは分かりませんが、あなたの目的のためにはうまくいくでしょう! – Skirrebattie

答えて

4

あなたは直線的にサイズが大きくビン作ることができます。

import numpy as np 

def make_progressive_bins(min_x, max_x, mean_x, num_bins=10): 
    x_rel_lim = max(mean_x - min_x, mean_x - max_x) 
    num_bins_half = num_bins // 2 
    bins_right = np.arange(0, num_bins_half + 1) 
    if num_bins % 2 == 1: 
     bins_right = bins_right + 0.5 
    bins_right = np.cumsum(bins_right) 
    bins = np.concatenate([-bins_right[bins_right > 0][::-1], bins_right]) 
    bins = bins * (float(x_rel_lim)/bins[-1]) + mean_x 
    return bins 

をそしてあなたが好きそれを使用することができます。

import numpy as np 
import matplotlib.pyplot as plt 

bins = make_progressive_bins(-20, 50, 10, 15) 
plt.bar(bins - 0.1, np.ones_like(bins), 0.2) 

enter image description here

1

達成したいスクリプトを作成しましたが、作成した切り抜きオブジェクトをヒストグラムに変換してどのようにしたいかを確認する方法がわからないので、確認して教えてください私はそれが動作する場合:)

# Make normally distributed price with mean 50. 
df = pd.DataFrame(data=np.random.normal(50, size=1000), columns=['price']) 
df.hist(bins=30) 

num_bins = 100 

# I used a square function to distribute the bins more around 0 and 
# less at the outskirts of the range. 
shape_func = lambda x: x**2 

bin_loc = [shape_func(i) for i in range(num_bins//2)] 
mirrored_bin_loc = [-x for x in bin_loc[::-1]] 
bin_loc = mirrored_bin_loc + bin_loc[1:] 

# Rescale and translate bins 
data_mean = df.price.mean() 
data_range = df.price.max() - df.price.min() 
final_bin_loc = [(x + data_mean)/(data_range * num_bins) for x in bin_loc] 

# display(final_bin_loc) 
binned = pd.cut(df.price, bin_loc) 
+0

同じことをしているようですが、df.column.min()の反対側にある負の値(値)を削除して、0の周りではなく平均の周りに中央の場所を置きます。 – st6mm