應(yīng)用時(shí)間序列
時(shí)間序列分析是一種重要的數(shù)據(jù)分析方法,應(yīng)用廣泛。以下列舉了幾個(gè)時(shí)間序列分析的應(yīng)用場景:
1.經(jīng)濟(jì)預(yù)測:時(shí)間序列分析可以用來分析經(jīng)濟(jì)數(shù)據(jù),預(yù)測未來經(jīng)濟(jì)趨勢和走向。例如,利用歷史股市數(shù)據(jù)和經(jīng)濟(jì)指標(biāo)進(jìn)行時(shí)間序列分析,可以預(yù)測未來股市的走向。
2.交通擁堵預(yù)測:時(shí)間序列分析可以用來預(yù)測交通擁堵情況。例如,根據(jù)歷史車流量和天氣信息,可以建立一個(gè)時(shí)間序列模型來預(yù)測未來某個(gè)時(shí)間段的路況。
3.天氣預(yù)測:時(shí)間序列分析可以用于天氣預(yù)測,例如預(yù)測未來幾天或幾周的降雨量、溫度等。這對于農(nóng)業(yè)生產(chǎn)和水資源的管理非常重要。
4.財(cái)務(wù)規(guī)劃:時(shí)間序列分析可以用來幫助企業(yè)進(jìn)行財(cái)務(wù)規(guī)劃。例如,通過分析歷史銷售數(shù)據(jù),可以預(yù)測未來銷售額,并制定相應(yīng)的預(yù)算計(jì)劃。
5.工業(yè)控制:時(shí)間序列分析可以用來優(yōu)化工業(yè)生產(chǎn)過程。例如,根據(jù)機(jī)器運(yùn)行狀態(tài)和歷史生產(chǎn)數(shù)據(jù),可以建立一個(gè)時(shí)間序列模型來優(yōu)化生產(chǎn)線的運(yùn)行,提高生產(chǎn)效率。
源數(shù)據(jù)樣例:
以下是數(shù)據(jù)的具體時(shí)間序列分析步驟:
這里講述的是ARIMA模型:
ARIMA模型(英語:Autoregressive?Integrated?Moving?Average model),差分整合移動(dòng)平均自回歸模型,又稱整合移動(dòng)平均自回歸模型(移動(dòng)也可稱作滑動(dòng)),是時(shí)間序列預(yù)測分析方法之一。ARIMA(p,d,q)中,AR是“自回歸”,p為自回歸項(xiàng)數(shù);MA為“滑動(dòng)平均”,q為滑動(dòng)平均項(xiàng)數(shù),d為使之成為平穩(wěn)序列所做的差分次數(shù)(階數(shù))?!安罘帧币辉~雖未出現(xiàn)在ARIMA的英文名稱中,卻是關(guān)鍵步驟。
注意:以下時(shí)間序列分析代碼僅限一階差分或者不使用差分進(jìn)行的代碼,以一階差分為例。
?
一.導(dǎo)入數(shù)據(jù)
1 df=pd.read_excel('M17.xlsx') 2 print(df["水位"].head()) 3 4 # 創(chuàng)建一個(gè)DatetimeIndex對象,指定時(shí)間范圍為2021年1月1日到1月5日 5 dates = pd.date_range(start='1860-01-01', end='1955-12-31',freq='AS') 6 # 創(chuàng)建一個(gè)Series對象,將列表作為數(shù)據(jù),DatetimeIndex對象作為索引 7 t_s = pd.Series(data=df["水位"].tolist(), index=dates) 8 t_s.index = t_s.index.strftime('%Y')
注:這里的數(shù)據(jù)df為dataframe數(shù)據(jù),兩列;t_s為時(shí)間序列數(shù)據(jù),第二列,它內(nèi)涵時(shí)間索引
二.繪制時(shí)序圖
時(shí)序圖是一種用于展示時(shí)間序列數(shù)據(jù)的圖表,通常將時(shí)間作為X軸,將變量(如銷售額、溫度等)作為Y軸。時(shí)序圖可以幫助我們觀察和分析時(shí)間序列數(shù)據(jù)的趨勢、季節(jié)性、周期性以及異常值等。
一個(gè)典型的時(shí)序圖通常包括以下幾個(gè)元素:
1-->X軸:表示時(shí)間軸,通常根據(jù)數(shù)據(jù)的時(shí)間粒度來設(shè)置刻度。例如,如果數(shù)據(jù)是按日收集的,則X軸可能顯示日期;如果是按小時(shí)收集的,則X軸可能顯示小時(shí)數(shù)。
2-->Y軸:表示變量的取值范圍,通常根據(jù)數(shù)據(jù)的特性來設(shè)置刻度。例如,如果數(shù)據(jù)表示某個(gè)產(chǎn)品的銷售額,則Y軸可能顯示金額數(shù)值;如果數(shù)據(jù)表示溫度,則Y軸可能顯示攝氏度或華氏度。、
3-->數(shù)據(jù)線:表示時(shí)間序列數(shù)據(jù)的變化趨勢,通常用一條連續(xù)的曲線或折線來表示。數(shù)據(jù)線的顏色和樣式可以根據(jù)需要進(jìn)行調(diào)整,以突出重點(diǎn)信息。
4-->標(biāo)題和注釋:用于說明時(shí)序圖的含義、數(shù)據(jù)來源和相關(guān)信息。
將時(shí)間序列數(shù)據(jù)可視化成時(shí)序圖,可以更加直觀地觀察和分析數(shù)據(jù)的變化趨勢和規(guī)律,從而更好地理解數(shù)據(jù)。
首先可以繪制線圖直接觀察數(shù)據(jù)走勢粗略判斷平穩(wěn)性,既無趨勢也無周期
1 #時(shí)序圖 2 plt.plot(df['年份'],df['水位']) 3 plt.xlabel("年份") 4 plt.ylabel("水位") 5 plt.show()
三.初步檢驗(yàn)
3.1.純隨機(jī)性檢驗(yàn)(白噪聲檢驗(yàn))
3.1.1Ljung-Box 檢驗(yàn)
Ljung-Box 檢驗(yàn)是一種常用的時(shí)間序列分析方法,可以用于檢測數(shù)據(jù)是否具有白噪聲特征。白噪聲指的是一種隨機(jī)性非常強(qiáng)的信號,其中每個(gè)時(shí)間點(diǎn)的值都是獨(dú)立且服從相同的分布。
Ljung-Box 檢驗(yàn)是基于自相關(guān)和偏自相關(guān)函數(shù)計(jì)算的。在實(shí)際應(yīng)用中,需要將時(shí)間序列數(shù)據(jù)轉(zhuǎn)化為平穩(wěn)序列,然后計(jì)算其自相關(guān)和偏自相關(guān)函數(shù)。Ljung-Box 檢驗(yàn)會(huì)統(tǒng)計(jì)一組拉格朗日乘子(Lagrange Multiplier)值,從而判斷序列數(shù)據(jù)是否具有白噪聲特征。
通常情況下,如果 Ljung-Box 檢驗(yàn)的統(tǒng)計(jì)值小于置信度水平對應(yīng)的臨界值,就可以認(rèn)為時(shí)間序列數(shù)據(jù)具有白噪聲特征。反之,如果統(tǒng)計(jì)值大于臨界值,則可以認(rèn)為時(shí)間序列數(shù)據(jù)不具有白噪聲特征。
print("隨機(jī)性檢驗(yàn):",'\n',lb_test(df["水位"], return_df=True,lags=5))
其中 df["水位"]?是一個(gè)一維數(shù)組,表示時(shí)間序列數(shù)據(jù);lags
參數(shù)指定計(jì)算自相關(guān)和偏自相關(guān)函數(shù)的滯后階數(shù)。如果希望以一定的置信度進(jìn)行 Ljung-Box 檢驗(yàn),可以根據(jù)自由度和置信度水平計(jì)算出對應(yīng)的臨界值,然后將其與 stat
進(jìn)行比較。
注:當(dāng)p值小于0.05時(shí)為顯著非白噪聲序列
3.1.2單位根檢驗(yàn):ADF檢驗(yàn)
單位根檢驗(yàn),也稱為增廣迪基-福勒檢驗(yàn)(Augmented Dickey-Fuller test,ADF test),是一種用于檢驗(yàn)時(shí)間序列數(shù)據(jù)是否具有單位根(unit root)的方法。在時(shí)間序列分析中,單位根通常是假設(shè)時(shí)間序列數(shù)據(jù)中存在一種長期的趨勢或非平穩(wěn)性。
單位根檢驗(yàn)旨在驗(yàn)證時(shí)間序列數(shù)據(jù)是否具有平穩(wěn)性。如果時(shí)間序列數(shù)據(jù)具有單位根,則說明數(shù)據(jù)存在非平穩(wěn)性,并且預(yù)測和分析可能會(huì)出現(xiàn)問題。因此,在進(jìn)行時(shí)間序列分析之前,我們需要先進(jìn)行單位根檢驗(yàn),以確保數(shù)據(jù)具有平穩(wěn)性。
ADF檢驗(yàn)是一種常用的單位根檢驗(yàn)方法,它通過計(jì)算時(shí)間序列數(shù)據(jù)的ADF統(tǒng)計(jì)量來判斷數(shù)據(jù)是否具有單位根。ADF統(tǒng)計(jì)量與t值類似,表示觀測值與滯后版本之間的差異程度,同時(shí)考慮了其他因素的影響。如果ADF統(tǒng)計(jì)量小于對應(yīng)的臨界值,則拒絕原假設(shè),即數(shù)據(jù)不存在單位根,表明數(shù)據(jù)具有平穩(wěn)性。
除了ADF檢驗(yàn)外,還有許多其他的單位根檢驗(yàn)方法,例如Dickey-Fuller檢驗(yàn)、KPSS檢驗(yàn)等。不同的單位根檢驗(yàn)方法具有不同的假設(shè)條件和適用范圍,需要根據(jù)具體情況來選擇合適的方法。
總之,單位根檢驗(yàn)是一種重要的時(shí)間序列分析工具,用于驗(yàn)證數(shù)據(jù)是否具有平穩(wěn)性。只有在數(shù)據(jù)具有平穩(wěn)性的情況下,才能進(jìn)行有效的預(yù)測和分析。
檢驗(yàn)假設(shè):H0:存在單位根 vs H1:不存在單位根
如果序列平穩(wěn),則不應(yīng)存在單位根,所以我們希望能拒絕原假設(shè)
1 # 進(jìn)行ADF檢驗(yàn) 2 result = ts.adfuller(df['水位']) 3 # 輸出ADF結(jié)果 4 print('-------------------------------------------') 5 print('ADF檢驗(yàn)結(jié)果:') 6 print('ADF Statistic: %f' % result[0]) 7 print('p-value: %f' % result[1]) 8 print('Lags Used: %d' % result[2]) 9 print('Observations Used: %d' % result[3]) 10 print('Critical Values:') 11 for key, value in result[4].items(): 12 print('\t%s: %.3f' % (key, value))
當(dāng)p-value>0.05,則要進(jìn)行差分運(yùn)算!否之直接跳轉(zhuǎn)到模型選擇與定階。
?3.2差分運(yùn)算
差分運(yùn)算是時(shí)序數(shù)據(jù)預(yù)處理中的一個(gè)常見操作,它可以用來消除時(shí)間序列數(shù)據(jù)中的趨勢和季節(jié)性變化,從而使得數(shù)據(jù)更加平穩(wěn)。在時(shí)間序列分析和建模中,平穩(wěn)序列通常比非平穩(wěn)序列更容易建模,并且能夠提供更精確的預(yù)測結(jié)果。
差分運(yùn)算可以通過計(jì)算序列中相鄰數(shù)據(jù)之間的差值得到。一階差分是指將每個(gè)數(shù)值與其前一個(gè)數(shù)值相減,得到一個(gè)新的序列;二階差分是指對一階差分后的序列再進(jìn)行一次差分運(yùn)算,以此類推。
1 ##### 差分運(yùn)算 2 def diff(timeseries): 3 new_df=timeseries.diff(periods=1).dropna()#dropna刪除NaN 4 new_df.plot(color='orange',title='diff1') 5 return new_df 6 7 #進(jìn)行一階差分 8 ndf=diff(df['水位'])
或者如下方式也可以進(jìn)行差分
ndf = pd.Series(np.diff(df['水位'], n=1))
注:n=1表示1階差分
3.3再次進(jìn)行ADF檢驗(yàn)
1 #再次進(jìn)行ADF檢驗(yàn) 2 result2 = ts.adfuller(ndf) 3 # 輸出ADF結(jié)果 4 print('-------------------------------------------') 5 print('差分后序列的ADF檢驗(yàn)結(jié)果:') 6 print('ADF Statistic: %f' % result2[0]) 7 print('p-value: %f' % result2[1]) 8 print('Lags Used: %d' % result2[2]) 9 print('Observations Used: %d' % result2[3]) 10 print('Critical Values:') 11 for key, value in result2[4].items(): 12 print('\t%s: %.3f' % (key, value))
如果p-value<0.05則進(jìn)行下一步定階;如p-value仍然>0.05,則繼續(xù)進(jìn)行差分,再進(jìn)行ADF檢驗(yàn),直到檢驗(yàn)結(jié)果的p-value<0.05則進(jìn)行下一步定階。
直到每次差分完成進(jìn)行ADF單位根檢驗(yàn)之后成為平穩(wěn)序列之后在進(jìn)行下一步定階(p,q),這里記錄差分次數(shù)!
四.模型選擇與定階
4.1自相關(guān)圖和偏自相關(guān)圖人工定階
自相關(guān)圖和偏自相關(guān)圖是時(shí)序數(shù)據(jù)分析中常用的工具,可以幫助我們理解時(shí)間序列數(shù)據(jù)中的自相關(guān)性和互相關(guān)性。自相關(guān)函數(shù)(ACF)和偏自相關(guān)函數(shù)(PACF)是計(jì)算自相關(guān)圖和偏自相關(guān)圖的數(shù)學(xué)概念。
自相關(guān)圖展示了時(shí)間序列數(shù)據(jù)在不同滯后階數(shù)下的自相關(guān)系數(shù),即前一時(shí)間點(diǎn)與后面所有時(shí)間點(diǎn)之間的相關(guān)性。自相關(guān)圖有助于判斷時(shí)間序列數(shù)據(jù)是否存在季節(jié)性或周期性變化,并且可以用來選擇合適的時(shí)間序列模型。如果一個(gè)時(shí)間序列數(shù)據(jù)存在季節(jié)性變化,則其自相關(guān)圖通常會(huì)呈現(xiàn)出明顯的周期性模式。
偏自相關(guān)圖展示了在滯后階數(shù)為 n 時(shí),在其他階數(shù)的影響已被削減的情況下,上一時(shí)間點(diǎn)與當(dāng)前時(shí)間點(diǎn)之間的相關(guān)性。偏自相關(guān)圖可以幫助我們確定時(shí)間序列數(shù)據(jù)中的短期相關(guān)性,從而選擇合適的時(shí)間序列模型。如果一個(gè)時(shí)間序列數(shù)據(jù)存在短期相關(guān)性,則其偏自相關(guān)圖通常會(huì)顯示出急速衰減的模式。
模型定階就是根據(jù)自相關(guān)圖和偏自相關(guān)圖來確定時(shí)間序列模型的階數(shù)。一般建議先使用自相關(guān)圖和偏自相關(guān)圖來判斷時(shí)間序列數(shù)據(jù)的性質(zhì)和模型類型,然后根據(jù)其結(jié)果選擇適當(dāng)?shù)臅r(shí)間序列模型及其階數(shù)。常用的時(shí)間序列模型包括 AR、MA、ARMA 和 ARIMA 等。
1 #模型選擇:繪制ACF與PACF,即自相關(guān)圖和偏自相關(guān)圖 2 #### 繪制ACF與PACF的圖像 3 def plot_acf_pacf(timeseries): #利用ACF和PACF判斷模型階數(shù) 4 plot_acf(timeseries,lags=timeseries.shape[0]%2) #延遲數(shù) 5 plot_pacf(timeseries,lags=timeseries.shape[0]%2) 6 plt.show() 7 plot_acf_pacf(ndf)
4.2利用AIC與BIC準(zhǔn)則進(jìn)行迭代調(diào)優(yōu)
AIC(Akaike Information Criterion)和 BIC(Bayesian Information Criterion)是常用的模型選擇準(zhǔn)則,可以用來評估不同模型在擬合數(shù)據(jù)時(shí)的復(fù)雜度和優(yōu)劣程度。一般來說,AIC 和 BIC 的值越小,表示模型對數(shù)據(jù)的解釋能力越強(qiáng),預(yù)測結(jié)果也更加可信。
利用 AIC 和 BIC 進(jìn)行迭代調(diào)優(yōu)的基本思路如下:
1-->根據(jù)需要擬合的時(shí)間序列數(shù)據(jù),選擇一個(gè)初始模型,并計(jì)算其 AIC 和 BIC 值。
2-->對模型進(jìn)行迭代調(diào)優(yōu)。例如,可以逐步增加 AR 或 MA 的階數(shù),或者使用其他方法來改進(jìn)模型的性能。每次更新模型后,重新計(jì)算 AIC 和 BIC 值,并與之前的值進(jìn)行比較。
3-->如果新的 AIC 或 BIC 值更小,則接受新的模型;否則,保留原始模型。重復(fù)上述過程,直到找到最小的 AIC 和 BIC 值,并確定最佳的時(shí)間序列模型及其參數(shù)。
需要注意的是,AIC 和 BIC 只是一種近似的模型評價(jià)指標(biāo)。在實(shí)際應(yīng)用中,還需要考慮其他因素,例如模型的可解釋性、預(yù)測誤差等。因此,在選擇時(shí)間序列模型時(shí),需要綜合考慮多個(gè)因素,以選擇最合適的模型。
1 #迭代調(diào)優(yōu) 2 print('-------------------------------------------') 3 #AIC 4 timeseries=ndf 5 AIC=sm.tsa.stattools.arma_order_select_ic(timeseries,max_ar=4,max_ma=4,ic='aic')['aic_min_order'] 6 #BIC 7 BIC=sm.tsa.stattools.arma_order_select_ic(timeseries,max_ar=4,max_ma=4,ic='bic')['bic_min_order'] 8 print('the AIC is{}\nthe BIC is{}\n'.format(AIC,BIC))
五.模型構(gòu)建
ARIMA 模型是一種常用的時(shí)間序列分析模型,可以用來預(yù)測未來一段時(shí)間內(nèi)的數(shù)據(jù)趨勢。ARIMA 的全稱是 Autoregressive Integrated Moving Average,其中 Autoregressive 表示自回歸模型,Integrated 表示差分操作,Moving Average 表示滑動(dòng)平均模型。
ARIMA 模型的一般形式為 ARIMA(p, d, q),其中 p、d 和 q 分別表示 AR 模型、差分階數(shù)和 MA 模型的階數(shù)。當(dāng)d=0時(shí),即差分階數(shù)為零時(shí)為ARMA模型。具體來說:
·AR 模型是指基于前期觀測值的線性組合,來預(yù)測當(dāng)前觀測值的模型。AR 模型的階數(shù) p 表示使用前 p 個(gè)時(shí)刻的觀測值來預(yù)測當(dāng)前時(shí)刻的值。
·差分操作是對原始數(shù)據(jù)進(jìn)行差分運(yùn)算(即相鄰兩個(gè)時(shí)間點(diǎn)之間的差值),以消除數(shù)據(jù)中的趨勢和季節(jié)性變化。
·MA 模型是指基于前期觀測值的隨機(jī)誤差的線性組合,來預(yù)測當(dāng)前觀測值的模型。MA 模型的階數(shù) q 表示使用前 q 個(gè)時(shí)刻的隨機(jī)誤差來預(yù)測當(dāng)前時(shí)刻的值。
1 #模型構(gòu)建 2 print('-------------------------------------------') 3 model= ARIMA(ndf, order=(1, 1, 2)).fit() 4 print(model.params) 5 print(model.summary())
僅管之前進(jìn)行了差分運(yùn)算,但這里采用的是差分運(yùn)算前的時(shí)間序列數(shù)據(jù),只需要令A(yù)RIMA差分階數(shù)的值即可,Python會(huì)自動(dòng)運(yùn)算差分!
六.模型后檢驗(yàn)
6.1殘差檢驗(yàn)
殘差檢驗(yàn)是在統(tǒng)計(jì)學(xué)中經(jīng)常用于檢測線性回歸模型是否符合假設(shè)的方法之一。在進(jìn)行線性回歸時(shí),我們基于數(shù)據(jù)擬合一個(gè)模型,并觀察模型的殘差(實(shí)際值與模型預(yù)測值之間的差異)是否具有某些特定的性質(zhì)。
通常情況下,如果殘差服從正態(tài)分布、均值為零、方差相等,則說明模型擬合良好。而如果殘差不滿足上述條件,則表明模型可能存在問題,需要進(jìn)一步調(diào)整或改進(jìn)。
在進(jìn)行殘差檢驗(yàn)時(shí),常用的方法包括:
1-->繪制殘差圖:將樣本數(shù)據(jù)的殘差繪制成散點(diǎn)圖,觀察其是否隨著自變量的增加而呈現(xiàn)出某種規(guī)律,比如呈現(xiàn)出線性或非線性關(guān)系。如果殘差呈現(xiàn)出某種規(guī)律,則表明模型存在問題。
2-->繪制Q-Q圖:將殘差按照大小排序,并將其對應(yīng)于標(biāo)準(zhǔn)正態(tài)分布的分位數(shù),然后繪制出散點(diǎn)圖。如果散點(diǎn)圖近似于一條直線,則表明殘差服從正態(tài)分布。
3-->進(jìn)行統(tǒng)計(jì)檢驗(yàn):利用統(tǒng)計(jì)學(xué)方法檢驗(yàn)殘差是否服從正態(tài)分布。常用的檢驗(yàn)方法包括Kolmogorov-Smirnov檢驗(yàn)、Shapiro-Wilk檢驗(yàn)等。
總之,殘差檢驗(yàn)是一種判斷線性回歸模型擬合效果的重要方法,可以幫助我們發(fā)現(xiàn)和解決模型存在的問題。
殘差圖:
1 #殘差圖 2 model.resid.plot(figsize=(10,3)) 3 plt.show()
6.2Jarque-Bera檢驗(yàn)
Jarque-Bera檢驗(yàn)是一種用于檢驗(yàn)樣本數(shù)據(jù)是否符合正態(tài)分布的方法。它基于統(tǒng)計(jì)學(xué)中的JB檢驗(yàn),可以檢驗(yàn)樣本數(shù)據(jù)的偏度和峰度是否符合正態(tài)分布的假設(shè)。
在Jarque-Bera檢驗(yàn)中,我們首先計(jì)算樣本數(shù)據(jù)的偏度和峰度,然后根據(jù)公式計(jì)算出JB統(tǒng)計(jì)量,最后對其進(jìn)行顯著性檢驗(yàn)。
Jarque-Bera檢驗(yàn)的原假設(shè)是:樣本數(shù)據(jù)符合正態(tài)分布。如果p值較小,則拒絕原假設(shè),即認(rèn)為樣本數(shù)據(jù)不符合正態(tài)分布。
1 #進(jìn)行Jarque-Bera檢驗(yàn) 2 print('-------------------------------------------') 3 jb_test = sm.stats.stattools.jarque_bera(model.resid) 4 print('Jarque-Bera test:') 5 print('JB:', jb_test[0]) 6 print('p-value:', jb_test[1]) 7 print('Skew:', jb_test[2]) 8 print('Kurtosis:', jb_test[3])
6.3Ljung-Box檢驗(yàn)
Ljung-Box檢驗(yàn)是一種用于檢驗(yàn)時(shí)間序列數(shù)據(jù)是否存在自相關(guān)性的方法。它基于時(shí)間序列模型的殘差,可以用來判斷殘差之間是否存在顯著的線性相關(guān)性。
在進(jìn)行Ljung-Box檢驗(yàn)時(shí),我們首先計(jì)算時(shí)間序列模型的殘差,并對其進(jìn)行平方處理(Q值)。然后根據(jù)公式計(jì)算出LB統(tǒng)計(jì)量和相應(yīng)的p值,最后對其進(jìn)行顯著性檢驗(yàn)。
Ljung-Box檢驗(yàn)的原假設(shè)是:時(shí)間序列模型的殘差之間不存在自相關(guān)性。如果p值較小,則拒絕原假設(shè),即認(rèn)為殘差之間存在顯著的自相關(guān)性。
1 print('-------------------------------------------') 2 lb_test= sm.stats.diagnostic.acorr_ljungbox(model.resid, return_df=True,lags=5) 3 print('Ljung-Box test:','\n',lb_test)
6.4DW檢驗(yàn)
DW檢驗(yàn)是一種用來檢驗(yàn)線性回歸模型是否存在自相關(guān)性的方法,其中DW代表Durbin-Watson。該檢驗(yàn)方法通常應(yīng)用于時(shí)間序列數(shù)據(jù)中的多元線性回歸分析中,可以用于判斷誤差項(xiàng)(殘差)的時(shí)間序列是否具有自相關(guān)結(jié)構(gòu)。
DW統(tǒng)計(jì)量的取值范圍為0~4,當(dāng)DW統(tǒng)計(jì)量接近2時(shí),表明誤差項(xiàng)不存在一階自相關(guān);DW小于2,則存在正自相關(guān);DW大于2則存在負(fù)自相關(guān)。根據(jù)經(jīng)驗(yàn)規(guī)律,DW統(tǒng)計(jì)量在1.5 ~ 2.5之間可以認(rèn)為不存在自相關(guān);小于1.5表示存在正自相關(guān);大于2.5表示存在負(fù)自相關(guān)。
1 # 進(jìn)行DW檢驗(yàn) 2 print('-------------------------------------------') 3 dw_test = sm.stats.stattools.durbin_watson(model.resid) 4 print('Durbin-Watson test:') 5 print('DW:', dw_test)
6.5利用QQ圖看正態(tài)性
QQ圖,全稱Quantile-Quantile圖,是一種用于檢驗(yàn)數(shù)據(jù)分布是否符合某種理論分布(通常為正態(tài)分布)的方法。它通過將數(shù)據(jù)的樣本分位數(shù)與理論分位數(shù)進(jìn)行比較,并將其繪制成散點(diǎn)圖的方式來展示數(shù)據(jù)的分布情況。
如果樣本分布與理論分布一致,則散點(diǎn)圖應(yīng)該大致呈現(xiàn)出一條直線。如果兩者之間存在差異,則散點(diǎn)圖會(huì)偏離一條直線,并呈現(xiàn)出“S”型或其他非線性形狀,這表明樣本數(shù)據(jù)的分布與理論分布不一致。
1 #QQ圖看正態(tài)性 2 qqplot(model.resid, line="q", fit=True) 3 plt.show()
七.模型評價(jià)
7.1生成模型預(yù)測數(shù)據(jù)
利用已生成的模型對數(shù)據(jù)進(jìn)行重新預(yù)測,預(yù)測的數(shù)據(jù) 與 原數(shù)據(jù)(真實(shí)數(shù)據(jù))進(jìn)行比對。
1 #模型預(yù)測 2 print('-------------------------------------------') 3 predict= model.predict(1,95)#dynamic=True) 4 # print('模型預(yù)測:','\n',predict) 5 #反向差分運(yùn)算 6 # 對差分后的時(shí)間序列進(jìn)行逆差分運(yùn)算,兩個(gè)參數(shù):差分?jǐn)?shù)據(jù)序列和原始數(shù)據(jù)序列 7 def inverse_diff(diff_series, original_series): 8 inverted = [] 9 prev = original_series.iloc[0] 10 for val in diff_series: 11 current = val + prev 12 inverted.append(current) 13 prev = current 14 return pd.Series(inverted, index=original_series.index[1:]) 15 n_predict=inverse_diff(predict,t_s) 16 print('模型預(yù)測:','\n',n_predict)
7.2真實(shí)值與預(yù)測值劃入同意圖像進(jìn)行比對
1 # #畫圖 2 plt.figure(figsize=(10,4)) 3 plt.plot(t_s.index,t_s,label='actual') 4 plt.plot(predict.index,n_predict,label='predict') 5 plt.xticks([]) 6 plt.legend(['actual','predict']) 7 plt.xlabel('time(year)') 8 plt.ylabel('SUNACTIVITY') 9 plt.show()
八.未來數(shù)據(jù)預(yù)測
進(jìn)行未來某幾期的數(shù)據(jù)預(yù)測,steps=2表示要預(yù)測未來兩期, alpha=0.05表示預(yù)測的未來數(shù)據(jù)的95%的置信區(qū)間。預(yù)測結(jié)果仍需進(jìn)行反向差分運(yùn)算。
1 print('-------------------------------------------') 2 # 進(jìn)行三步預(yù)測,并輸出95%置信區(qū)間 3 steps=3 #未來三期預(yù)測 4 forecast= model.get_forecast(steps=steps) 5 table=pd.DataFrame(forecast.summary_frame()) 6 7 # print(table.iloc[1]) 8 table.iloc[0]=table.iloc[0]+t_s[-1] 9 # print(table.iloc[0, 0]) 10 for i in range(steps-1): 11 table.iloc[i+1]=table.iloc[i+1]+table.iloc[i, 0] 12 print(table)
Python完整代碼:


import numpy as np import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #ACF與PACF import statsmodels.tsa.stattools as ts #adf檢驗(yàn) from statsmodels.tsa.arima.model import ARIMA #ARIMA模型 from statsmodels.graphics.api import qqplot #qq圖 from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test #用于LingBox隨機(jī)性檢驗(yàn) plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False df=pd.read_excel('M17.xlsx') print(df["水位"].head()) # 創(chuàng)建一個(gè)DatetimeIndex對象,指定時(shí)間范圍為2021年1月1日到1月5日 dates = pd.date_range(start='1860-01-01', end='1955-12-31',freq='AS') # 創(chuàng)建一個(gè)Series對象,將列表作為數(shù)據(jù),DatetimeIndex對象作為索引 t_s = pd.Series(data=df["水位"].tolist(), index=dates) t_s.index = t_s.index.strftime('%Y') #時(shí)序圖 plt.plot(df['年份'],df['水位']) plt.xlabel("年份") plt.ylabel("水位") plt.show() #純隨機(jī)性檢驗(yàn)(白噪聲檢驗(yàn)) #Ljung-Box 檢驗(yàn),LB檢驗(yàn),用來做純隨機(jī)性檢驗(yàn)的,單位根檢驗(yàn)也屬于 print('-------------------------------------------') print("隨機(jī)性檢驗(yàn):",'\n',lb_test(df["水位"], return_df=True,lags=5)) # 進(jìn)行ADF檢驗(yàn) result = ts.adfuller(df['水位']) # 輸出ADF結(jié)果 print('-------------------------------------------') print('ADF檢驗(yàn)結(jié)果:') print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1]) print('Lags Used: %d' % result[2]) print('Observations Used: %d' % result[3]) print('Critical Values:') for key, value in result[4].items(): print('\t%s: %.3f' % (key, value)) ##### 差分運(yùn)算 def diff(timeseries): new_df=timeseries.diff(periods=1).dropna()#dropna刪除NaN new_df.plot(color='orange',title='diff1') return new_df #進(jìn)行一階差分 print("============================================================") ndf=diff(df["水位"]) print(ndf) # dif = pd.Series(np.diff(df['水位'], n=1)) # print(dif) #再次進(jìn)行ADF檢驗(yàn) result2 = ts.adfuller(ndf) # 輸出ADF結(jié)果 print('-------------------------------------------') print('差分后序列的ADF檢驗(yàn)結(jié)果:') print('ADF Statistic: %f' % result2[0]) print('p-value: %f' % result2[1]) print('Lags Used: %d' % result2[2]) print('Observations Used: %d' % result2[3]) print('Critical Values:') for key, value in result2[4].items(): print('\t%s: %.3f' % (key, value)) #模型選擇與定階 #模型選擇:繪制ACF與PACF,即自相關(guān)圖和偏自相關(guān)圖 #### 繪制ACF與PACF的圖像 def plot_acf_pacf(timeseries): #利用ACF和PACF判斷模型階數(shù) plot_acf(timeseries,lags=timeseries.shape[0]%2) #延遲數(shù) plot_pacf(timeseries,lags=timeseries.shape[0]%2) plt.show() plot_acf_pacf(ndf) #迭代調(diào)優(yōu) print('-------------------------------------------') #AIC timeseries=ndf AIC=sm.tsa.stattools.arma_order_select_ic(timeseries,max_ar=4,max_ma=4,ic='aic')['aic_min_order'] #BIC BIC=sm.tsa.stattools.arma_order_select_ic(timeseries,max_ar=4,max_ma=4,ic='bic')['bic_min_order'] print('the AIC is{}\nthe BIC is{}\n'.format(AIC,BIC)) #模型構(gòu)建 print('-------------------------------------------') model= ARIMA(ndf, order=(1, 1, 2)).fit() print(model.params) print(model.summary()) #殘差檢驗(yàn):檢驗(yàn)殘差是否服從正態(tài)分布,畫圖查看,然后檢驗(yàn) #殘差圖 model.resid.plot(figsize=(10,3)) plt.show() #進(jìn)行Jarque-Bera檢驗(yàn) print('-------------------------------------------') jb_test = sm.stats.stattools.jarque_bera(model.resid) print('Jarque-Bera test:') print('JB:', jb_test[0]) print('p-value:', jb_test[1]) print('Skew:', jb_test[2]) print('Kurtosis:', jb_test[3]) # 進(jìn)行Ljung-Box檢驗(yàn) print('-------------------------------------------') lb_test= sm.stats.diagnostic.acorr_ljungbox(model.resid, return_df=True,lags=5) print('Ljung-Box test:','\n',lb_test) # 進(jìn)行DW檢驗(yàn) print('-------------------------------------------') dw_test = sm.stats.stattools.durbin_watson(model.resid) print('Durbin-Watson test:') print('DW:', dw_test) #QQ圖看正態(tài)性 qqplot(model.resid, line="q", fit=True) plt.show() #模型預(yù)測 print('-------------------------------------------') predict= model.predict(1,95)#dynamic=True) # print('模型預(yù)測:','\n',predict) #反向差分運(yùn)算 # 對差分后的時(shí)間序列進(jìn)行逆差分運(yùn)算,兩個(gè)參數(shù):差分?jǐn)?shù)據(jù)序列和原始數(shù)據(jù)序列 def inverse_diff(diff_series, original_series): inverted = [] prev = original_series.iloc[0] for val in diff_series: current = val + prev inverted.append(current) prev = current return pd.Series(inverted, index=original_series.index[1:]) n_predict=inverse_diff(predict,t_s) print('模型預(yù)測:','\n',n_predict) # #畫圖 plt.figure(figsize=(10,4)) plt.plot(t_s.index,t_s,label='actual') plt.plot(predict.index,n_predict,label='predict') plt.xticks([]) plt.legend(['actual','predict']) plt.xlabel('time(year)') plt.ylabel('SUNACTIVITY') plt.show() print('-------------------------------------------') # 進(jìn)行三步預(yù)測,并輸出95%置信區(qū)間 steps=3 #未來三期預(yù)測 forecast= model.get_forecast(steps=steps) table=pd.DataFrame(forecast.summary_frame()) # print(table.iloc[1]) table.iloc[0]=table.iloc[0]+t_s[-1] # print(table.iloc[0, 0]) for i in range(steps-1): table.iloc[i+1]=table.iloc[i+1]+table.iloc[i, 0] print(table)
?
Python的完整包裝之后的庫:


1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 import statsmodels.api as sm 5 from statsmodels.graphics.tsaplots import plot_acf,plot_pacf #ACF與PACF 6 import statsmodels.tsa.stattools as ts #adf檢驗(yàn) 7 from statsmodels.tsa.arima.model import ARIMA #ARIMA模型 8 from statsmodels.graphics.api import qqplot #qq圖 9 from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test #用于LingBox隨機(jī)性檢驗(yàn) 10 11 plt.rcParams['font.sans-serif'] = ['SimHei'] 12 plt.rcParams['axes.unicode_minus'] = False 13 14 class Time_ARIMA(): 15 def __init__(self,path): 16 try: 17 self.df = pd.read_csv(path) 18 except: 19 self.df=pd.read_excel(path) 20 # print(self.df.iloc[:,0]) 21 start=str(self.df.iloc[0,0])+'-01-01' 22 end=str(self.df.iloc[-1,0])+'-01-01' 23 # 創(chuàng)建一個(gè)DatetimeIndex對象,指定時(shí)間范圍為2021年1月1日到1月5日 24 dates = pd.date_range(start=start, end=end, freq='AS') 25 # 創(chuàng)建一個(gè)Series對象,將列表作為數(shù)據(jù),DatetimeIndex對象作為索引 26 self.t_s = pd.Series(data=self.df.iloc[:,1].tolist(), index=dates) 27 self.t_s.index = self.t_s.index.strftime('%Y') 28 # print(self.t_s) 29 self.timeseries=None 30 self.flag=0 31 self.BIC=None 32 self.model=None 33 34 def Timing_Diagram(self): 35 # 時(shí)序圖 36 plt.plot(self.t_s) 37 plt.xlabel(self.df.iloc[:,0].name) 38 plt.xticks(np.arange(0,self.df.shape[0], step=10)) #設(shè)置橫坐標(biāo)間距 39 plt.ylabel(self.df.iloc[:,1].name) 40 plt.show() 41 42 def Diff_pre_sequence_test(self): 43 # 純隨機(jī)性檢驗(yàn)(白噪聲檢驗(yàn)) 44 # Ljung-Box 檢驗(yàn),LB檢驗(yàn),用來做純隨機(jī)性檢驗(yàn)的,單位根檢驗(yàn)也屬于 45 print('==================原始序列的純隨機(jī)性檢驗(yàn)==================') 46 print("Ljung-Box檢驗(yàn):", '\n', lb_test(self.df.iloc[:,1], return_df=True, lags=5)) 47 # 進(jìn)行ADF檢驗(yàn) 48 result = ts.adfuller(self.df.iloc[:,1]) 49 # 輸出ADF結(jié)果 50 print('---------------------ADF檢驗(yàn)結(jié)果----------------------') 51 print('ADF Statistic: %f' % result[0]) 52 print('p-value: %f' % result[1]) 53 print('Lags Used: %d' % result[2]) 54 print('Observations Used: %d' % result[3]) 55 print('Critical Values:') 56 for key, value in result[4].items(): 57 print('\t%s: %.3f' % (key, value)) 58 print('====================================================') 59 60 def Diff_operation(self,timeseries=None): 61 try: 62 #二階及以上差分 63 ndf = timeseries.diff(periods=1).dropna() # dropna刪除NaN 64 except: 65 #一階差分 66 ndf = self.t_s.diff(periods=1).dropna() # dropna刪除NaN 67 ndf.plot(color='orange', title='殘差圖') 68 self.flag+=1 69 self.timeseries=ndf 70 return ndf 71 72 def Diff_after_sequence_testing(self): 73 # 再次進(jìn)行ADF檢驗(yàn) 74 if self.flag==0: 75 print("未進(jìn)行差分運(yùn)算,不必再次進(jìn)行ADF檢驗(yàn)") 76 else: 77 result2 = ts.adfuller(self.timeseries) 78 # 輸出ADF結(jié)果 79 print('------------差分后序列的ADF檢驗(yàn)結(jié)果------------') 80 print('ADF Statistic: %f' % result2[0]) 81 print('p-value: %f' % result2[1]) 82 print('Lags Used: %d' % result2[2]) 83 print('Observations Used: %d' % result2[3]) 84 print('Critical Values:') 85 for key, value in result2[4].items(): 86 print('\t%s: %.3f' % (key, value)) 87 88 89 def ACF_and_PACF(self): 90 # 繪制ACF與PACF的圖像,利用ACF和PACF判斷模型階數(shù) 91 # print(int(self.t_s.shape[0]/2)) 92 if self.flag == 0: 93 plot_acf(self.t_s, lags=int(self.t_s.shape[0] / 2) - 1) # 延遲數(shù) 94 plot_pacf(self.t_s, lags=int(self.t_s.shape[0] / 2) - 1) 95 plt.show() 96 else: 97 plot_acf(self.timeseries, lags=int(pd.Series(self.timeseries).shape[0] / 2 - 1)) # 延遲數(shù) 98 plot_pacf(self.timeseries, lags=int(pd.Series(self.timeseries).shape[0] / 2 - 1)) 99 plt.show() 100 101 def Model_order_determination(self): 102 # 迭代調(diào)優(yōu) 103 if self.flag==0: 104 timeseries=self.t_s 105 else: 106 timeseries=self.timeseries 107 # AIC 108 AIC = sm.tsa.stattools.arma_order_select_ic(timeseries, max_ar=4, max_ma=4, ic='aic')['aic_min_order'] 109 # BIC 110 BIC = sm.tsa.stattools.arma_order_select_ic(timeseries, max_ar=4, max_ma=4, ic='bic')['bic_min_order'] 111 print('---AIC與BIC準(zhǔn)則定階---') 112 print('the AIC is{}\nthe BIC is{}\n'.format(AIC, BIC),end='') 113 print('--------------------') 114 self.BIC=BIC 115 116 def Model_building_machine(self): 117 # if self.flag==0: 118 # timeseries=self.t_s 119 # else: 120 # timeseries=self.timeseries 121 model = ARIMA(self.t_s, order=(self.BIC[0], self.flag, self.BIC[1])).fit() 122 print('--------參數(shù)估計(jì)值-------') 123 print(model.params) 124 print(model.summary()) 125 self.model=model 126 127 def Model_building_artificial(self,order=(0,0,0)): 128 # if self.flag==0: 129 # timeseries=self.t_s 130 # else: 131 # timeseries=self.timeseries 132 model = ARIMA(self.t_s, order=order).fit() 133 print('--------參數(shù)估計(jì)值-------') 134 print(model.params) 135 print(model.summary()) 136 self.model = model 137 138 def Model_checking(self): 139 # 殘差檢驗(yàn):檢驗(yàn)殘差是否服從正態(tài)分布,畫圖查看,然后檢驗(yàn) 140 # 殘差圖 141 self.model.resid.plot(figsize=(10, 3)) 142 plt.title("殘差圖") 143 plt.show() 144 145 # 進(jìn)行Jarque-Bera檢驗(yàn) 146 jb_test = sm.stats.stattools.jarque_bera(self.model.resid) 147 print("==================================================") 148 print('------------Jarque-Bera檢驗(yàn)-----------') 149 print('Jarque-Bera test:') 150 print('JB:', jb_test[0]) 151 print('p-value:', jb_test[1]) 152 print('Skew:', jb_test[2]) 153 print('Kurtosis:', jb_test[3]) 154 155 # 進(jìn)行Ljung-Box檢驗(yàn) 156 lb_test = sm.stats.diagnostic.acorr_ljungbox(self.model.resid, return_df=True, lags=5) 157 print('------------Ljung-Box檢驗(yàn)-------------') 158 print('Ljung-Box test:', '\n', lb_test) 159 160 # 進(jìn)行DW檢驗(yàn) 161 dw_test = sm.stats.stattools.durbin_watson(self.model.resid) 162 print('---------------DW檢驗(yàn)----------------') 163 print('Durbin-Watson test:') 164 print('DW:', dw_test) 165 print("==================================================") 166 167 # QQ圖看正態(tài)性 168 qqplot(self.model.resid, line="q", fit=True) 169 plt.title("Q-Q圖") 170 plt.show() 171 172 def Model_prediction_accuracy(self): 173 # 模型預(yù)測 174 n_predict = self.model.predict(1, self.t_s.shape[0]) 175 n_predict.index = n_predict.index.strftime('%Y') 176 print('模型預(yù)測:', '\n', n_predict) 177 # if self.flag==0: 178 # n_predict = self.model.predict(1, self.t_s.shape[0]) 179 # n_predict.index = n_predict.index.strftime('%Y') 180 # print('模型預(yù)測:', '\n', n_predict) 181 # 182 # else: 183 # # 反向差分運(yùn)算 184 # # 對差分后的時(shí)間序列進(jìn)行逆差分運(yùn)算,兩個(gè)參數(shù):差分?jǐn)?shù)據(jù)序列和原始數(shù)據(jù)序列 185 # def inverse_diff(diff_series, original_series): 186 # inverted = [] 187 # prev = original_series.iloc[0] 188 # for val in diff_series: 189 # current = val + prev 190 # inverted.append(current) 191 # prev = current 192 # return pd.Series(inverted, index=original_series.index[1:]) 193 # 194 # predict = self.model.predict(1, pd.Series(self.timeseries).shape[0]) 195 # n_predict = inverse_diff(predict, self.t_s) 196 # print('模型預(yù)測:', '\n',n_predict) 197 print('-------------------------------------------') 198 199 # #畫圖 200 plt.figure(figsize=(10, 4)) 201 plt.plot(self.t_s.index, self.t_s, label='actual') 202 plt.plot(n_predict.index, n_predict, label='predict') 203 # plt.xticks([]) 204 plt.xticks(np.arange(0, self.df.shape[0], step=10)) # 設(shè)置橫坐標(biāo)間距 205 plt.legend(['actual', 'predict']) 206 plt.xlabel('time(year)') 207 plt.ylabel('SUNACTIVITY') 208 plt.title("真實(shí)值與預(yù)測值對比") 209 plt.show() 210 211 def Future_prediction(self,steps=2): 212 # 進(jìn)行三步預(yù)測,并輸出95%置信區(qū)間 213 214 # steps = 3 # 未來三期預(yù)測 215 forecast = self.model.get_forecast(steps=steps) 216 table = pd.DataFrame(forecast.summary_frame()) 217 218 # # print(table.iloc[1]) 219 # table.iloc[0] = table.iloc[0] + self.t_s[-1] 220 # # print(table.iloc[0, 0]) 221 # for i in range(steps - 1): 222 # table.iloc[i + 1] = table.iloc[i + 1] + table.iloc[i, 0] 223 table.index = table.index.strftime('%Y') 224 print('--------------------------------------------------------------') 225 print(table) 226 print('--------------------------------------------------------------')
對應(yīng)的調(diào)用方式:文章來源:http://www.zghlxwxcb.cn/news/detail-436627.html


1 import TARMA 2 #不含差分 3 ts=TARMA.Time_ARIMA(path='./M17.xlsx') #實(shí)例化對象(放入文件路徑) 4 ts.Timing_Diagram() #時(shí)序圖 5 ts.Diff_pre_sequence_test() #純隨機(jī)性檢驗(yàn) 6 7 ts.ACF_and_PACF() #自相關(guān)圖與偏自相關(guān)圖 8 ts.Model_order_determination() #根據(jù)AIC準(zhǔn)則與BIC準(zhǔn)則進(jìn)行機(jī)器定階 9 10 #下面兩種定階方式二選一 11 # ts.Model_building_artificial(order=(1,1,2)) #模型構(gòu)建(人工定階),order中的三個(gè)參數(shù)為p,d,q 12 ts.Model_building_machine() #模型構(gòu)建(基于機(jī)器自己定階) 13 14 ts.Model_checking() #模型檢驗(yàn) 15 ts.Model_prediction_accuracy() #模型可行性預(yù)測 16 ts.Future_prediction(steps=3) #未來數(shù)據(jù)預(yù)測默認(rèn)為兩期,steps參數(shù)可自定義


1 import TARMA 2 ts=TARMA.Time_ARIMA(path='./M17.xlsx') #實(shí)例化對象(放入文件路徑) 3 ts.Timing_Diagram() #時(shí)序圖 4 ts.Diff_pre_sequence_test() #純隨機(jī)性檢驗(yàn) 5 # 進(jìn)行一階差分(需要多階差分多次調(diào)用差分即可(模型會(huì)隨差分次數(shù)隨之改變,不必理會(huì)) 6 ts.Diff_operation() #進(jìn)行一階差分,當(dāng)ADF檢驗(yàn)合適即平穩(wěn)且非白噪聲序列不進(jìn)行差分 7 ts.Diff_after_sequence_testing() #差分運(yùn)算后的ADF檢驗(yàn),未進(jìn)行差分運(yùn)算則不調(diào)用 8 # #進(jìn)行二階差分 9 # ts.Diff_operation() 10 # ts.Diff_after_sequence_testing() 11 12 ts.ACF_and_PACF() #自相關(guān)圖與偏自相關(guān)圖 13 ts.Model_order_determination() #根據(jù)AIC準(zhǔn)則與BIC準(zhǔn)則進(jìn)行機(jī)器定階 14 15 #下面兩種定階方式二選一 16 # ts.Model_building_artificial(order=(1,1,2)) #模型構(gòu)建(人工定階),order中的三個(gè)參數(shù)為p,d,q 17 ts.Model_building_machine() #模型構(gòu)建(基于機(jī)器自己定階) 18 19 ts.Model_checking() #模型檢驗(yàn) 20 ts.Model_prediction_accuracy() #模型可行性預(yù)測 21 ts.Future_prediction(steps=3) #未來數(shù)據(jù)預(yù)測默認(rèn)為兩期,steps參數(shù)可自定義
?文章來源地址http://www.zghlxwxcb.cn/news/detail-436627.html
到了這里,關(guān)于用Python語言進(jìn)行時(shí)間序列ARIMA模型分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!