我的代码中曾经有一个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
方法。如果只是做一个简单的加权平均,就用这个。