【问题标题】:rolling weighted moving average pandas滚动加权移动平均熊猫
【发布时间】:2019-02-13 20:29:09
【问题描述】:

我已经搜索了 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() 没有减少芥末,因为我希望权重仅适用于我“滚动”过的窗口。

我发现了一些 sn-ps,它们似乎可以工作,但组件失败:

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() - 这是在这里介绍的 - Create a rolling custom EWMA on a pandas dataframe - 但我还不能评论(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))

基于此处提出的解决方案:Calculating weighted moving average using pandas Rolling method 这种方法的问题在于它计算平均值,而我实际上需要这样的东西:

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

但这不起作用,因为

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

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

【问题讨论】:

标签: python pandas


【解决方案1】:

试试sum(w*x) / sum(w),而不是return (w*x).sum() / w.sum()。这至少会让您通过AttributeError

sum 是一个 Python 内置函数,它适用于任何可以求和的可迭代持有对象(即可以与 + 一起添加的对象)。这些对象的示例包括intfloat 等。

【讨论】:

  • 谢谢。回来说我也发现了。德普。
  • 很高兴您找到了解决方案!如果您觉得这很有用,介意点赞吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2017-02-24
    • 2018-10-01
    • 1970-01-01
    • 2019-07-27
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    相关资源
    最近更新 更多