https://blog.csdn.net/orDream/article/details/100013682 上面這一篇是對 https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/
的翻譯,但是版本已經過低部分代碼已經失效,該博主對博文內容也不完全且有錯誤,在此對其python的部分做了更正和補充。
具體的錯誤可以查看https://www.cnblogs.com/xingnie/p/12248732.html
#加載和處理時間序列
2
import pandas as pd import numpy as np import matplotlib.pylab as plt %matplotlib inline from matplotlib.pylab import rcParams rcParams['figure.figsize'] = 15, 6
No output
3
data = pd.read_csv('AirPassengers.csv') print(data.head(n = 10)) # 默認 n為5) print('\n Data Types:') print(data.dtypes)
Month #Passengers 0 1949-01 112 1 1949-02 118 2 1949-03 132 3 1949-04 129 4 1949-05 121 5 1949-06 135 6 1949-07 148 7 1949-08 148 8 1949-09 136 9 1949-10 119 Data Types: Month object #Passengers int64 dtype: object
5
#數據類型是“object”和“int”,所以它仍然不是作為TS對象讀取的。 #為了將數據讀取為時間序列,我們必須將特殊參數傳遞給read_csv命令: dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m') data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'], index_col='Month',date_parser=dateparse) print(data.head()) #parse_dates:指定包含日期-時間信息的列。正如我們上面所說,列名是’ Month '。 #index_col:將panda用於TS數據背后的一個關鍵思想是,索引必須是描述日期-時間信息的變量。所以這個參數告訴熊貓使用“Month”列作為索引。 #date_parser:指定一個函數,該函數將輸入字符串轉換為datetime變量。默認情況下,熊貓讀取的數據格式為“YYYY-MM-DD HH:MM:SS”。如果數據不是這種格式,則必須手動定義格式。類似於這里定義的dataparse函數可以用於此目的。
#Passengers Month 1949-01-01 112 1949-02-01 118 1949-03-01 132 1949-04-01 129 1949-05-01 121
6
#可以看到數據的索引是time對象,列是#passenger。我們可以用以下命令交叉檢查索引的數據類型 data.index
6
DatetimeIndex(['1949-01-01', '1949-02-01', '1949-03-01', '1949-04-01', '1949-05-01', '1949-06-01', '1949-07-01', '1949-08-01', '1949-09-01', '1949-10-01', ... '1960-03-01', '1960-04-01', '1960-05-01', '1960-06-01', '1960-07-01', '1960-08-01', '1960-09-01', '1960-10-01', '1960-11-01', '1960-12-01'], dtype='datetime64[ns]', name='Month', length=144, freq=None)
7
#dtype= 'datetime[ns] ’ 確認它是一個datetime對象。作為個人偏好,我將把列轉換成一個Series對象,以防止每次使用TS時引用列名。 ts = data['#Passengers'] ts.head(10)
7
Month 1949-01-01 112 1949-02-01 118 1949-03-01 132 1949-04-01 129 1949-05-01 121 1949-06-01 135 1949-07-01 148 1949-08-01 148 1949-09-01 136 1949-10-01 119 Name: #Passengers, dtype: int64
# 如何選擇選擇Series對象中的一個特定值
8
#1. Specific the index as a string constant: ts['1949-01-01'] #2. Import the datetime library and use 'datetime' function: from datetime import datetime ts[datetime(1949,1,1)]
8
112
9
#假設我們想要到1949年5月為止的所有數據。這可以通過兩種方式實現: #1. Specify the entire range: ts['1949-01-01':'1949-05-01'] #2. Use ':' if one of the indices is at ends: ts[:'1949-05-01'] #與數字索引不同,這里 包含了結束索引。例如,如果我們將列表索引為[:5],那么它將返回索引處的值-[0,1,2,3,4]。但是這里的輸出中包含索引 ‘1949-05-01’。 #索引必須按照范圍排序。如果隨機打亂索引,這將不起作用
9
Month 1949-01-01 112 1949-02-01 118 1949-03-01 132 1949-04-01 129 1949-05-01 121 Name: #Passengers, dtype: int64
10
#1949年所有值的例子。可以這樣做: ts['1949']
10
Month 1949-01-01 112 1949-02-01 118 1949-03-01 132 1949-04-01 129 1949-05-01 121 1949-06-01 135 1949-07-01 148 1949-08-01 148 1949-09-01 136 1949-10-01 119 1949-11-01 104 1949-12-01 118 Name: #Passengers, dtype: int64
# 檢查時間序列平穩性 #常數平均值 #常數方差 #不依賴於時間的自協方差。
11
#簡單地繪制數據圖並進行可視化分析。數據可以使用以下命令繪制: plt.plot(ts)
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/pandas/plotting/_matplotlib/converter.py:103: FutureWarning: Using an implicitly registered datetime converter for a matplotlib plotting method. The converter was registered by pandas on import. Future versions of pandas will require you to explicitly register matplotlib converters. To register the converters: >>> from pandas.plotting import register_matplotlib_converters >>> register_matplotlib_converters() warnings.warn(msg, FutureWarning)
11
[<matplotlib.lines.Line2D at 0x10db131d0>]
很明顯,數據中有一個總的 增長趨勢,同時也有一些季節變化。然而,可能並不總是能夠做出這樣的視覺推斷(我們稍后將看到這樣的情況)。因此,更正式地說,我們可以使用以下方法檢查平穩性: 繪制滾動統計:我們可以繪制移動平均或移動方差,看看它是否隨時間而變化。我說的移動平均/方差是指在任何時刻t,我們取去年的平均/方差,即過去12個月。但這更像是一種視覺技巧。 Dickey-Fuller檢驗:這是檢驗平穩性的統計檢驗之一。這里零假設是 TS 是非平穩的。測試結果由 測試統計數據 和一些不同置信水平的臨界值組成。如果“檢驗統計量”小於“臨界值”,我們可以拒絕零假設,認為序列是平穩的。詳情請參閱本文。 在這一點上,這些概念聽起來可能不是很直觀。我建議閱讀前傳的文章(查閱相關資料進一步深入理解)。如果你對一些理論統計學感興趣,你可以參考Brockwell和Davis的 時間序列導論和預測。這本書的統計數據有點多,但如果你有閱讀字里行間的技巧,你就能理解其中的概念,並間接地接觸到統計數據。
14
#回到檢查平穩性,我們將經常使用滾動統計圖和Dickey-Fuller測試結果,所以我定義了一個函數,它接受TS作為輸入並為我們生成它們。請注意,我畫的是標准差而不是方差來保持單位接近均值。 from statsmodels.tsa.stattools import adfuller def test_stationarity(timeseries): #Determing rolling statistics rolmean = timeseries.rolling(12).mean() rolstd = timeseries.rolling(12).std() #Plot rolling statistics: orig = plt.plot(timeseries, color='blue',label='Original') mean = plt.plot(rolmean, color='red', label='Rolling Mean') std = plt.plot(rolstd, color='black', label = 'Rolling Std') plt.legend(loc='best') plt.title('Rolling Mean & Standard Deviation') plt.show(block=False) #Perform Dickey-Fuller test: print('Results of Dickey-Fuller Test:') dftest = adfuller(timeseries, autolag='AIC') dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used']) for key,value in dftest[4].items(): dfoutput['Critical Value (%s)'%key] = value print(dfoutput) test_stationarity(ts)
Results of Dickey-Fuller Test: Test Statistic 0.815369 p-value 0.991880 #Lags Used 13.000000 Number of Observations Used 130.000000 Critical Value (1%) -3.481682 Critical Value (5%) -2.884042 Critical Value (10%) -2.578770 dtype: float64
雖然標准差的變化很小,但均值明顯隨時間增加,這不是一個平穩序列。此外,測試統計量遠遠超過臨界值。注意,應該比較帶符號的值,而不是絕對值。
4. 如何使時間序列平穩? 雖然在許多TS模型中采用了平穩性假設,但幾乎沒有一個實際的時間序列是平穩的。統計學家已經找到了使序列平穩的方法,我們現在就來討論。實際上,讓一個級數完全靜止幾乎是不可能的,但我們試着讓它盡可能地接近。 讓我們來理解是什么使TS非平穩。TS不穩定的主要原因有兩個: 隨時間變化的趨勢平均值。例如,在這個例子中,我們看到平均來說,乘客的數量隨着時間在增長。 季節性——特定時間段的變化。由於工資的增加或節日的緣故,人們在特定的月份可能會有買車的傾向。 其基本原理是對序列中的趨勢和季節性進行建模或估計,並將其從序列中去除,得到一個平穩序列。在此基礎上,應用統計預測技術對該系列產品進行預測。最后一步是通過應用趨勢和季節約束將預測值轉換為原始規模。注意:我將討論一些方法。有些可能在這種情況下工作得很好,而另一些則不然。但我們的想法是掌握所有的方法,而不是只關注手頭的問題。讓我們從趨勢部分開始。
15
#估計和消除趨勢 #減少趨勢的首要技巧之一是轉變。 #例如,在這種情況下,我們可以清楚地看到,有一個顯著的積極趨勢。 #所以我們可以用變換來懲罰更大的值而不是更小的值。可以取對數,平方根,立方根,等等。為了簡單起見,我們在這里做一個對數變換: ts_log = np.log(ts) plt.plot(ts_log)
15
[<matplotlib.lines.Line2D at 0x1c23295710>]
在這個更簡單的例子中,很容易看到數據中的正向趨勢。但在有噪聲的情況下,它不是很直觀。因此,我們可以使用一些技術來估計或建模這種趨勢,然后將其從系列中刪除。有很多方法可以做到這一點,其中最常用的有: 匯總—取一段時間內的平均值,如月/周平均值 平滑——取滾動平均線 多項式擬合-擬合回歸模型 我將在這里討論平滑,您也應該嘗試其他技術,這可能會解決其他問題。平滑是指采用滾動估計,即考慮過去的幾個例子。有很多種方法,但我將在這里討論其中的兩種。
17
#移動平均數 #在這種方法中,我們根據時間序列的頻率取“k”連續值的平均值。這里我們可以取過去一年的平均值,也就是最近12個值。panda定義了用於確定滾動統計數據的特定函數。 moving_avg = ts_log.rolling(12).mean() plt.plot(ts_log) plt.plot(moving_avg, color='red')
17
[<matplotlib.lines.Line2D at 0x1c26335890>]
19
#紅線表示滾動平均值。從原級數中減去這個。注意,由於我們取最后12個值的平均值,所以前11個值沒有定義滾動平均值。這可以觀察到: ts_log_moving_avg_diff = ts_log - moving_avg ts_log_moving_avg_diff.head(12)
19
Month 1949-01-01 NaN 1949-02-01 NaN 1949-03-01 NaN 1949-04-01 NaN 1949-05-01 NaN 1949-06-01 NaN 1949-07-01 NaN 1949-08-01 NaN 1949-09-01 NaN 1949-10-01 NaN 1949-11-01 NaN 1949-12-01 -0.065494 Name: #Passengers, dtype: float64
20
#注意前11位是Nan。讓我們刪除這些NaN值,並檢查這些圖以測試平穩性 ts_log_moving_avg_diff.dropna(inplace=True) test_stationarity(ts_log_moving_avg_diff)
Results of Dickey-Fuller Test: Test Statistic -3.162908 p-value 0.022235 #Lags Used 13.000000 Number of Observations Used 119.000000 Critical Value (1%) -3.486535 Critical Value (5%) -2.886151 Critical Value (10%) -2.579896 dtype: float64
這個級數看起來好多了。滾動值似乎略有變化,但沒有特定的趨勢。同時,檢驗統計量 小於5%的臨界值 所以我們可以有95%的信心說這是一個平穩序列。 然而,這種特殊方法的缺點是必須嚴格定義時間段。在這種情況下,我們可以取年平均水平,但在預測股票價格等復雜情況下,很難得出一個數字。因此,我們采用“加權移動平均”,即賦予較近期值較高的權重。可以有許多技術來分配權重。
26
#一種流行的方法是 指數加權移動平均法,它將權重分配給所有具有衰減因子的先前值。在這里找到詳細信息。這可以在panda中實現為: expwighted_avg = pd.DataFrame.ewm(ts_log, halflife=12).mean() plt.plot(ts_log) plt.plot(expwighted_avg, color='red') #注意,這里使用參數“半衰期”來定義指數衰減的數量。這只是一個假設,主要取決於業務領域。其他參數,如跨度和質心也可以用來定義衰減,這是討論在上面共享的鏈接。
26
[<matplotlib.lines.Line2D at 0x1c2661c550>]
27
#現在,讓我們把這個從級數中移除,並檢查平穩性: ts_log_ewma_diff = ts_log - expwighted_avg test_stationarity(ts_log_ewma_diff)
Results of Dickey-Fuller Test: Test Statistic -3.601262 p-value 0.005737 #Lags Used 13.000000 Number of Observations Used 130.000000 Critical Value (1%) -3.481682 Critical Value (5%) -2.884042 Critical Value (10%) -2.578770 dtype: float64
#這個TS在平均值和標准差上的變化更小。同時,測試統計量 小於1%的臨界值,優於前一種情況。注意,在這種情況下,不會缺少值,因為從一開始所有的值都是給定權重的。所以即使沒有之前的值,它也能工作。
No output
消除趨勢和季節性 前面討論的簡單趨勢減少技術並不是在所有情況下都有效,特別是那些具有高季節性的技術。讓我們討論兩種消除趨勢和季節性的方法: 差分-在特定的時間間隔內進行差分 分解——對趨勢和季節性進行建模,並將它們從模型中移除。
28
#差分處理趨勢和季節性的最常見方法之一。在這種方法中,我們取某一時刻的觀測值與前一時刻的觀測值之差。這在提高平穩性方面很有效。一階差分可以在 Pandas 中運行: ts_log_diff = ts_log - ts_log.shift() plt.plot(ts_log_diff)
28
[<matplotlib.lines.Line2D at 0x1c26ac1a50>]
29
#這似乎大大降低了趨勢。讓我們用我們的圖來驗證: ts_log_diff.dropna(inplace=True) test_stationarity(ts_log_diff) #我們可以看到,平均值和std隨時間的變化有很小的變化。此外,Dickey-Fuller檢驗統計量小於10%的臨界值,因此TS是穩定的,有90%的置信度。我們也可以采取二階或三階的差異,這可能在某些應用中得到更好的結果。我把它們留給你去嘗試。
Results of Dickey-Fuller Test: Test Statistic -2.717131 p-value 0.071121 #Lags Used 14.000000 Number of Observations Used 128.000000 Critical Value (1%) -3.482501 Critical Value (5%) -2.884398 Critical Value (10%) -2.578960 dtype: float64
30
#分解: #在這種方法中,趨勢和季節性分別建模,並返回系列的其余部分。我將跳過統計數據,來看一下結果: from statsmodels.tsa.seasonal import seasonal_decompose decomposition = seasonal_decompose(ts_log) #趨勢 trend = decomposition.trend #季節性 seasonal = decomposition.seasonal #殘差 residual = decomposition.resid plt.subplot(411) plt.plot(ts_log, label='Original') plt.legend(loc='best') plt.subplot(412) plt.plot(trend, label='Trend') plt.legend(loc='best') plt.subplot(413) plt.plot(seasonal,label='Seasonality') plt.legend(loc='best') plt.subplot(414) plt.plot(residual, label='Residuals') plt.legend(loc='best') plt.tight_layout()
31
#這里我們可以看到趨勢,季節性從數據中分離出來我們可以對殘差進行建模。檢驗殘差的平穩性: ts_log_decompose = residual ts_log_decompose.dropna(inplace=True) test_stationarity(ts_log_decompose) #Dickey-Fuller檢驗統計量顯著低於1%的臨界值(p值<0.05)。所以這個TS非常接近於靜止。您還可以嘗試高級分解技術,這些技術可以生成更好的結果。另外,您應該注意,在這種情況下,將殘差轉換為未來數據的原始值並不十分直觀。
Results of Dickey-Fuller Test: Test Statistic -6.332387e+00 p-value 2.885059e-08 #Lags Used 9.000000e+00 Number of Observations Used 1.220000e+02 Critical Value (1%) -3.485122e+00 Critical Value (5%) -2.885538e+00 Critical Value (10%) -2.579569e+00 dtype: float64
5.預測時間序列 我們看到了不同的技術它們都能很好地使 TS 靜止。讓我們在差分后的TS上做模型,因為這是一種非常流行的技術。此外,在這種情況下,在預測殘差中添加噪聲和季節性因素也相對容易。執行趨勢和季節估計技術后,可以出現兩種情況: 一個嚴格平穩的序列,各值之間不依賴。這是一個簡單的例子,我們可以把殘差建模為白噪聲。但這種情況非常罕見。 值之間具有顯著相關性的序列。在這種情況下,我們需要使用一些統計模型,如ARIMA來預測數據。 讓我給你簡單介紹一下ARIMA。我不會詳細介紹技術細節,但是如果您希望更有效地應用這些概念,您應該詳細了解這些概念。ARIMA代表自回歸綜合移動平均線。平穩時間序列的ARIMA預測只不過是一個線性(類似於線性回歸)方程。預測因子依賴於ARIMA模型的參數(p,d,q):AR(自回歸)項數§: AR項只是因變量的滯后。例如,如果p是5,那么x(t)的預測器將是x(t-1)……x(t-5)。 MA(移動平均)項數(q): MA項是預測方程中的滯后預測誤差。例如,如果q是5,x(t)的預測因子將是e(t-1)…e(t-5)其中e(i)是第i個時刻的移動平均線與實際值之間的差值。 差異數量(d):這些是非季節性差異的數量,即在本例中我們取一階差異。所以我們要么傳遞這個變量,讓d=0,要么傳遞原始變量,讓d=1。兩者將產生相同的結果。 這里的一個重要問題是如何確定“p”和“q”的值。我們用兩個圖來確定這些數字。讓我們先討論一下。 自相關函數(ACF):它是一種度量TS與自身滯后版本之間相關性的方法。例如,在滯后5時,ACF會將瞬時“t1”…“t2”的序列與瞬時“t1-5”…“t2”的序列進行比較(t1-5和t2是端點)。 部分自相關函數(PACF):該函數測量TS與自身滯后版本之間的相關性,但在消除了已經由中間比較解釋的變化之后。在滯后5時,它將檢查相關性,但刪除已經由滯后1到滯后4解釋的影響
32
#經差分后的TS的ACF和PACF圖可以繪制為: #ACF and PACF plots: from statsmodels.tsa.stattools import acf, pacf lag_acf = acf(ts_log_diff, nlags=20) lag_pacf = pacf(ts_log_diff, nlags=20, method='ols') #Plot ACF: plt.subplot(121) plt.plot(lag_acf) plt.axhline(y=0,linestyle='--',color='gray') plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray') plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray') plt.title('Autocorrelation Function') #Plot PACF: plt.subplot(122) plt.plot(lag_pacf) plt.axhline(y=0,linestyle='--',color='gray') plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray') plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray') plt.title('Partial Autocorrelation Function') plt.tight_layout() #在這個圖中,0兩邊的虛線是置信區間。這些可以用來確定“p”和“q”的值如下: #p - PACF圖第一次越過上置信區間時的滯后值。如果你仔細觀察,這里p=2。 #q - ACF圖第一次越過上置信區間時的滯后值。如果你仔細觀察,這里q=2。
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/stattools.py:541: FutureWarning: fft=True will become the default in a future version of statsmodels. To suppress this warning, explicitly set fft=False. warnings.warn(msg, FutureWarning)
現在,讓我們制作3種不同的ARIMA模型,考慮單獨的和組合的效果。我還將為每個人打印RSS。請注意,這里的RSS用於殘差值,而不是實際的系列
33
from statsmodels.tsa.arima_model import ARIMA #可以使用ARIMA的order參數指定p、d、q值,該參數接受一個元組(p、d、q)。讓我們對這3種情況建模: #AR MODEL model = ARIMA(ts_log, order=(2, 1, 0)) results_AR = model.fit(disp=-1) plt.plot(ts_log_diff) plt.plot(results_AR.fittedvalues, color='red') plt.title('RSS: %.4f'% sum((results_AR.fittedvalues-ts_log_diff)**2))
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning) /Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning)
33
Text(0.5, 1.0, 'RSS: 1.5023')
34
#MA Model model = ARIMA(ts_log, order=(0, 1, 2)) results_MA = model.fit(disp=-1) plt.plot(ts_log_diff) plt.plot(results_MA.fittedvalues, color='red') plt.title('RSS: %.4f'% sum((results_MA.fittedvalues-ts_log_diff)**2))
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning) /Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning)
34
Text(0.5, 1.0, 'RSS: 1.4721')
35
#Combined Model model = ARIMA(ts_log, order=(2, 1, 2)) results_ARIMA = model.fit(disp=-1) plt.plot(ts_log_diff) plt.plot(results_ARIMA.fittedvalues, color='red') plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning) /Users/christopher/opt/anaconda3/lib/python3.7/site-packages/statsmodels/tsa/base/tsa_model.py:165: ValueWarning: No frequency information was provided, so inferred frequency MS will be used. % freq, ValueWarning)
35
Text(0.5, 1.0, 'RSS: 1.0292')
# 在這里,我們可以看到AR和MA模型擁有幾乎相同的RSS,但是合並起來要好得多。現在,我們只剩下最后一步,即將這些值恢復到原來的比例。
36
#回到原來的比例 #由於組合模型給出了最佳結果,因此我們可以將其縮放回原始值並查看其在那里的表現。第一步是將預測結果存儲為單獨的系列並觀察它。 predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True) print(predictions_ARIMA_diff.head())
Month 1949-02-01 0.009580 1949-03-01 0.017491 1949-04-01 0.027670 1949-05-01 -0.004521 1949-06-01 -0.023890 dtype: float64
Notice that these start from ‘1949-02-01’ and not the first month. Why? This is because we took a lag by 1 and first element doesn’t have anything before it to subtract from. The way to convert the differencing to log scale is to add these differences consecutively to the base number. An easy way to do it is to first determine the cumulative sum at index and then add it to the base number. The cumulative sum can be found as:
39
predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum() print(predictions_ARIMA_diff_cumsum.head())
Month 1949-02-01 0.009580 1949-03-01 0.027071 1949-04-01 0.054742 1949-05-01 0.050221 1949-06-01 0.026331 dtype: float64
40
#您可以使用以前的輸出快速進行一些回溯計算,以檢查這些計算是否正確。接下來我們要把它們加到底數上。為此,讓我們創建一個以所有值為基數的系列,並將差異添加到其中。可以這樣做: predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index) predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0) predictions_ARIMA_log.head()
/Users/christopher/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:3: FutureWarning: .ix is deprecated. Please use .loc for label based indexing or .iloc for positional indexing See the documentation here: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated This is separate from the ipykernel package so we can avoid doing imports until
40
Month 1949-01-01 4.718499 1949-02-01 4.728079 1949-03-01 4.745570 1949-04-01 4.773241 1949-05-01 4.768720 dtype: float64
41
#這里第一個元素是基數本身,並且從那里累加的值。最后一步是取指數並與原始系列進行比較。 predictions_ARIMA = np.exp(predictions_ARIMA_log) plt.plot(ts) plt.plot(predictions_ARIMA) plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))
41
Text(0.5, 1.0, 'RMSE: 90.1045')