使用Python进行季节性时间序列的Loess分解

14
我试图用Python做我在R中使用的STL函数。
R命令为:
fit <- stl(elecequip, s.window=5)
plot(fit)
我如何在Python中完成这个操作?我调查了statmodels.tsa,发现其中有一些时间序列分析函数,但在文档中没有找到“Seasonal Decomposition of Time Series by Loess”这个函数。类似地,在Python.org上还有一个名为timeseries 0.5.0的库,但是它没有文档,并且它的主页看起来已经无法访问。我知道可以使用rpy2中的包装器选项,但我不知道如何使用它。
谢谢。
3个回答

19

我也遇到类似的问题,正在尝试找到最佳解决方案。

这里是一个基于Loess过程的STL分解的Github仓库。它基于可在此论文中获得的原始Fortran代码。实际上,它只是原始Fortran代码的Python包装器,因此您可以确保它很可能运行良好且无错误。

如果您想要更Python专注的东西,并愿意使用稍微简单一些的分解程序,那么可以考虑使用StatsModels:

尝试将数据移入Pandas DataFrame,然后调用StatsModelstsa.seasonal_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)
resplot = res.plot()

从上述输入产生的三个图

然后,您可以从中恢复分解的各个组成部分:

res.resid
res.seasonal
res.trend

我希望这有所帮助!


2
引用StatsModels 0.6.0版本说明:“我们添加了一个天真的季节性分解工具,与R的decompose类似。”因此请考虑这可能不是生产就绪的。 - Guillermo Blasco
我认为分解法并不像基于模型的方法或Loess过程那样强大,但它似乎已经可以用于生产环境,例如没有报告的错误,并且在我进行的测试中似乎可以正常工作。你还看到了什么使你说它不适合生产环境? - AN6U5
"天真的季节性分解"仅仅是这样,这意味着很少(朴素贝叶斯是天真的,但如果数据符合假设,则效果很好)。同时引用代码中的注释:"这是一种天真的分解方法。应该优先选择更复杂的方法。"所以如果它对您有效,那很好,但请记住您正在使用的内容。 - Guillermo Blasco
我确实提供了一个Loess季节性分解程序的链接,因为OP要求这样做,它比Naive Seasonal Decomposition更复杂。但是由于它不是即插即用的,我还包括了Naive Seasonal Decomposition,因为它包含在StatsModels中。不要过于关注算法的名称以及它们是否包含“naive”一词,因为这并不能反映出它的生产价值,只能反映出它的多功能性和设计算法时使用的假设。是的,我同意基于模型的方法更加灵活。 - AN6U5
我想要检查残差,在使用 seasonal_decompose 时得到了所有的 NaN,而在使用 R 时没有发生这种情况... - LittleLittleQ

1
您可以使用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中看到的参数这里,但将任何周期更改为下划线,例如上述函数中的位置参数是s_window,但在上面的链接中为s.window。此外,我在这个存储库中找到了上述代码的一部分。

0
另一个Python选项是seasonal包(PyPI, github)。它类似于StatsModels seasonal_decompose,并且还将估计您的数据的周期性。

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