【问题标题】:Python Numpy iteration improvements for Exponential smoothing (working code) for Github pull request用于 Github 拉取请求的指数平滑(工作代码)的 Python Numpy 迭代改进
【发布时间】:2014-01-22 01:42:55
【问题描述】:

我在 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 request 上,并附有源代码。

【问题讨论】:

    标签: python numpy pandas time-series


    【解决方案1】:

    首先,这 4 种情况下的大部分代码都是相同的。实际上很难找出哪些部分不同。这是难以发现的错误的秘诀。从条件句中拉出相同的部分; if/else 应该只处理实际发生变化的部分。

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

    【讨论】:

    • 我正在寻找一种矢量化方式来执行此操作,但我在堆栈上找到的最接近的内容显示问题无法解决,因为 2 个值更新取决于 i 术语请参阅:stackoverflow.com/questions/20809850/…跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2017-05-08
    相关资源
    最近更新 更多