有谁知道是否有基于 Python 的程序来利用 STL(Seasonal-Trend-Loess)方法分解时间序列?
我看到了对在 R 中调用该函数的包装程序的引用stl
,但我发现从环境设置的角度来看(Python 和 R 一起),它不稳定且繁琐。此外,链接是 4 岁。
有人可以指出更新的内容(例如sklearn
,spicy
等)吗?
有谁知道是否有基于 Python 的程序来利用 STL(Seasonal-Trend-Loess)方法分解时间序列?
我看到了对在 R 中调用该函数的包装程序的引用stl
,但我发现从环境设置的角度来看(Python 和 R 一起),它不稳定且繁琐。此外,链接是 4 岁。
有人可以指出更新的内容(例如sklearn
,spicy
等)吗?
我没有尝试过STLDecompose
,但我看了一眼,我相信它使用了一种通用的黄土平滑剂。这很难做到正确,而且往往效率低下。请参阅已失效的STL-Java 存储库。
该pyloess
包为原始 R 版本使用的相同底层 Fortran 提供了一个 python 包装器。你绝对不需要通过 R 的桥来获得同样的功能!这个包没有得到积极的维护,我偶尔在一些平台上构建它时遇到了麻烦(因此这里是 fork)。但是一旦建成,它就可以工作,并且是您可能找到的最快的。我一直很想修改它以包含一些新功能,但就是无法让自己修改 Fortran(这是预处理的 RATFOR - 非常像 Fortran 的汇编语言,我在任何地方都找不到 RATFOR 预处理器)。
我编写了一个本机 Java 实现,stl-decomp-4j
可以使用pyjnius
包从 python 调用。这开始是原始 Fortran 的直接移植,重构为更现代的编程风格。然后,我对其进行了扩展,以允许二次黄土插值并支持季节性分量的分解后平滑,这些特征在原始论文中进行了描述,但并未放入 Fortran/R 实现中。(它们显然在S-plus
实现中,但我们中很少有人能够使用它。)提高效率的关键是,当点等距时,黄土平滑简化了,并且通过简单地修改权重来完成逐点平滑那是用来做插值的。
这些stl-decomp-4j
示例包括一个 Jupyter 笔记本,演示了如何从 python 调用此包。我可能应该将其正式化为一个 python 包,但还没有时间。非常愿意接受拉取请求。;-)
我很想看到这种方法直接移植到 python/numpy。我的“如果我有空闲时间”清单上的另一件事。
RSTL 是 R 的 STL 的 Python 端口:https ://github.com/ericist/rstl 。根据作者的说法,它工作得很好,只是它比 R 的 STL 慢 3~5 倍。
如果你只是想得到lowess趋势线,你可以使用Statsmodels的lowess函数 https://www.statsmodels.org/dev/generated/statsmodels.nonparametric.smoothers_lowess.lowess.html。
Here you can find an example of Seasonal-Trend decomposition using LOESS (STL), from statsmodels
.
Basicaly it works this way:
from statsmodels.tsa.seasonal import STL
stl = STL(TimeSeries, seasonal=13)
res = stl.fit()
fig = res.plot()