我得到了一个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]}
我的代码:
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])
此外,是否可以使用“计数器”来计算每个间隔中的数据数量?
答案 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的大小不同时,循环将处理这种情况。