滚动加权移动平均 Pandas

3

我已经在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() -- 这个问题是在这里介绍的 - 在 pandas 数据框上创建一个滚动自定义 EWMA - 但我还不能发表评论(新手),而且我不知道该怎么做。

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

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

基于这里提出的解决方案:使用pandas Rolling方法计算加权移动平均值,但是这种方法的问题在于它只能计算平均值,而我需要的实际上是这样的:

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

但这样做不起作用,因为
AttributeError: 'list' object has no attribute 'sum'

我该如何计算一个具有指定窗口(这里是最近的24小时)和指定平滑参数a(仅应用于最近的24小时)的滚动加权移动平均值?


1
你有考虑过使用np.average()的权重属性吗? - gosuto
2个回答

5
而不是使用return (w*x).sum() / w.sum(),尝试使用sum(w*x) / sum(w)。至少这样可以避免AttributeError错误。 sum是Python内置函数,可以作用于任何可迭代对象,包括可以相加的对象(即可以使用+进行相加的对象),例如intfloat等。

1

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


根据pandas文档,“传递的函数将接收ndarray对象。如果您只是应用NumPy缩减函数,则可以实现更好的性能。” - Raisin

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