gpt4 book ai didi

python - 计算 Pandas 列上的滚动窗口加权平均值

转载 作者:行者123 更新时间:2023-12-01 02:23:13 30 4
gpt4 key购买 nike

我对 python 比较陌生,并且一直在尝试计算 pandas 数据框中各行的一些简单的滚动加权平均值。我有一个观测值 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:操作数无法与形状 (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 suggested 的方式,使用rollingapply 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

您还可以drop前两行填充和 reset the index

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

关于python - 计算 Pandas 列上的滚动窗口加权平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47732567/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com