2017-09-26 51 views
0

我得到了2列数据框(体积和价格),并且我想根据volume列创建20个bin,并且数据量相等在每个垃圾箱里。每个bin中y值的python直方图与相同的数据数量(x)

I.e.如果我得到了音量= [1,6,8,2,6,9,3,6]和4个分档,我想将数据剪切到第一个分档:1:2,2:3:6,3:6:如图8所示,第四: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() 

但x轴返回我:阵列([0.9315,0.9315,0.9315,0.9315,0.9315])

此外,才有可能使用 '计数器' 计数数据的数目在每个区间?

+0

请问您可以将文本添加为​​文本吗?从图片复制数据并不容易。 –

+0

等一下,所以你想要用'x'填充直方图的高度,以反映平均的'y'值?这根本不是直方图,所以你不应该使用'hist'函数,它假设“直方图”的标准定义。也许只需计算'y'平均值并用plt.plot()调用 – Anonymous

+0

编辑的问题(日期= df)绘制数据。是的,我试图在plt.plot中的数据,但它的结果是一些边界/边缘是相同的,因此'切'功能不起作用 – bing

回答

1

根据x值对您的数据进行间接排序(volume),然后计算y数据的相同大小(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))。这会更快,但要求每个容器中的数据量完全相同。循环将处理最后一个仓与其他仓大小不同的情况。

+0

非常感谢您的帮助。你能否看到问题的更新部分,因为我想要计算体积的平均值,并将其绘制为x轴。然而,我在计算每个bin的平均值x时遇到了麻烦。 – bing

+0

@bing看起来您正在第一个for循环中使用'i',它尚未定义。您可以计算同一循环内的平均x值和y值。 – bnaecker

+0

非常感谢,但请问在这种情况下'argsort()'的功能是什么? – bing

相关问题