我已经搜索了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,它将处理任何可以求和的可迭代持有对象(即可以与+
一起添加的添加对象(。这些对象的例子包括int
、float
等。
您可以在.apply 函数中设置 raw=True。 它使输入为 ndarray。 然后,您可以将其与归一化权重相乘:temps.rolling(24, axis=1).apply(lambda x: np.sum(x * w), raw=True)