【挖掘模型】: Python 主要時序模式算法—StatsModels庫

數(shù)據(jù)源:arima_data.xls
arima_data.xls
數(shù)據(jù)結(jié)果
Paste_Image.png
ARIMA模型包
    # 使用該模型需要一些列判別操作
        # 平穩(wěn)性檢測 -》 白噪聲檢驗(yàn) ——》 是否差分 -》 AIC和BIC指標(biāo) --> 模型定階 --》預(yù)測
        # acf()  計算自相關(guān)系數(shù)
            # autocorr = acf(data,unbiased = False,nlags = 40,qstat = False,fft = False ,alpha = None)
            # data_觀測值序列(時間序列,dataFrame or Series)
            # autocorr_觀測值序列自相關(guān)函數(shù)
            # 其他為可選參數(shù)律适,如 qstat = True,同事返回Q統(tǒng)計量和對應(yīng)的p值
        # plot_acf()/plot_pacf()   畫自相關(guān)系數(shù)圖和偏相關(guān)系數(shù)圖
            # p = plot_acf(data) 
            # 返回一個Matplotlib對象谅阿,可以用show()方法顯示圖像
        # adfuller()  對觀測值序列進(jìn)行單位根檢驗(yàn)(ADF test)
            # h = adffuller(Series,maxlag = None,regression = 'c',autolag = 'AIC',store = False,regresults = False)
            # 輸入?yún)?shù)Series為一維觀測值序列,依次返回adf,pvalue,usedlag,nobs,critical,values,icbest,regresults,resstore
        # diff()  對觀測值序列進(jìn)行差分計算
            # D诡蜓。diff()_D為dataframe 或者 Series
        # arima  設(shè)置時序模式的建模參數(shù)蕊肥,創(chuàng)建ARIMA時序模型
            # arima = ARIMA(data,(p,d,q)).fit()
            # data參數(shù)為輸入時間序列膘茎,d為差分次數(shù)
        # summary()/summary2()   生成已有模型報告
            # 包含模型系數(shù)漆弄,標(biāo)準(zhǔn)誤差,p值弄砍,AIC和BIC值等
        # aic/bic/hqic  計算模型的AIC颅筋、BIC、HQIC值
            # arima.aic/arima.bic/arima.hqic
        # forecast()   預(yù)測
            # a,b,c = arima.forecase(num)
            # num為預(yù)測的天數(shù),a_返回的預(yù)測值,b_預(yù)測的誤差,c_預(yù)測值置信區(qū)間
        # acorr_ljungbox()  檢測是否為白噪聲序列
            # acorr_ljungbox(data,lags=1)
            # lags 為滯后數(shù),返回統(tǒng)計量和p值
源代碼
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

#參數(shù)初始化
discfile = 'F:/python 數(shù)據(jù)挖掘分析實(shí)戰(zhàn)/Data/arima_data.xls'
forecastnum = 5

#讀取數(shù)據(jù)输枯,指定日期列為指標(biāo),Pandas自動將“日期”列識別為Datetime格式
data = pd.read_excel(discfile, index_col = u'日期')

#時序圖
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用來正常顯示中文標(biāo)簽
plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負(fù)號
data.plot()
plt.show()


#自相關(guān)圖
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()
# 從該圖說明自相關(guān)系數(shù)長期大于0占贫,序列間有很強(qiáng)的長期相關(guān)性

#平穩(wěn)性檢測
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF檢驗(yàn)結(jié)果為:', ADF(data[u'銷量']))
#返回值依次為adf桃熄、pvalue、usedlag、nobs瞳收、critical values碉京、icbest、regresults螟深、resstore
# P值顯著大于0.05谐宙,該序列是非平穩(wěn)的時間序列

#差分后的結(jié)果,對原始數(shù)據(jù)進(jìn)行一階拆分界弧,并進(jìn)行平穩(wěn)性和白噪聲檢驗(yàn)
D_data = data.diff().dropna()
D_data.columns = [u'銷量差分']
D_data.plot() #時序圖


plt.show()
plot_acf(D_data).show() #自相關(guān)圖,在均值附近比較平穩(wěn)的波動凡蜻,自相關(guān)圖有很強(qiáng)的短期性,顯示一階截尾

print(u'原始序列的ADF檢驗(yàn)結(jié)果為:', ADF(D_data[u'銷量差分']))
# 單位根檢驗(yàn)P值小于0.05垢箕,所以一階差之后的序列是平穩(wěn)序列



#白噪聲檢驗(yàn)
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪聲檢驗(yàn)結(jié)果為:', acorr_ljungbox(D_data, lags=1)) #返回統(tǒng)計量和p值
#輸出的P值遠(yuǎn)小于0.05划栓,所以一階差分之后的序列是平穩(wěn)非白噪聲序列

from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相關(guān)圖,顯示出拖尾性条获,本來從自相關(guān)圖和偏自相關(guān)圖可以看出p,q...看不懂

"""
#第二步忠荞、確定p、q帅掘,---》 0,1
res = sm.tsa.arma_order_select_ic(
    D_data.dropna(), 
    max_ar=8, 
    max_ma=8, 
    ic=['aic', 'bic', 'hqic'], 
    trend='nc'
)
"""



from statsmodels.tsa.arima_model import ARIMA

data[u'銷量'] = data[u'銷量'].astype(float)

#定階
pmax = int(len(D_data)/10) #一般階數(shù)不超過length/10
qmax = int(len(D_data)/10) #一般階數(shù)不超過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) #從中可以找出最小值

p,q = bic_matrix.stack().idxmin() #先用stack展平修档,然后用idxmin找出最小值位置碧绞。
print(u'BIC最小的p值和q值為:%s、%s' %(p,q)) 

model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型
model.summary2() #給出一份模型報告
model.forecast(5) #作為期5天的預(yù)測萍悴,返回預(yù)測結(jié)果头遭、標(biāo)準(zhǔn)誤差、置信區(qū)間癣诱。

參考資料:《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末计维,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子撕予,更是在濱河造成了極大的恐慌鲫惶,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件实抡,死亡現(xiàn)場離奇詭異欠母,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吆寨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門赏淌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啄清,你說我怎么就攤上這事六水。” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵掷贾,是天一觀的道長睛榄。 經(jīng)常有香客問我,道長想帅,這世上最難降的妖魔是什么场靴? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮港准,結(jié)果婚禮上旨剥,老公的妹妹穿的比我還像新娘。我一直安慰自己叉趣,他們只是感情好泞边,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疗杉,像睡著了一般阵谚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上烟具,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天梢什,我揣著相機(jī)與錄音,去河邊找鬼朝聋。 笑死嗡午,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的冀痕。 我是一名探鬼主播荔睹,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼言蛇!你這毒婦竟也來了僻他?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤腊尚,失蹤者是張志新(化名)和其女友劉穎吨拗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿斥,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劝篷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了民宿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娇妓。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖活鹰,靈堂內(nèi)的尸體忽然破棺而出哈恰,到底是詐尸還是另有隱情坟桅,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布蕊蝗,位于F島的核電站,受9級特大地震影響赖舟,放射性物質(zhì)發(fā)生泄漏蓬戚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一宾抓、第九天 我趴在偏房一處隱蔽的房頂上張望子漩。 院中可真熱鬧,春花似錦石洗、人聲如沸幢泼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缕棵。三九已至,卻和暖如春涉兽,著一層夾襖步出監(jiān)牢的瞬間招驴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工枷畏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留别厘,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓拥诡,卻偏偏與公主長得像触趴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渴肉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容