Python 基于窗口的熊猫加权平均

Python 基于窗口的熊猫加权平均,python,pandas,Python,Pandas,我正在尝试对两列进行基于窗口的加权平均 例如,如果我有值列“a”和权重列“b” 尾随窗口为2(尽管我喜欢使用可变窗口长度) 我的第三个加权平均值列应该是“c”,其中没有足够的完整加权平均值之前数据的行是nan c 1: nan 2: (1 * 2 + 2 * 3) / (2 + 3) = 1.8 3: (2 * 3 + 3 * 4) / (3 + 4) = 2.57 对于窗口为2的特殊情况,您可以使用prod和shift s = df.prod(1) (s + s.shift()) /

我正在尝试对两列进行基于窗口的加权平均

例如,如果我有值列“a”和权重列“b”

尾随窗口为2(尽管我喜欢使用可变窗口长度)

我的第三个加权平均值列应该是“c”,其中没有足够的完整加权平均值之前数据的行是nan

   c
1: nan
2: (1 * 2 + 2 * 3) / (2 + 3) = 1.8
3: (2 * 3 + 3 * 4) / (3 + 4) = 2.57

对于窗口为2的特殊情况,您可以使用
prod
shift

s = df.prod(1)
(s + s.shift()) / (df.b + df.b.shift())

Out[189]:
1         NaN
2    1.600000
3    2.571429
dtype: float64
在样本
df2
上:

       a      b
0  73.78  51.46
1  73.79  27.84
2  73.79  34.35

s = df2.prod(1)
(s + s.shift()) / (df2.b + df2.b.shift())

Out[193]:
0          NaN
1    73.783511
2    73.790000
dtype: float64

这种方法仍然适用于可变窗口长度。对于可变窗口长度,您需要额外的listcomp和
sum

试用上面的示例
df2

s = df2.prod(1)

m = 2  #window length 2
sum([s.shift(x) for x in range(m)]) / sum([df2.b.shift(x) for x in range(m)])

Out[214]:
0          NaN
1    73.783511
2    73.790000
dtype: float64
关于窗长3

m = 3  #window length 3
sum([s.shift(x) for x in range(m)]) / sum([df2.b.shift(x) for x in range(m)])

Out[215]:
0          NaN
1          NaN
2    73.785472
dtype: float64

我编辑了我的解决方案来处理可变窗口长度:)我将不得不做更多的测试,但我相信这是我想要的
m = 3  #window length 3
sum([s.shift(x) for x in range(m)]) / sum([df2.b.shift(x) for x in range(m)])

Out[215]:
0          NaN
1          NaN
2    73.785472
dtype: float64