2017-09-26 220 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

相關問題