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()
importmatplotlib.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時序模型
importpandas as pd#參數初始化
discfile = 'data.xls'forecastnum= 5
#讀取資料,指定日期列為名額,Pandas自動将“日期”列識别為Datetime格式
data = pd.read_excel(discfile, index_col = u'日期')#時序圖
importmatplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文标簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負号
data.plot()
plt.show()#自相關圖
from statsmodels.graphics.tsaplots importplot_acf
plot_acf(data).show()#平穩性檢測
from statsmodels.tsa.stattools importadfuller as ADFprint(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 importplot_pacf
plot_pacf(D_data).show()#偏自相關圖
print(u'差分序列的ADF檢驗結果為:', ADF(D_data[u'銷量差分'])) #平穩性檢測
#白噪聲檢驗
from statsmodels.stats.diagnostic importacorr_ljungboxprint(u'差分序列的白噪聲檢驗結果為:', acorr_ljungbox(D_data, lags=1)) #傳回統計量和p值
from statsmodels.tsa.arima_model importARIMA
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、1Results: ARIMA====================================================================Model: ARIMA BIC:422.5101Dependent Variable: D.銷量 Log-Likelihood: -205.88Date:2018-12-23 21:47 Scale: 1.0000No. Observations:36 Method: css-mle
Df Model:2 Sample: 01-02-2015Df Residuals:34 02-06-2015Converged:1.0000 S.D. of innovations: 73.086AIC:417.7595 HQIC: 419.418
----------------------------------------------------------------------Coef. Std.Err. t P>|t| [0.025 0.975]----------------------------------------------------------------------const49.9555 20.1390 2.4805 0.0182 10.4838 89.4272ma.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值