[英]Calculate a rolling window weighted average on a Pandas column
我是python的新手,並且一直在嘗試計算熊貓數據框中各行的一些簡單滾動加權平均值。 我有一個觀測數據df
和權重w
的數據幀。 我創建了一個新的數據框,以容納這兩套值之間的內積dot
。
由於w
的尺寸較小,因此我使用了for循環來計算與w
的長度相等的前行的加權平均值。
更清楚地,我的設置如下:
import pandas as pd
df = pd.DataFrame([0,1,2,3,4,5,6,7,8], index = range(0,9))
w = pd.DataFrame([0.1,0.25,0.5], index = range(0,3))
dot = pd.DataFrame(0, columns = ['dot'], index = df.index)
for i in range(0,len(df)):
df.loc[i] = sum(df.iloc[max(1,(i-3)):i].values * w.iloc[-min(3,(i-1)):4].values)
我希望結果如下(即,當i = 4
)
dot.loc[4] = sum(df.iloc[max(1,(4-3)):4].values * w.iloc[-min(3,(4-1)):4].values)
print dot.loc[4] #2.1
但是,當運行上面的for循環時,我收到錯誤消息:
ValueError: operands could not be broadcast together with shapes (0,1) (2,1)
這就是我感到困惑的地方-我認為這一定與我將i
稱為iloc
,因為手動計算時不會收到形狀錯誤,如上面的示例4
所示。 但是,在查看其他示例和文檔時,我看不出為什么會這樣。感謝您的幫助。
您的第一個問題是,您試圖將兩個不同大小的數組相乘。 例如,當i=0
時,for循環的不同部分將返回
df.iloc[max(1,(0-3)):0].values.shape
# (0,1)
w.iloc[-min(3,(0-1)):4].values.shape
# (2,1)
這正是您得到的錯誤。 我想使數組可乘的最簡單方法是使用concatenation將數據框填充為前導零。
df2 = pd.concat([pd.Series([0,0]),df], ignore_index=True)
df2
0
0 0
1 0
2 0
3 1
4 2
5 3
6 4
7 5
8 6
9 7
10 8
現在,您可以使用for循環了(稍作調整):
for i in range(len(df)):
dot.loc[i] = sum(df2.iloc[max(0,(i)):i+3].values * w.values)
更好的方法可能是JohnE 建議的方法,使用滾動功能並應用內置到pandas中的函數,從而擺脫了for循環
import numpy as np
df2.rolling(3,min_periods=3).apply(lambda x: np.dot(x,w))
0
0 NaN
1 NaN
2 0.00
3 0.50
4 1.25
5 2.10
6 2.95
7 3.80
8 4.65
9 5.50
10 6.35
df2.rolling(3,min_periods=3).apply(lambda x: np.dot(x,w)).drop([0,1]).reset_index(drop=True)
0
0 0.00
1 0.50
2 1.25
3 2.10
4 2.95
5 3.80
6 4.65
7 5.50
8 6.35
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.