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

针对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':

我在Github上加入了Statsmodel指数平滑,并想知道是否有一种改进此循环的好方法。到目前为止,我有工作代码,并希望解决的纠结。它处理指数平滑模型的变化

有没有一个好办法使这个循环更有效

   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项,请参见: