简体   繁体   English

用熊猫滚动法计算加权移动平均值

[英]Calculating weighted moving average using pandas Rolling method

I calculate simple moving average: 我计算简单的移动平均线:

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

Using the rolling function is it possible to calculate weighted moving average? 使用滚动函数可以计算加权移动平均值吗? As I read in the documentation , I think that I have to pass win_type parameter. 正如我在文档中看到的那样 ,我认为我必须传递win_type参数。 But I'm not sure which one I have to choose. 但我不确定我必须选择哪一个。

Here is a definition for weighted moving average. 这是加权移动平均线的定义

Thanks in advance, 提前致谢,

Yeah, that part of pandas really isn't very well documented. 是的,那部分大熊猫真的没有很好的记录。 I think you might have to use rolling.apply() if you aren't using one of the standard window types. 如果您不使用标准窗口类型之一,我认为您可能必须使用rolling.apply()。 I poked at it and got this to work: 我戳了戳它并让它工作:

>>> 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

I think that is correct. 我认为这是正确的。 The reason for the closure there is that the signature for rolling.apply is rolling.apply(func, *args, **kwargs) , so the weights get tuple-unpacked if you just send them to the function directly, unless you send them as a 1-tuple (wts,) , but that's weird. 关闭的原因是rolling.apply(func, *args, **kwargs)的签名是rolling.apply(func, *args, **kwargs) ,所以如果你只是直接将它们发送到函数,权重会得到元组解压缩,除非你发送它们作为1元组(wts,) ,但这很奇怪。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM