python關於時間序列的分析


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值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM