大多数时间序列都可以分解成不同的组件,在本文中,我将讨论这些不同的组件是什么,如何获取它们以及如何使用Python进行时间序列序列分解。时间序列组件时间序列是(主要)三个组件的组合:趋势、季节性和残差/余数。让我们简单解释一下趋势的三个组成部分:它是序列的整体运动。它可能会不断增加,可能会不断减少,也可能会波动。季节性:系列中的任何常规季节性模式。例如,夏季的冰淇淋销量通常高于冬季。残差:这是我们考虑趋势和季节性后剩下的。它也可以被认为只是统计噪声,或者临时事件的影响,这个剩余量也有一个单独的周期成分,但它通常被包含在趋势成分中。加法与乘法模型这些组件的组合方式取决于时间序列的性质。对于加法模型:对于乘法模型:其中Y是序列,T是趋势,S是季节性,R是残差分量。当序列变异的尺度一致时,加性模型最合适。当序列的波动在相对和比例范围内时,乘法模型更为合适。例如,如果夏季冰淇淋销量每年增加1,000,则该模型是可加的。如果每年夏天销售额继续增长20%,但绝对销售额在变化,则该模型是乘法的。稍后我们将讨论一个可以使这个理论更具体的例子。为了计算和可视化梯度,可以通过对数变换或Box-Cox变换将乘法模型转换为加法模型:分解的工作原理有多种算法和方法可以将时间序列分解为三个部分。下面这个经典方法经常用到,非常直观。使用移动/滚动平均值计算趋势分量T。去除序列的趋势,加法模型的Y-T和乘法模型的Y/T。通过取每个季节的去趋势序列的平均值来计算季节性分量S。残差分量R对于加法模型计算为R=Y-T-R,对于乘法模型计算为R=Y/(TR)。还有其他几种方法可用于分解,例如STL、X11和SEATS。这些都是对经典方法的基本方法进行补充并改进其缺点的先进方法。如果你想了解这些最新的方法,可以留言,我们将单独开篇介绍。Python中的时间序列分解让我们使用1948年至1961年的美国航空乘客数据集:#https://www.kaggle.com/datasets/ashfakyeafi/air-passenger-data-for-time-series-analysisimportplotly.expressaspximportpandasaspd#读入数据data=pd.read_csv('AirPassengers.csv',index_col=0)data.index=pd.to_datetime(data.index)#绘制数据fig=px.line(data,x=data.index,y='#Passengers',labels=({'#Passengers':'Passengers','Month':'Date'}))fig.update_layout(template="simple_white",font=dict(size=18),title_text='AirlinePassengers',width=650,title_x=0.5,height=400)fig.show()从图中我们观察到趋势是增加的,每年也有季节性。波动的幅度随着时间的推移而增加,因此我们可以说这是一个乘法模型。statmodels中包含的seasonal_decomposition函数可以帮助我们分解时间序列,并在调用该函数时指定这是一个“乘法”模型:fromstatsmodels.tsa.seasonalimportseasonal_decomposeimportmatplotlib.pyplotasplt#绘制乘法分解图系列data.rename(columns={'#Passengers':'MultiplicativeDecomposition'},inplace=True)decomposition_plot_multi=seasonal_decompose(data['MultiplicativeDecomposition'],model='multiplicative')decomposition_plot_multi.plot()plt.show()从上图可以看出,该函数确实成功捕获了这三个组件。Box-Cox变换可用于通过应用Scipy函数boxcox来稳定方差,它将序列转换为加法模型:boxcox#Applyboxcoxtoacquireadditivemodeldata['AdditiveDecomposition'],lam=boxcox(data['#Passengers'])#绘制附加序列的分解decomposition_plot_add=seasonal_decompose(data['AdditiveDecomposition'],model='additive')decomposition_plot_add.plot()plt.show()这个函数也很好地捕获了这三个组件。但是我们看到残差在早期和晚期有更高的波动性。所以在为这个时间序列建立预测模型时需要考虑到这一点。总结在这篇文章中,我们展示了如何将时间序列分解为三个基本组成部分:趋势、季节性和残差。这三个组成部分的组合产生了实际的时间序列,它们的组合可以是加法或乘法。有几种较新的技术来执行分解,例如STL、SEAL和X11,但经典方法简单直观。最后,分解时间序列有助于建立对数据的理解,从而更容易做出未来的预测。https://avoid.overfit.cn/post/c9810ffc726b4cbeba5704e392408dcc作者:EgorHowell
