数学建模社区-数学中国

标题: python实现 ARIMA 模型 及逐行解释 [打印本页]

作者: 2744557306    时间: 2024-3-20 10:01
标题: python实现 ARIMA 模型 及逐行解释
ARIMA(Autoregressive Integrated Moving Average)模型是一种常用的时间序列分析方法,用于对时间序列数据建模和预测。它通过结合自回归(AR)和滑动平均(MA)模型的特性,并对序列进行差分(Integration,即I)来建立模型。
) B( f8 N$ U* E( iARIMA模型的三个主要参数是p、d和q,分别对应于自回归、差分和滑动平均的阶数。$ @7 _1 {/ |5 x9 l1 t5 n6 y
4 T, Z+ n) R! K# c5 Z/ @
1.自回归(AR):自回归部分使用先前时间点的观测值来预测当前值。p参数表示自回归的阶数,即使用多少个先前时间点的值作为预测输入。& c6 T  P  I, ]2 C7 p+ V
2.差分(I):差分是对时间序列进行一阶或多阶的差分操作,可以消除序列的非平稳性。d参数表示差分的阶数,默认为1阶差分。+ }5 `& E; ~3 D) F
3.滑动平均(MA):滑动平均部分使用先前的误差值来预测当前值。q参数表示滑动平均的阶数,即使用多少个先前的误差值作为预测输入。
5 y0 `' H8 }) n# j2 H( G2 Q$ a3 v; i' @! D% V8 l5 g
ARIMA模型的一般表示形式为ARIMA(p, d, q),其中p、d和q是非负整数。它可以很好地处理具有线性趋势和季节性的时间序列数据。
, q1 O; R$ \6 w- ?7 u" \! P- g; B0 \+ P* U0 C4 u
" k3 C" u. ?/ Q/ y' s. j: W/ \
4.确定时间序列数据的平稳性,如平稳性检验、观察序列的趋势和季节性等。
% ?4 a& K9 q4 E5.如果时间序列不平稳,进行差分操作以实现平稳性。
5 k% l# r/ A- J7 p& ]# o% v) b  D, u6.通过观察ACF和PACF图来确定p和q的合适取值范围。8 A+ j8 u% ~5 k& f
7.根据AIC等准则,以不同的p、d、q值建立多个ARIMA模型。% t4 z: w7 }$ \& v+ o
8.对每个模型进行参数估计和模型拟合。$ t3 `! z( M4 n( e
9.使用拟合的模型进行预测,并对模型的拟合效果进行评估。  G9 `4 M, e0 g! I3 C
; A1 V9 ?6 U; F
ARIMA模型是时间序列分析领域中常用的模型之一,它可以用于预测未来趋势、季节性和周期性等时间序列数据的变化。在实际应用中,ARIMA模型可以被用于经济预测、股票市场分析、天气预测等各种领域。+ s& g' f" M1 n1 |% ?# V" ^/ y8 d
希望这个介绍对你有帮助。如果你还有任何问题,请随时提问。
, d* N7 ~% k3 A6 N2 Y# yimport numpy as np
& [2 o& x2 L% z% `6 }import pandas as pd
" Z! P" x8 ?/ r6 j) U) d  A! m. \from statsmodels.tsa.arima_model import ARIMA3 n; `" S4 c% t9 h. f8 z
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
5 E, \6 x# Y  D0 c0 D( \import matplotlib.pyplot as plt
1 T5 b: H2 }7 p. W8 n& h# A9 ]
, M& E$ Q) ~! c# ]$ U$ H7 o1 k这几行代码导入了所需的库,包括NumPy(用于数值计算)、Pandas(用于数据处理和分析)、statsmodels库中的ARIMA模型类和绘制时间序列图的函数,以及matplotlib用于绘图。& O; b! \, r7 ]0 Q4 X2 k3 j5 x
df = pd.DataFrame({3 i, P5 u" }1 [3 O( {8 L/ R
    'year': [i for i in range(1980, 2011)],
2 w  _2 t. H, m% v    'val': [0.82989428, 0.85951092, 0.87668916, 0.86670716, 0.932052,. H( t5 w5 z; O0 a' R* h
            1.04826364, 1.3111932, 1.63756228, 2.0641074, 1.91268276,: B7 t; E- V* }7 Y/ u) K$ g
            2.03544572, 2.17721128, 2.38968344, 2.75059208, 3.0906664,
$ B- n6 [7 V+ z$ f; l1 k9 o            3.42664028, 3.83064908, 3.97190864, 3.83160036, 4.143101,( E4 C  L% J& p. ?
            4.566551, 4.47541, 4.462796, 4.384829, 4.796861,/ r& f6 ]+ d0 z6 w* e! U. ^
            5.046211, 5.098759, 5.196519, 5.166843, 5.174744,
5 `# k% c- _9 z" M+ e) I            5.440894],
; }; B3 K' d8 _9 G: P6 S, o})
' s, `0 v, T- h$ L" P$ o: X) H9 B' G7 V& X' g7 P( [+ @& T/ {; l* E
这段代码定义了一个名为df的Pandas DataFrame,其中包含了两列数据:'year'和'val'。'year'列包含了从1980年到2010年的年份数据,'val'列包含了与每个年份对应的值。  C- V4 [1 R. Z- y7 I
df['val_diff1'] = df['val'].diff()- n, L$ ?5 D3 z9 ^2 [2 d
plt.plot(df['year'], df['val'], label='origin')
8 ~+ u  `6 `$ h! uplt.plot(df['year'], df['val_diff1'], label='diff1')% l6 I' }4 J) k
plt.legend(), J  z  F7 |9 A3 T" F

( D8 h# M& m* _! q这段代码将计算'val'列的一阶差分,并将结果存储在一个新的'valdiff1'列中。然后使用matplotlib绘制了两条线:一条是原始'val'列的线,另一条是差分后的'valdiff1'列的线。plt.legend()函数用于显示图例。* H, ]$ @8 P* Z4 A; u: e, u
plot_acf(df['val_diff1'][1:])
/ N7 I. I3 E' M, A, t2 a
, X5 W+ D5 v% f( r这行代码使用plot_acf函数绘制了一阶差分后的序列('val_diff1'列)的自相关函数(ACF)图。ACF图用于展示序列在不同滞后阶数的相关性。
* \- L4 G7 d5 `4 I4 D. Pplot_pacf(df['val_diff1'][1:], lags=14)
. y8 t  }" e& n7 \* e7 n" S( Q% @6 |- l& j  g" F+ S, b! I
这行代码使用plot_pacf函数绘制了一阶差分后的序列('val_diff1'列)的偏自相关函数(PACF)图。PACF图用于展示序列在不同滞后阶数的偏相关性,同时指定了lags=14参数,表示只展示14个滞后阶数的PACF值。
! }6 Z- c3 @- ]3 y& s4 r* D* |* Dstr_list = []: H0 Y+ i9 F' {
for p in range(1, 4):
. _7 s, x' G+ b* @1 v    for q in range(0, 4):7 f2 P! C* B$ Z% p- v2 c0 [6 n
        model = ARIMA(df['val'], order=(p, 1, q))6 K( |( Y, L7 ?; p1 r6 q
        res = model.fit(disp=0)5 l5 r9 ?% q5 F) Q( S
        str_list.append('p = {}, q = {}, aic = {}'.format(p, q, res.aic))
* [# D  i0 {8 D# F) Q- A3 F; Sfor each in str_list:5 g9 w% c3 |  x; `$ H8 `
    print(each)
) Z! D6 d  q  g7 F; t, D3 [; x
6 h) ~5 f- b6 J0 L% W2 G  d这段代码使用嵌套的for循环,遍历p和q的取值范围,分别为1到3和0到3。在每次循环中,创建了一个ARIMA模型对象,并将p、1(表示一阶差分)、q作为参数传递给order参数。然后使用拟合方法(fit)将模型拟合到'val'列的数据中,得到拟合后的模型对象(res)。同时,计算并记录了模型的AIC值,并将其添加到字符串列表str_list中。最后,使用循环打印出每个p和q值对应的模型的AIC值。: u; M2 @1 g# c% d3 V6 p5 i6 {& M
model = ARIMA(df['val'], order=(2, 1, 0))# H' V: j8 U& p: j
res = model.fit(disp=0)
5 }9 t7 T6 `. C  x8 K- Fres.summary()
; R5 v- o0 l5 I" ^* V: }! p! Z8 s3 Q* _' ?. l$ F
这部分代码创建了一个ARIMA模型对象,使用p=2、d=1(一阶差分)、q=0来进行参数配置。然后利用拟合方法将模型拟合到'val'列的数据中,得到拟合后的模型对象(res)。接下来,调用summary()方法打印出拟合后的模型的详细摘要信息,包括模型系数、标准误差、p值等。
4 k3 g$ M9 l7 k0 J) o# B, L1 sres.plot_predict(end=40)- A1 n7 Y8 e: ?/ C. m
$ j8 E( k. {7 h4 A7 B! k# j
这行代码使用拟合后的模型(res)的plot_predict方法生成了一个预测图表。指定了end=40参数,表示要预测40个时间点。这个图表显示了原始数据和模型对未来值的预测。9 M/ `. R% d4 Y* M; k
希望这些解释可以帮助你理解代码的每一行。如果还有进一步的问题,请随时提问。
/ Y# u( S7 L* B- o0 g$ m
4 G4 G) z, b2 y  W# c2 k6 u" E8 H* g
( r# e  w6 ?& W3 u

24.arima.py

1.51 KB, 下载次数: 0, 下载积分: 体力 -2 点

售价: 2 点体力  [记录]  [购买]






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5