【问题标题】:Seasonal Decomposition of Time Series by Loess with PythonLoess 用 Python 对时间序列进行季节性分解
【发布时间】:2014-12-15 17:25:15
【问题描述】:

我正在尝试用 Python 做 R 上的 STL 函数。

R 命令是

fit <- stl(elecequip, s.window=5)
plot(fit)

如何在 Python 中做到这一点?我调查了 statmodels.tsa 有一些时间序列分析功能,但我可以在文档中专门找到“黄土对时间序列的季节性分解”。类似地,在 Python.org 上有一个名为 timeseries 0.5.0 的库,但它没有文档,而且它的主站点往下看。我知道 rpy2 有一个使用包装器的选项,但我不知道如何使用包装器。

谢谢。

【问题讨论】:

    标签: python r time-series


    【解决方案1】:

    我遇到了类似的问题,正在努力寻找最佳的前进道路。

    Here is a github repo for an STL decomposition based on the Loess procedure。它基于this paper 提供的原始fortran 代码。它实际上只是原始 Fortran 代码的 Python 包装器,因此您知道它可能运行良好且没有错误。

    如果您想要更以 Python 为中心的东西,并且愿意使用稍微简单的分解例程,StatsModels 有一个:

    尝试将您的数据移动到 Pandas DataFrame 中,然后调用 StatsModels tsa.seasonal_decompose。见following example

    import statsmodels.api as sm
    
    dta = sm.datasets.co2.load_pandas().data
    # deal with missing values. see issue
    dta.co2.interpolate(inplace=True)
    
    res = sm.tsa.seasonal_decompose(dta.co2)
    resplot = res.plot()
    

    然后您可以从以下位置恢复分解的各个组件:

    res.resid
    res.seasonal
    res.trend
    

    我希望这会有所帮助!

    【讨论】:

    • 引用 StatsModels 0.6.0 版本说明:“我们添加了与 R 的分解相同的简单季节性分解工具。”所以考虑一下,这可能还没有准备好生产。
    • 我认为分解不如基于模型的方法或 Loess 程序强大,但它似乎已经准备好生产,例如没有报告错误,它似乎适用于我执行的测试。您还看到什么让您说它还没有准备好生产?
    • “朴素季节性分解”就是这样,而且,这意味着很少(朴素贝叶斯,是朴素的,但如果数据符合假设,则效果很好)。还引用代码中的 cmets “这是一种幼稚的分解。应该首选更复杂的方法。”因此,如果它对您很有效,那很好,但请记住您使用的是什么。
    • 按照 OP 的要求,我确实通过 Loess 程序链接到季节性分解,这比 Naive Seasonal Decomposition 更复杂。但由于这不是即插即用的,我还包括了 Naive Seasonal Decomposition,因为它包含在 StatsModels 中。不要太拘泥于算法的名称,无论它们是否包含“naive”这个词,因为这并不能反映它的生产价值,只是它的多功能性和设计算法时使用的假设。是的,我同意基于模型的方法更加通用。
    • 我想在使用seasonal_decompose时检查残差并得到所有NaN,而使用R时没有发生这种情况......
    【解决方案2】:

    你也可以使用 rpy2 从 python 调用 R

    from rpy2.robjects import r
    def decompose(series, frequency, s_window, **kwargs):
        df = pd.DataFrame()
        df['date'] = series.index
        s = [x for x in series.values]
        length = len(series)
        s = r.ts(s, frequency=frequency)
        decomposed = [x for x in r.stl(s, s_window, **kwargs).rx2('time.series')]
        df['observed'] = series.values
        df['trend'] = decomposed[length:2*length]
        df['seasonal'] = decomposed[0:length]
        df['residual'] = decomposed[2*length:3*length]
        return df
    

    上述函数假定您的系列具有日期时间索引。它返回一个包含各个组件的数据框,然后您可以使用您最喜欢的图形库对其进行图形化。

    你可以传递stl seenhere的参数,但是将任何句点更改为下划线,例如上面函数中的位置参数是s_window,但在上面的链接中它是s.window。另外,我在this 存储库上找到了上面的一些代码。

    【讨论】:

      【解决方案3】:

      另一个 python 选项是seasonal 包(PyPIgithub)。它类似于 StatsModelsseasonal_decompose 并且还将估计您的数据的周期性。

      【讨论】:

        猜你喜欢
        • 2018-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 2019-01-16
        • 2013-04-18
        相关资源
        最近更新 更多