针对Github pull请求的指数平滑(工作代码)的Python Numpy迭代改进

时间:2014-01-04 10:26:41

标签: python numpy pandas time-series

我在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请求中有源代码。

1 个答案:

答案 0 :(得分:0)

首先,4个案例中的每个案例中的大部分代码都是相同的。实际上很难找出哪些部分不同。这是一个难以发现的错误的秘诀。将相同的部件拉出条件; if / else只应处理实际更改的部分。

其次,您正在与NumPy合作。你根本不应该循环;你应该找到一种方法来使用矢量化操作来执行你的任务。 tutorial显示了矢量化操作的一些基础知识。矢量化代码比使用显式循环的代码更短,效率更高。