使用 pandas 的 Rolling 方法计算加权移动平均数

4
我计算简单移动平均:
def sma(data_frame, length=15):
    # TODO: Be sure about default values of length.
    smas = data_frame.Close.rolling(window=length, center=False).mean()
    return smas

使用rolling函数可以计算加权移动平均吗?阅读文档,我认为必须传递win_type参数。但我不确定该选择哪一个。
这里是加权移动平均的定义
提前感谢。

2
请查看np.average,它支持提供权重。 - Nickil Maveli
3
我会在Github上提出一个问题。文件确实有误导性。它建议可以传递自定义权重,但没有解释如何这样做,并且存储库中没有示例可供参考。 - Daniel
1个回答

7

是的,pandas那部分确实没有很好的文档说明。如果你不使用标准窗口类型,我认为你可能需要使用rolling.apply()。我尝试过并成功了:

>>> import numpy as np
>>> import pandas as pd
>>> d = pd.DataFrame({'a':range(10), 'b':np.random.random(size=10)})
>>> d.b = d.b.round(2)
>>> d
   a     b
0  0  0.28
1  1  0.70
2  2  0.28
3  3  0.99
4  4  0.72
5  5  0.43
6  6  0.71
7  7  0.75
8  8  0.61
9  9  0.14
>>> wts = np.array([-1, 2])
>>> def f(w):                        
        def g(x):
            return (w*x).mean()
        return g
>>> d.rolling(window=2).apply(f(wts))
     a      b
0  NaN    NaN
1  1.0  0.560
2  1.5 -0.070
3  2.0  0.850
4  2.5  0.225
5  3.0  0.070
6  3.5  0.495 
7  4.0  0.395
8  4.5  0.235
9  5.0 -0.165

我认为这是正确的。关闭的原因在于rolling.apply的签名是rolling.apply(func, *args, **kwargs),如果你直接将weights发送到函数中,它们会被解压成元组,除非你将它们作为1-tuple (wts,)发送,但那很奇怪。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接