基于Python的Seasonal Loess时间序列分解

2024-05-15 21:31:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用Python做R上的STL函数

R命令是

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

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

谢谢。


Tags: 函数文档命令功能plot时间序列window
3条回答

我也遇到过类似的问题,我正在努力寻找最好的出路。

Here is a github repo for an STL decomposition based on the Loess procedure。它基于this paper提供的原始fortran代码。它实际上只是原始Fortran代码的一个python包装器,所以您知道它很可能工作得很好,而且不会出错。

如果您希望以Python为中心,并且愿意使用稍微简单一点的分解例程,StatsModels有一个:

尝试将数据移动到Pandas数据帧中,然后调用StatsModelstsa.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()

Three plots produced from above input

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

res.resid
res.seasonal
res.trend

我希望这有帮助!

也可以使用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úu window,但在上面的链接中是s.window。另外,我在this存储库中找到了上面的一些代码。

另一个python选项是seasonal包(PyPIgithub)。它类似于StatsModels的季节分解,也会估计数据的周期性。

相关问题 更多 >