1, pandas生成時間一般采用date_range操作,這個之前的博客已經詳細的講解過,這里就不在闡述
2, pandas的數據重采樣
什么是數據重采樣?
就好比原來一堆統計數據是按照天來進行統計的,持續一年;
那我們能不能看月整體變化的程度呢?
那這個時候就涉及到數據的重采樣問題,按照上述的例子:由天變為月,那這個就是一個降采樣的過程,那既然有降采樣,那必定也有升采樣。
那如何使用pandas完成將采樣和升采樣呢?
rng = pd.date_range('1/1/2011',periods=90, freq='D') ts = pd.Series(np.random.randn(len(rng)), index=rng) ts.head() # 降采樣 ts.resample('M').sum() # pandas使用resample方法來進行重采樣,統計的指標的sum,當然可以是mean ts.resample('3D').sum() # 當然也可以指定是一個周期 # 升采樣 day3d.resample('D').safreq()) # 我們會發現,部分有了空值NAN但是出現NAN會影響我們的統計所以 # ffill 空值取前面的值 # bfill 空值取后面的值 # interpolate 線性取值 day3d.resample('D').ffill(1) # 對於空值取前面的一個數據進行一個值得填充 day3d.resample('D').interpolate('linear') # 對相鄰的兩個點之間取線性的值
3,pandas的滑動窗口

看一張圖:假如我的時間數據是2016年到2017年的,我想看其中2月5日的情況
假如我只看2月5日的值就未免太過絕對,因此,我們取2月5日附近的均值,那這樣就顯得更加科學一點
滑動窗口的意思就是取滑動的步長,由確定點的右側一個步長到,點左側的一個步長,求均值,這樣統計出來的數據就會更加規范,那pandas怎么用滑動窗口呢?
df = pd.Series(np.random.randn(600), index=pd.date_range('7/1/2016', freq='D', periods=600)) df.head() r = df.rolling(window=10) # 可以設置center等,默認滑動是從左往右的 可以取得均值 r.mean()
import matplotlib.pyplot as plt plt.figure(figsize=(15,5)) df.plot(style='r--') df.rolling(window=10).mean().plot(style='b')
圖如下:是不是變得平滑許多?

5,ARIMA模型
平穩性的要求序列的均值和方差不發生明顯變化
如何處理讓數據變得更加平穩呢?

何為差分法呢?
差分法就是用t2-t1, t3-t2依次類推得到的差值進行統計所的出的圖像
那pandas怎么去實現差分法呢?
data = pd.read_csv('x.csv') data['diff_01] = data['values_colunm'].diff(1) # 相差一個時間間隔的點
但是這里有個注意點:二階差分是在一階差分的基礎上進行一階差分,才是二階差分,不是在原始數據上直接diff(2)


自回歸模型:
①描述當前值和歷史值之間的關系,用變量的自身的歷史數據對自身進行預測
②自回歸模型必須滿足平穩性的要求
③p階自回歸過程的公式定義: 
④
自回歸模型的限制:
1,自回歸模型是用自身的數據進行預測
2,必須具有平穩性
3,必須具有自相關性,如果自相關系數(
)小於0.5,則不宜采用
4,自回歸只適用於預測和自身前期相關的現象
移動平均模型:
1,移動平均模型關注的是自回歸模型中的誤差項的累加
2,q階自回歸過程的公式定義:
3,移動平均法能夠有效的消除預測中的隨機波動
自回歸移動平均模型(ARMA)
1,自回歸與移動平均的結合
2,公式的定義:
(p是自回歸模型的階數,q是移動平均模型的階數,d是查分的階數(一般使用一階差分即d=1))
ARIMA(p,d,q)模型全稱為差分自回歸移動平均模型
AR是自回歸,p為自回歸項;MA為移動平均,q為移動平均數,d為時間序列成為平穩時所作的差分次數
原理:將非平穩時間序列轉化為平穩時間序列然后將因變量僅對它的滯后值以及隨機誤差項的現值和滯后值進行回歸所建立的模型
自相關函數ACF(幫助我們選擇p值和q值得合適值)
1,有序的隨機變量序列與其自身相比較,自相關函數反應了同一序列在不同時序取值之間的相關性
2,公式:
3,Pk的取值范圍為[-1,1](相關性)
那ARIMA建模的流程:
①將序列平穩
②p和q階數確定:ACF和PACF
③ARIMA(pdq)
#arima時序模型 import pandas as pd #參數初始化 discfile = 'data.xls' forecastnum = 5 #讀取數據,指定日期列為指標,Pandas自動將“日期”列識別為Datetime格式 data = pd.read_excel(discfile, index_col = u'日期') #時序圖 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標簽 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負號 data.plot() plt.show() #自相關圖 from statsmodels.graphics.tsaplots import plot_acf plot_acf(data).show() #平穩性檢測 from statsmodels.tsa.stattools import adfuller as ADF print(u'原始序列的ADF檢驗結果為:', ADF(data[u'銷量'])) #返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore #差分后的結果 D_data = data.diff().dropna() D_data.columns = [u'銷量差分'] D_data.plot() #時序圖 plt.show() plot_acf(D_data).show() #自相關圖 from statsmodels.graphics.tsaplots import plot_pacf plot_pacf(D_data).show() #偏自相關圖 print(u'差分序列的ADF檢驗結果為:', ADF(D_data[u'銷量差分'])) #平穩性檢測 #白噪聲檢驗 from statsmodels.stats.diagnostic import acorr_ljungbox print(u'差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data, lags=1)) #返回統計量和p值 from statsmodels.tsa.arima_model import ARIMA data[u'銷量'] = data[u'銷量'].astype(float) #定階 pmax = int(len(D_data)/10) #一般階數不超過length/10 qmax = int(len(D_data)/10) #一般階數不超過length/10 bic_matrix = [] #bic矩陣 for p in range(pmax+1): tmp = [] for q in range(qmax+1): try: #存在部分報錯,所以用try來跳過報錯。 tmp.append(ARIMA(data, (p,1,q)).fit().bic) except: tmp.append(None) bic_matrix.append(tmp) #從中可以找出最小值 bic_matrix = pd.DataFrame(bic_matrix) #先用stack展平,然后用idxmin找出最小值位置。 p,q = bic_matrix.stack().idxmin() print(u'BIC最小的p值和q值為:%s、%s' %(p,q)) #建立ARIMA(0, 1, 1)模型 model = ARIMA(data, (p,1,q)).fit() #給出一份模型報告 print(model.summary2()) #作為期5天的預測,返回預測結果、標准誤差、置信區間。 print(model.forecast(5)) # 結果如下: BIC最小的p值和q值為:0、1 Results: ARIMA ==================================================================== Model: ARIMA BIC: 422.5101 Dependent Variable: D.銷量 Log-Likelihood: -205.88 Date: 2018-12-23 21:47 Scale: 1.0000 No. Observations: 36 Method: css-mle Df Model: 2 Sample: 01-02-2015 Df Residuals: 34 02-06-2015 Converged: 1.0000 S.D. of innovations: 73.086 AIC: 417.7595 HQIC: 419.418 ---------------------------------------------------------------------- Coef. Std.Err. t P>|t| [0.025 0.975] ---------------------------------------------------------------------- const 49.9555 20.1390 2.4805 0.0182 10.4838 89.4272 ma.L1.D.銷量 0.6710 0.1648 4.0712 0.0003 0.3480 0.9941 ----------------------------------------------------------------------------- Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- MA.1 -1.4902 0.0000 1.4902 0.5000 ==================================================================== (array([4873.96625288, 4923.92173955, 4973.87722621, 5023.83271288, 5073.78819955]), array([ 73.08574135, 142.32683622, 187.54287785, 223.8028904 , 254.95712673]), array([[4730.72083205, 5017.2116737 ], [4644.96626651, 5202.87721258], [4606.29994008, 5341.45451235], [4585.18710806, 5462.4783177 ], [4574.08141355, 5573.49498555]]))
python主要時序模式算法:
Python實現時序模式主要的庫是StatsModels,算法主要是ARIMA模型,在使用該模型進行建模時需要進行一系列的判別操作,主要包含平穩性檢測,白噪聲檢測,是否差分,AIC和BIC指標值,模型定階,最后在做預測
時序模式算法函數列表如下:
| 函數名 | 函數功能 | 所屬工具箱 |
| acf() | 計算自相關系數 | statsmodels.tsa.stattools |
| plot_acf() | 繪制自相關系數圖 | statsmodels.graphics.tsaplots |
| pacf() | 計算偏相關系數 | statsmodels.tsa.stattools |
| plot_pacf() | 繪制偏相關系數圖 | statsmodels.graphics.tsaplots |
| adfuller() | 對觀測值序列進行單位根檢驗 | statsmodels.tsa.stattools |
| diff() | 對觀測值序列進行差分計算 | Pandas方法 |
| ARIMA() | 創建一個ARIMA的時序模型 | statsmodels.tsa.arima_model |
| summary()或summary2 | 給出一份ARIMA模型報告 | ARIMA模型自帶方法 |
| aic/bic/hqic | 計算ARIMA模型的AIC/BIC/HQIC指標值 | ARIMA模型自帶方法 |
| forecast() | 應用構建的時序模型進行預測 | ARIMA模型自帶方法 |
| accor_ljungbox() | Ljung-Box檢驗,檢驗是否為白噪聲 | statsmodels.stats.diagnostic |
1,acf()
功能:計算自相關系數
使用方法:
autoaorr = acf(data, unbiased=False,nlags=40,qstat=False,fft=False,alpha=None)
輸入的data為觀測值序列(即時間序列,可以是DataFrame或者是Series),返回參數autocorr為觀測值序列自相關函數。其余為可選參數,如qstat=True時同時返回Q統計量和對應的p值
2,plot_acf()
功能:繪制自相關系數圖
使用方法:
p = plot_acf(data)
返回matplotlib對象,調用show()方法顯示
3,pacf()/plot_pacf()與上面兩個一致
4,adfuller()
功能:對時間序列進行單位根檢驗(ADF test)
使用方法:
h=adfuller(Series, maxlag=None,regression='c',autolag='AIC',store=False,regresults=False)
輸入參數Series為一維觀測值序列,返回值依次為:adf,pvalue,uselag,nobs,critical values,icbest,regresults,resstore
5,diff()
功能:對時間序列進行差分計算
使用方法:
D.diff() D可以是DataFrame或者是Series
6,arima
功能:設置時序模式的建模參數,創建ARIMA時序模型
使用方法:
arima = ARIMA(data,(p,l,q)).fit()
data參數為輸入的時間序列,p,q是對應的階,d為差分次數
7,summary()/summary2()
功能:生成已有模型的報告
使用方法:
arima.summary()或arima.summary2()
其中arima為已經建好的ARIMA模型,返回一份格式化的模型報告,包含模型的系數,標准誤差,p值,AIC和BIC等詳細指標
8,aic/bic/hqic
功能:計算ARIMA模型的AIC/BIC/HQIC指標值
使用方法:
arima.aic
其中arima為已經建立好的ARIMA,返回值是Model時序模型得到的AIC,BIC和HQIC值
9,forecast()
功能:用得到的時序模型進行預測
使用方法:
a,b,c = arima.forecast(num)
輸入參數num為要預測的天數,arima為已經建立好的ARIMA模型。a為返回天數的預測值,b為預測的誤差,c為預測的置信區間
10,acorr_ljungbox()
功能:檢測是否為白噪聲序列
使用方法:
acorr_ljungbox(data, lags=1)
輸入參數data為時間序列數據,lags為滯后數,返回統計量和p值
