簡體   English   中英

計算熊貓列上的滾動窗口加權平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM