; D& i* u, x; V' p" U# 附加:查看自相关系数合片自相关系数(查分之后),可以用于平稳性的检测,也可用于定阶系数预估4 r0 M& S3 w H" y% e/ o% v8 J$ Z
' n |7 u2 w1 B j3 g" S/ \#自相关图()' C8 w X9 G2 x1 w$ e; V: r3 ?
5 O9 c$ h7 |" Y: kfrom statsmodels.graphics.tsaplots import plot_acf & A: D+ }- C( l7 s! l. x& T @9 w l n1 `" O7 S
plot_acf(data).show() #自相关图既不是拖尾也不是截尾。以上的图的自相关是一个三角对称的形式,这种趋势是单调趋势的典型图形,说明这个序列不是平稳序列9 N" r. f2 m8 Y" W0 Y, G/ V6 w
8 Q+ \% {. G( C+ Z! z6 @' P2 {% E- Y8 v
; E5 L3 Z) j H4 \# C X7 M 9 D) F, S2 ?7 c9 ~& L$ c$ j 8 p4 N& D0 l* U8 S1 z3 O4 R+ M# 1 平稳性检测 ; ^8 } ^4 {# f9 }6 |: D: w 5 R6 N1 {0 v+ v' Kfrom statsmodels.tsa.stattools import adfuller as ADF $ I! C7 r, v* ^* ] 3 C7 p1 q" ~' _ f6 K( v$ E5 M8 ]1 j Q) X- z( |
def tagADF(t):( t, b/ j% B9 W6 W( W% s
result = pandas.DataFrame(index=[ 0 A& ^) l. T4 n+ l5 ^0 K "Test Statistic Value", "p-value", "Lags Used", # F1 S: M$ \4 G2 e "Number of Observations Used", d) X1 K- [+ w+ S3 K7 I
"Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)" ) \1 U% Y. j8 n! z& F- x8 A$ t ], columns=['销量'] ' Y; F0 i' E& N ); 7 l; z$ o' ^: g2 d result['销量']['Test Statistic Value'] = t[0] + j5 Z% K6 } I; K" x3 D result['销量']['p-value'] = t[1]8 B" _: m E: U2 Y
result['销量']['Lags Used'] = t[2] 0 ^& {0 }3 z* o N6 K5 x result['销量']['Number of Observations Used'] = t[3], c$ Y" \7 {/ f
result['销量']['Critical Value(1%)'] = t[4]['1%']$ f4 N8 v2 u6 r1 j! t& S5 |' k& o
result['销量']['Critical Value(5%)'] = t[4]['5%'] 8 D) S% v/ Y- n result['销量']['Critical Value(10%)'] = t[4]['10%']9 G9 g: a: D; b; ]% B
return result;7 D, q; n* V2 K- x( |- L0 ]: U
+ V A; M+ P0 N8 U. c1 z
- P- @$ H* i+ [: @( W7 eprint('原始序列的ADF检验结果为:',tagADF(ADF(data[u'销量']))) # 添加标签后展现 & m) Y4 ~, X: i Z. Z+ R, f+ a0 {0 x/ v. F6 q5 B
# 平稳判断:得到统计量大于三个置信度(1%,5%,10%)临界统计值,p值显著大于0.05,该序列为非平稳序列。 . H2 Z, M1 g' S, U* \1 F6 _# 备注:得到的统计量显著小于3个置信度(1%,5%,10%)的临界统计值时,为平稳 此时p值接近于0 此处不为0,尝试增加数据量,原数据太少 ( H+ B% @1 @% u% k* _) T 3 n$ ~" n. p$ @* v! N) w0 r" g# 2 进行数据差分,一般一阶差分就可以 4 j3 u! b) V; |7 E4 O $ O; a% J/ ^& w- aD_data = data.diff(1).dropna() 7 s/ O' u7 S+ xD_data.columns = [u'销量差分'] & s# R, T" `3 h6 M9 p 3 y* Q2 y# c8 H P, b8 D) y% U( y#差分图趋势查看6 H6 U! b, Z, u; n! z
$ ^2 ?3 J7 V9 U; ?6 J, k" }
D_data.plot() 8 a s: Y( M2 {% F# I$ a
plt.show() ) c7 ` _3 w6 P# j1 B! i {& X! l: P3 _: \; u2 A0 |5 h# U
# 附加:查看自相关系数合片自相关系数(查分之后),可以用于平稳性的检测,也可用于定阶系数预估 . h9 Z1 E/ X9 L ? 3 B. }# N+ }" j0 V( R6 Y#自相关图 + h2 ~& N* S* @6 Z r! ?1 T2 K% ^1 R# \plot_acf(D_data).show() : s/ Q- M" B' C$ D/ N$ u; e+ [5 f4 I, W7 |' @
plt.show()& ]; U% ~. O! c. ^+ i
8 [+ z$ ]/ _# `% I#偏自相关图" F7 T" @% {. W8 p
3 x5 z2 D. f" c* ffrom statsmodels.graphics.tsaplots import plot_pacf " f* b" n, j7 \ l $ A) o! W& z4 \plot_pacf(D_data).show() p7 S. T9 M: c# r% \- o + _2 I1 o: R% D9 h/ Z. ]+ e# 3 平稳性检测 ' ?9 |0 a4 e% V( b7 E# f 9 T& E4 Z8 e, o$ r9 B1 ]print(u'差分序列的ADF检验结果为:', tagADF(ADF(D_data[u'销量差分']))) % p: `9 u- x- H" b* Z4 ]7 c4 I, x
% j% c2 U5 ~$ g' |1 B2 c# 解释:Test Statistic Value值小于两个水平值,p值显著小于0.05,一阶差分后序列为平稳序列。9 e: m. S7 z" I' g: n4 q( `) a. m
) M6 y7 `* k0 m$ u6 }0 [
# 4 白噪声检验% X2 }# A* q% \
from statsmodels.stats.diagnostic import acorr_ljungbox + i8 W; a& x# L5 H+ B , J) a2 {& ?/ S6 x#返回统计量和p值 o* L7 f' v- e0 m $ ~9 z- e! u9 I" ~- {: J- O! m' Wprint(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) # 分别为stat值(统计量)和P值 3 o! q% S9 ~- Z* G/ D# y2 `% {5 y3 F9 C, |+ K/ {
# P值小于0.05,所以一阶差分后的序列为平稳非白噪声序列。 8 ^6 ?/ r. D b7 I 9 c, F6 h- s0 x" M3 p 5 W6 [, Q7 N! q# o, ~& [, e- y* d# 5 p,q定阶8 z. B5 f& l/ J) f% P7 [0 i
! s! [# @9 D3 y/ \pmax = int(len(D_data)/10) % R2 |4 ^2 m; k: R w4 o. h
* k5 D8 D/ G. w0 F$ x" [
3 j' d; [1 S4 I0 \+ ?5 @2 h
#一般阶数不超过length/10 " A6 `; h- K- D. \. M! c$ d ( Y, C; I( Y0 [! W3 ]& ?5 L) R" cqmax = int(len(D_data)/10) . H3 q. I$ Z7 b / E5 O% K/ M# w/ A8 n( c, [#bic矩阵, K1 J3 B# {, @- u. ^; u
. d0 M. x7 h; P: C( p5 K3 G: kbic_matrix = [] / }8 W9 p; k) q R
for p in range(pmax+1): " u2 v {' p+ q- q tmp = [] 6 l2 r, \' F f) F for q in range(qmax+1): K0 I9 E) `8 O3 |5 X#存在部分报错,所以用try来跳过报错。 S) W8 Y+ o. N. i% [3 m* S try: 2 X% @3 A5 C, V5 {7 G tmp.append(ARIMA(data, (p,1,q)).fit().bic); R# H: J+ m; O; l9 v
except:5 O, v' q4 u5 l- M% X1 w$ w
tmp.append(None)' p) g( M, K! N9 V1 o' N
bic_matrix.append(tmp)3 F; O: U0 N1 t! Y$ v8 W
4 Z x% r0 }. Z4 n; P/ f9 _
#从中可以找出最小值, [" q# ~3 F4 \" f& x