针对Github拉请求的指数平滑(工作代码)的Python Numpy迭代改进
我在Github上加入了Statsmodel指数平滑,并想知道是否有一种改进此循环的好方法。到目前为止,我有工作代码,并希望解决的纠结。它处理指数平滑模型的变化 有没有一个好办法使这个循环更有效针对Github拉请求的指数平滑(工作代码)的Python Numpy迭代改进,python,numpy,pandas,time-series,Python,Numpy,Pandas,Time Series,我在Github上加入了Statsmodel指数平滑,并想知道是否有一种改进此循环的好方法。到目前为止,我有工作代码,并希望解决的纠结。它处理指数平滑模型的变化 有没有一个好办法使这个循环更有效 for i in range(ylen): s = sdata[i] b = bdata[i] #handles multiplicative seasons if season == 'multiplicative':
for i in range(ylen):
s = sdata[i]
b = bdata[i]
#handles multiplicative seasons
if season == 'multiplicative':
if trend == 'multiplicative':
sdata[i + 1] = alpha * (y[i + 2] / cdata[i]) + (1 - alpha) * s * (b**damp)
bdata[i + 1] = gamma * (sdata[i + 1] / s) + (1 - gamma) * (b ** damp)
cdata[i + cycle] = delta * (y[i + 2] / sdata[i + 1]) + (1 - delta) * cdata[i]
#handles additive models
else:
sdata[i + 1] = alpha * (y[i + 2] / cdata[i]) + (1 - alpha) * (s + damp * b)
bdata[i + 1] = gamma * (sdata[i + 1] - s) + (1 - gamma) * damp * b
cdata[i + cycle] = delta * (y[i + 2] / sdata[i + 1]) + (1 - delta) * cdata[i]
else:
if trend == 'multiplicative':
sdata[i + 1] = alpha * (y[i + 2] - cdata[i]) + (1 - alpha) * s * (b**damp)
bdata[i + 1] = gamma * (sdata[i + 1] / s) + (1 - gamma) * (b ** damp)
cdata[i + cycle] = delta * (y[i + 2] - sdata[i + 1]) + (1 - delta) * cdata[i]
#handles additive models
else:
sdata[i + 1] = alpha * (y[i + 2] - cdata[i]) + (1 - alpha) * (s + damp * b)
bdata[i + 1] = gamma * (sdata[i + 1] - s) + (1 - gamma) * damp * b
cdata[i + cycle] = delta * (y[i + 2] - sdata[i + 1]) + (1 - delta) * cdata[i]
如果您想测试完整的代码,我还发布了。请帮助提出改进建议。我已经编程只有几个月了,所以任何帮助都将不胜感激。代码的文档也在Github的pull请求中,有源代码。首先,4种情况中的大多数代码都是相同的。实际上很难分辨出哪些部分是不同的。这是一个很难找到的错误的食谱。把相同的部分从条件句中去掉;if/else应仅处理实际更改的零件
第二,你和NumPy一起工作。你根本不应该循环;您应该找到一种使用矢量化操作来执行任务的方法。显示了矢量化操作的一些基础知识。矢量化代码比使用显式循环的代码更短、效率更高。我正在寻找一种矢量化方法来实现这一点,但我在堆栈上找到的最接近的东西表明问题无法解决,因为2个值的更新依赖于I项,请参见: