我搜索了 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)
Run Code Online (Sandbox Code Playgroud)
看起来很简单,但我需要将此平均值应用于滚动窗口。我可以做滚动平均值(简单移动平均值):
T_ = pd.DataFrame()
T_ = temps['T'].rolling(window=24).mean()
Run Code Online (Sandbox Code Playgroud)
但现在我只想对我要平均的窗口应用权重。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)
Run Code Online (Sandbox Code Playgroud)
在这里,我遇到的问题是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))
Run Code Online (Sandbox Code Playgroud)
基于这里提出的解决方案:使用 pandas 滚动方法计算加权移动平均值 这种方法的问题是它计算平均值,而我实际上需要这样的东西:
return (w*x).sum() / w.sum()
Run Code Online (Sandbox Code Playgroud)
但这是行不通的,因为
AttributeError: 'list' object has no attribute 'sum'
Run Code Online (Sandbox Code Playgroud)
如何计算具有指定窗口(此处为过去 24 小时)和指定平滑参数 a(仅适用于过去 24 小时)的滚动加权移动平均线?
而不是return (w*x).sum() / w.sum(),尝试sum(w*x) / sum(w)。AttributeError这至少会让你过去。
sum是一个Python内置函数,适用于任何可迭代的可求和的持有对象(即可以与 一起添加的添加对象+)。这些对象的示例包括int、float等。