Python中的季节性趋势Loess方法用于时间序列

3

有没有基于Python的程序可以使用STL(季节性-趋势-Loess)方法分解时间序列?

我看到了一个包装程序调用R中的stl函数的参考资料,但从环境设置角度来看,我发现这种方法不稳定且繁琐(需要同时安装Python和R)。此外,该链接已经过时了4年。

有人能指出一些更近期的方法吗?例如sklearnspicy等。

4个回答

4
我没有尝试过STLDecompose,但我看了一眼它,我相信它使用了通用的loess平滑器。这很难做到正确,并且往往效率低下。请参阅已废弃的STL-Java repopyloess提供了一个Python包装器,用于与原始R版本使用相同的基础Fortran交互。你绝对不需要通过桥接到R来获得相同的功能!该软件包目前没有得到积极维护,我有时在某些平台上遇到构建问题(因此在此处进行fork)。但是,一旦构建完成,它确实可以工作,并且是您可能找到的最快的软件包。我曾经想过修改它以包括一些新功能,但是无法使自己修改Fortran(这是预处理的RATFOR-类似汇编语言的Fortran),我找不到任何RATFOR预处理器。
我编写了一个本地Java实现,stl-decomp-4j,可以使用pyjnius从Python中调用。这开始是对原始Fortran的直接移植,重构为更现代的编程风格。然后,我扩展了它以允许二次loess插值,并支持季节性分量的后分解平滑,这些功能在原始论文中被描述,但没有放入Fortran / R实现中。 (它们显然在S-plus实现中,但我们很少有机会使用它。)使其高效的关键在于,当点等距时,loess平滑简化,并且通过修改用于插值的权重来执行逐点平滑。 stl-decomp-4j示例包括一个Jupyter笔记本演示如何从Python调用此软件包。我可能应该将其正式化为Python软件包,但没有时间。非常愿意接受pull请求。 ;-)
我希望看到这种方法直接移植到Python / numpy。我“如果有一些空闲时间”列表上的另一件事。

1
谢谢!我了解到的一件事是,STLDecompose(Python)相对简单。例如,它不喜欢不连续的数据集(缺失数据点)。这是STL方法的一般特征还是只是一个不太全面的技术解决方案? - Toly
1
@Toly - 标准的STL实现假定数据间隔规则且没有缺失数据点。Hafen的R语言stlplus包可以处理缺失数据,前提是有足够的时间段可用。我想扩展stl-decomp-4j以实现此功能,但目前还没有时间。我相信这种方法只是依赖于一个事实,即最初可以将数据点分配为0的权重,但我还没有详细了解过。 - sfjac

4

这里,您可以找到使用LOESS(STL)进行季节性-趋势分解的示例,它来自于statsmodels

基本上,它的工作原理如下:

from statsmodels.tsa.seasonal import STL
stl = STL(TimeSeries, seasonal=13)
res = stl.fit()
fig = res.plot()

STLDecomposition


2
这是最新的,也可能是最好的答案。 - gsamaras

3

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接