滚动加权移动平均线熊猫



我已经搜索了stackoverflow,但我找不到适合我的确切内容。

我正在计算滚动窗口的加权移动平均线。

等式为:

#weighted average temp with smoothing factor, a
#T_w = sum[k=1,24](a^(k-1)*T(t-k)) / sum[k=1,24]a^(k-1)

看起来很容易,但我需要将此平均值应用于滚动窗口。 我可以做滚动平均值(简单移动平均线(:

T_ = pd.DataFrame()
T_ = temps['T'].rolling(window=24).mean()

但是现在我只想对我平均的窗口应用权重。 Python的.ewm((并没有削减芥末,因为我希望权重只适用于我正在"滚动"的窗口。

我发现了一些似乎可以工作但组件失败的片段:

from functools import partial
window = 13
alpha = 1-ln(2)/3    # This is ewma's decay factor.
weights = list(reversed([(1-alpha)**n for n in range(window)]))
ewma = partial(average, weights=weight)
rolling_average = series.rolling(window).apply(ewma)

在这里,我遇到的问题是 partial(( 如何调用 average(( - 这是在这里介绍的 - 在熊猫数据帧上创建一个滚动的自定义 EWMA - 但我还不能评论(newb(,我不知道从哪里拿这个。

我已经实施了另一个解决方案,但它并没有完全满足我的需求:

alpha = 0.1    # This is my smoothing parameter
weights = list(reversed([(1-alpha)**n for n in range(window)]))
def f(w):
def g(x):
return (w*x).mean()
return g
T_ = pd.DataFrame()
T_ = temps['T'].rolling(window=24).apply(f(weights))

基于此处提出的解决方案:使用熊猫滚动法计算加权移动平均线 这种方法的问题在于它计算平均值,而我实际上需要这样的东西:

return (w*x).sum() / w.sum()

但这行不通,因为

AttributeError: 'list' object has no attribute 'sum'

如何计算具有指定窗口(此处为过去 24 小时(和指定平滑参数 a(仅适用于过去 24 小时(的滚动加权移动平均线?

与其return (w*x).sum() / w.sum(),不如尝试sum(w*x) / sum(w)。这至少会让你通过AttributeError

sum是一个内置的 Python,它将处理任何可以求和的可迭代持有对象(即可以与+一起添加的添加对象(。这些对象的例子包括intfloat等。

您可以在.apply 函数中设置 raw=True。 它使输入为 ndarray。 然后,您可以将其与归一化权重相乘:temps.rolling(24, axis=1).apply(lambda x: np.sum(x * w), raw=True)

最新更新