国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

這篇具有很好參考價(jià)值的文章主要介紹了用Python語言進(jìn)行時(shí)間序列ARIMA模型分析。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

應(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ù)樣例:

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

以下是數(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()

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

三.初步檢驗(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))

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

  其中 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))

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

  當(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['水位'])

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

  或者如下方式也可以進(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))

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

  如果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 等。

用Python語言進(jìn)行時(shí)間序列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)

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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))

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

五.模型構(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)算差分!

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

六.模型后檢驗(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()

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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])

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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)

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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)

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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()

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

七.模型評價(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)

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

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()

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析

八.未來數(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語言進(jìn)行時(shí)間序列ARIMA模型分析

Python完整代碼:

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析用Python語言進(jìn)行時(shí)間序列ARIMA模型分析
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)
View Code

?

Python的完整包裝之后的庫:

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析用Python語言進(jìn)行時(shí)間序列ARIMA模型分析
  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('--------------------------------------------------------------')
TARMA

對應(yīng)的調(diào)用方式:

用Python語言進(jìn)行時(shí)間序列ARIMA模型分析用Python語言進(jìn)行時(shí)間序列ARIMA模型分析
 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ù)可自定義
不進(jìn)行差分運(yùn)算:test
用Python語言進(jìn)行時(shí)間序列ARIMA模型分析用Python語言進(jìn)行時(shí)間序列ARIMA模型分析
 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ù)可自定義
進(jìn)行了差分運(yùn)算:test2

?文章來源地址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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ARIMA模型時(shí)間序列數(shù)據(jù)分析(附python代碼)

    ARIMA模型時(shí)間序列數(shù)據(jù)分析(附python代碼)

    ARIMA模型建模流程? 1 )平穩(wěn)性檢驗(yàn)與差分處理 我們選取原始數(shù)據(jù) bus 中的“ prf_get_person_count ”列,并截取前 32 個(gè)站點(diǎn)的數(shù)據(jù)進(jìn)行平穩(wěn)性檢驗(yàn),這里采用的是 ADF 檢驗(yàn)確定數(shù)據(jù)的平穩(wěn)性,導(dǎo)入 statsmodels 包下的 adfuller 函數(shù),該函數(shù)返回 adf 值與概率 p 值。若原始序列不平穩(wěn),就

    2024年02月01日
    瀏覽(22)
  • Python中的ARIMA模型、SARIMA模型和SARIMAX模型對時(shí)間序列預(yù)測

    Python中的ARIMA模型、SARIMA模型和SARIMAX模型對時(shí)間序列預(yù)測

    最近我們被客戶要求撰寫關(guān)于時(shí)間序列預(yù)測的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。? 使用ARIMA模型,您可以使用序列過去的值預(yù)測時(shí)間序列。在本文中,我們從頭開始構(gòu)建了一個(gè)最佳ARIMA模型,并將其擴(kuò)展到Seasonal ARIMA(SARIMA)和SARIMAX模型。 時(shí)間序列是在定期時(shí)間間隔內(nèi)記

    2024年02月04日
    瀏覽(33)
  • 組合預(yù)測模型 | ARIMA-LSTM時(shí)間序列預(yù)測(Python)

    組合預(yù)測模型 | ARIMA-LSTM時(shí)間序列預(yù)測(Python)

    預(yù)測結(jié)果 基本介紹 ARIMA-LSTM時(shí)間序列預(yù)測(Python完整源碼和數(shù)據(jù)) ARIMA-LSTM時(shí)間序列預(yù)測,AQI預(yù)測(Python完整源碼和數(shù)據(jù)) 組合模型預(yù)測 ARIMA和LSTM都是用于時(shí)間序列預(yù)測的經(jīng)典模型。ARIMA是一種基于差分和自回歸移動(dòng)平均模型的統(tǒng)計(jì)方法,它可以用來捕捉時(shí)間序列中的趨勢和季

    2024年02月16日
    瀏覽(24)
  • 時(shí)間序列ARIMA模型

    時(shí)間序列ARIMA模型

    ARIMA模型的全稱叫做自回歸移動(dòng)平均模型,全稱是(ARIMA,Autoregressive Integrated Moving Average Model)。也記作ARIMA(p,d,q),是統(tǒng)計(jì)模型(statisticmodel)中最常見的一種用來進(jìn)行時(shí)間序列預(yù)測的模型。 將非平穩(wěn)時(shí)間序列轉(zhuǎn)化為平穩(wěn)時(shí)間序列然后將因變量僅對它的滯后值以及隨機(jī)誤差項(xiàng)的現(xiàn)值和

    2024年02月03日
    瀏覽(25)
  • 時(shí)間序列模型-ARIMA

    描述當(dāng)前值與歷史值之間的關(guān)系,用變量自身的歷史數(shù)據(jù)對自身進(jìn)行預(yù)測; 自回歸模型必須滿足平穩(wěn)性的要求;(何為平穩(wěn)性:見時(shí)間序列數(shù)據(jù)分析基本概念) p階自回歸過程的公式定義: ????????其中是當(dāng)前值,是常數(shù)項(xiàng),p是階數(shù),是自相關(guān)系數(shù),是誤差。 1.1.1 自回歸

    2023年04月08日
    瀏覽(29)
  • 數(shù)據(jù)分享|R語言分析上??諝赓|(zhì)量指數(shù)數(shù)據(jù):kmean聚類、層次聚類、時(shí)間序列分析:arima模型、指數(shù)平滑法...

    數(shù)據(jù)分享|R語言分析上??諝赓|(zhì)量指數(shù)數(shù)據(jù):kmean聚類、層次聚類、時(shí)間序列分析:arima模型、指數(shù)平滑法...

    最近我們被客戶要求撰寫關(guān)于上海空氣質(zhì)量指數(shù)的研究報(bào)告。本文向大家介紹R語言對上海PM2.5等空氣質(zhì)量數(shù)據(jù) ( 查看文末了解數(shù)據(jù)免費(fèi)獲取方式 ) 間的相關(guān)分析和預(yù)測分析,主要內(nèi)容包括其使用實(shí)例,具有一定的參考價(jià)值,需要的朋友可以參考一下 ( 點(diǎn)擊文末“閱讀原文

    2024年02月09日
    瀏覽(28)
  • 使用ARIMA進(jìn)行時(shí)間序列預(yù)測|就代碼而言

    model.fit().predict()函數(shù)參數(shù)的意思 model.fit() 函數(shù)是用來擬合ARIMA模型的,它會(huì)根據(jù)提供的時(shí)間序列數(shù)據(jù)來估計(jì)模型的參數(shù)。在這個(gè)函數(shù)中,沒有需要指定額外的參數(shù)。 model.predict() 函數(shù)是用來進(jìn)行時(shí)間序列的預(yù)測的,它可以在擬合后的模型上進(jìn)行預(yù)測。在進(jìn)行預(yù)測時(shí),需要指定

    2024年02月16日
    瀏覽(21)
  • 時(shí)間序列模型算法 - ARIMA (一)

    時(shí)間序列模型算法 - ARIMA (一)

    時(shí)間序列是研究數(shù)據(jù)隨時(shí)間變化而變化的一種算法。是一種預(yù)測性分析算法。它的基本出發(fā)點(diǎn)就是事物發(fā)展都有連續(xù)性,按照它本身固有的規(guī)律進(jìn)行。 時(shí)間序列的常用算法包括: 有這幾個(gè)那如何選擇模型呢 首先我們要知道時(shí)間序列就是按照時(shí)間順序排列,隨時(shí)間變化的隨機(jī)

    2023年04月27日
    瀏覽(21)
  • 【時(shí)間序列數(shù)據(jù)挖掘】ARIMA模型

    【時(shí)間序列數(shù)據(jù)挖掘】ARIMA模型

    目錄 0、前言 一、移動(dòng)平均模型MA 二、自回歸模型AR 三、自回歸移動(dòng)平均模型ARMA 四、自回歸移動(dòng)平均模型ARIMA 【總結(jié)】 傳統(tǒng)時(shí)間序列分析模型: ARIMA模型是一個(gè)非常靈活的模型,對于時(shí)間序列的好多特征都能夠進(jìn)行描述,比如說平穩(wěn)性特征,季節(jié)性特征,趨勢性特征。 AR

    2024年02月07日
    瀏覽(21)
  • 時(shí)間序列預(yù)測 | Matlab自回歸差分移動(dòng)平均模型ARIMA時(shí)間序列預(yù)測

    時(shí)間序列預(yù)測 | Matlab自回歸差分移動(dòng)平均模型ARIMA時(shí)間序列預(yù)測

    效果一覽 文章概述 時(shí)間序列預(yù)測 | Matlab自回歸差分移動(dòng)平均模型ARIMA時(shí)間序列預(yù)測,單列數(shù)據(jù)輸入模型 評價(jià)指標(biāo)包括:MAE、RMSE和R2等,代碼質(zhì)量極高,方便學(xué)習(xí)和替換數(shù)據(jù)。要求2018版本及以上。 部分源碼

    2024年02月13日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包