Statsmodels季节性分解 - 它有哪些天真的地方?

13

最近在使用Python处理时间序列,用到了sm.tsa.seasonal_decompose函数。在文档中,它被介绍为:

我们添加了一个简单的季节性分解工具,类似于R语言中的decompose函数。

以下是来自文档的代码及其输出:

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)
res.plot()

季节性分解图

他们说这很“天真”,但是没有说明有什么问题。有人知道吗?


这个并没有什么问题。我想它之所以被称为“naive(天真)”,是因为它使用简单的卷积和平均方法来分离趋势和季节性结构,即它不是一种花哨的算法。 - Josef
谢谢,@user333700,我想知道R的 decompose 是否也是“naive”,以及何时需要使用高级方法。通过 .seasonal_decompose 对我的数据进行处理的印象是,这可能是你通常所需的全部内容。 - cardamom
1
可能性之一是过于“天真”,即不能适当地捕捉数据的特征,例如由于趋势或模式中断而导致的季节性变化。有时可以通过Box-Cox或类似的转换来消除这些变化。宏观经济数据(例如通过X11)的季节性调整也考虑到了假期和类似的日历效应的变化。 - Josef
2个回答

23
我进行了一些(有点天真的)研究,根据参考资料,看起来StatsModels使用经典的移动平均方法来检测趋势并应用季节性分解(您可以在此处查看更多信息,特别是关于移动平均经典分解)。
然而,其他高级的季节性分解技术也可用,例如STL分解,它也有一些Python实现。(更新-2019年11月4日如评论中@squarespiral指出的那样,这些实现似乎已合并到StatsModels的主分支中)。
在上述链接中,您可以找到有关每种提议方法的优缺点的完整参考信息。
希望这有所帮助!

3
“Python实现的STL分解”已经被合并到statsmodels中:https://github.com/statsmodels/statsmodels/issues/4044 - 函数的文档在这里:https://www.statsmodels.org/dev/examples/notebooks/generated/stl_decomposition.html - squarespiral
感谢@squarespiral,我根据您的评论更新了答案。 - Angelo Cardellicchio
很棒的回答。不过,+1 主要是为了那个双关语。 - Riley

0
根据源代码statsmodels.tsa.seasonal()通过以下方式对时间序列进行分解:
  1. 趋势是通过卷积窗口计算的,由参数period=12决定,例如;
  2. 通过参数model控制,可以通过原始趋势(Raw-Trend)或原始/趋势(Raw/Trend)获得去趋势化的时间序列;
  3. 季节性最终通过对单个周期(例如12个)内的所有时间段进行平均计算得出;
  4. 最后,残差是剩余的噪音。

我认为,这在某种程度上是一种传统的、类似于特征工程的机器学习任务。不确定它是否会提高一些高级深度学习架构(例如Transformer)的性能。


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