使用 pandas Rolling 方法计算加权移动平均值
Posted
技术标签:
【中文标题】使用 pandas Rolling 方法计算加权移动平均值【英文标题】:Calculating weighted moving average using pandas Rolling method 【发布时间】:2017-02-06 03:44:33 【问题描述】:我计算简单移动平均线:
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
使用滚动函数可以计算加权移动平均吗?当我阅读in the documentation 时,我认为我必须传递 win_type 参数。但我不确定我必须选择哪一个。
这里是一个definition 加权移动平均线。
提前致谢,
【问题讨论】:
看看np.average
,它支持提供权重。
我会在Github 上提出问题。该文档确实具有误导性。 It suggests 可以传递 custom weights,但它没有解释如何做到这一点,并且存储库中没有这样做的示例。跨度>
【参考方案1】:
是的,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)
,所以如果你直接将它们发送到函数,权重就会被元组解包,除非你将它们作为一个1元组发送(wts,)
,但是这很奇怪。
【讨论】:
以上是关于使用 pandas Rolling 方法计算加权移动平均值的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动有效数值计数(rolling count)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动均值(rolling mean)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动最小值(rolling minimum)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动最大值(rolling maximum)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动中位数(rolling median)自定义指定滚动窗口的大小(window size)
pandas使用rolling函数计算dataframe指定数据列特定窗口下的滚动加和值(rolling sum)自定义指定滚动窗口的大小(window size)