我的代码中曾经有一个pd.rolling_窗口(s,window=np.array(l),…),而使用的是0.17。
新的系列.rolling(window,win_type)现在不支持window上的int以外的任何内容,win_type仅限于一组固定的形状。
如何将旧的自定义滚动窗口平均值迁移到0.19?
谢谢

最佳答案

它似乎失去了自定义窗口功能。幸运的是,它仍然保留其Rolling方法。
如果您想要一个特殊的窗口平均值,一种方法是在Rolling.apply方法中取任意规格化数组(元素和=1)和numpy.correlate(这只是数组乘法和和的组合):

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({'a':[0,1,0,0,0,0],'b':[0,0,0,1,0,0]})
>>> print df
   a  b
0  0  0
1  1  0
2  0  0
3  0  1
4  0  0
5  0  0
>>> my_array = np.array([1,2,3])
>>> # Below implements a weighted mean
>>> df.rolling(len(my_array)).apply(lambda column: np.correlate(column,my_array/sum(my_array)))
          a         b
0       NaN       NaN
1       NaN       NaN
2  0.333333  0.000000
3  0.166667  0.500000
4  0.000000  0.333333
5  0.000000  0.166667
>>> # Same thing, but thanks to '[0]' we can have min_periods < len(my_array)
>>> df.rolling(len(my_array),min_periods=1).apply(lambda column: np.correlate(column,my_array/sum(my_array))[0])
          a         b
0  0.000000  0.000000
1  0.500000  0.000000
2  0.333333  0.000000
3  0.166667  0.500000
4  0.000000  0.333333
5  0.000000  0.166667

编辑:Numpy还有一个带有weight参数的.apply方法。如果只是做一个简单的加权平均,就用这个。

08-28 14:17