y值的python直方图,每个bin中具有相等数量的数据(x)

时间:2017-09-26 21:38:27

标签: python pandas plot histogram

我得到了一个2列数据框(数量和价格),我想根据音量列创建20个分档,每个分箱中的数据量相等。

即。如果我得到音量= [1,6,8,2,6,9,3,6]和4个箱子,我想将数据切换到第1箱:1:2,第2:3:6,第3:6: 8,4:8:9

然后绘制平均相应y值的直方图

我的数据:

df = pd.DataFrame{'Volume_norm' : [0.92, 2.31, 0.92, 0.018, 0.0454, 0.43, 0.43,0.943,0.543,0.543,0.43] , 'Price' : [2, 4, 5, 1, 5, 1, 2, 4, 2, 3, 6]}

enter image description here

我的代码:

    x = sorted(FilteredTrade_buy['Volume_norm'])
bins=x[0::int(len(x)/50)]
n, bins, patches = plt.hist(x, bins=bins)
plt.show()

只给出了x(体积)而不是平均y价格

的总和

===============更新代码==============

df = pd.DataFrame({'Volume_norm' : [0.92,2.31,0.92,0.018,0.0454,0.43,0.43,0.943,0.543,0.543,0.43], 
                   'Price' : [2,4,5,1,5,1,2,4,2,3,6]})

x = df['Volume_norm']
y = df['Price']
nbins = 5
binsize = x.size // nbins
indices = x.argsort()
means = np.zeros((nbins,))
xaxis = np.zeros((nbins,))
for k in range(nbins):
    xaxis[k] = x[indices[i * binsize : (i + 1) * binsize]].mean()
for i in range(nbins):
    means[i] = y[indices[i * binsize : (i + 1) * binsize]].mean()
plt.loglog(xaxis,means,'r-')
plt.show()

但xaxis返回我:array([0.9315,0.9316,0.9316,0.9316,0.9316])

此外,是否可以使用“计数器”来计算每个间隔中的数据数量?

1 个答案:

答案 0 :(得分:1)

根据x值(volume)对数据进行间接排序,然后计算y数据大小相同的每个连续bin的平均值(price)。

nbins = 20
binsize = volume.size // nbins
indices = volume.argsort()
means = np.zeros((nbins,))
for i in range(nbins):
    means[i] = price[indices[i * binsize : (i + 1) * binsize]].mean()

您可以重塑price数组,然后沿轴计算平均值(即price[indices].reshape(nbins, -1).mean(axis=-1))。这会更快,但要求每个bin中的数据量完全相同。当最后一个bin与其他bin的大小不同时,循环将处理这种情况。