我在Github上为Statsmodel指数平滑放了一个pull request,并想知道是否有一种改善这个循环的好方法。到目前为止,我有工作代码,想要解决问题。它处理指数平滑模型的变化。
有没有一种方法可以使这个循环更有效率?
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]
如果您想要测试完整代码,我也会在Code Review上发布。请帮助建议改进。我已经编程了几个月所以任何帮助将不胜感激。代码的文档也在Github的pull请求中有源代码。
答案 0 :(得分:0)
首先,4个案例中的每个案例中的大部分代码都是相同的。实际上很难找出哪些部分不同。这是一个难以发现的错误的秘诀。将相同的部件拉出条件; if / else只应处理实际更改的部分。
其次,您正在与NumPy合作。你根本不应该循环;你应该找到一种方法来使用矢量化操作来执行你的任务。 tutorial显示了矢量化操作的一些基础知识。矢量化代码比使用显式循环的代码更短,效率更高。