淘先锋技术网

首页 1 2 3 4 5 6 7

别人发我的代码,不知道原出处,就不写原网页链接了。

ARIMA进行时间序列预测,根据已有的数据训练出一个固定的模型,然后根据这个模型进行预测,不会根据新来的数据更新模型;根据新数据更新模型的是滚动预测。

根据我自己的需求,屏蔽了画图,如果需要画图,去掉画图代码的注释即可。

xlsx文档,第一列属性名为日期,实际数据不一定是日期,可以改成别的,我的数据是int型的,第二列属性名随便,第二列为需要进行建模的数据,画出坐标轴的话,横轴为第一列,纵轴为第二列。

# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 定义使其正常显示中文字体黑体
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示表示负号

import warnings
warnings.filterwarnings("ignore")

data = pd.read_excel('brand_dazong.xlsx', index_col=u'日期', header=0)
print(data.head())

# 画出时序图
data.plot()
plt.suptitle('时序图')
# plt.show()

# 画出自相关性图
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

plot_acf(data)
plt.suptitle('自相关性图')
# plt.show()

# 平稳性检测
from statsmodels.tsa.stattools import adfuller

# 返回值依次为:adf, pvalue p值, usedlag, nobs, critical values临界值 ,
# icbest, regresults, resstore 
# adf 分别大于3中不同检验水平的3个临界值,单位检测统计量对应的p 值显著大于 0.05 ,
# 说明序列可以判定为 非平稳序列
print('原始序列的检验结果为:', adfuller(data[u'销量']))

# 对数据进行差分后得到 自相关图和 偏相关图
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']

D_data.plot()  # 画出差分后的时序图
plt.suptitle('差分后的时序图')
# plt.show()

plot_acf(D_data)  # 画出自相关图
plt.suptitle('自相关图')
# plt.show()

plot_pacf(D_data)  # 画出偏相关图
plt.suptitle("偏相关图")
# plt.show()

# 一阶差分后的序列的时序图在均值附近比较平稳的波动, 自相关性有很强的短期相关性,
# 单位根检验 p值小于 0.05 ,所以说一阶差分后的序列是平稳序列
print(u'差分序列的ADF 检验结果为: ', adfuller(D_data[u'销量差分']))  # 平稳性检验

# 对一阶差分后的序列做白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox

print(u'差分序列的白噪声检验结果:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和 p 值
# 差分序列的白噪声检验结果: (array([*]), array([*])) p值为第二项, 远小于 0.05

# 对模型进行定阶
from statsmodels.tsa.arima_model import ARIMA

pmax = int(len(D_data) / 10)  # 一般阶数不超过 length /10
qmax = int(len(D_data) / 10)
bic_matrix = []
for p in range(pmax + 1):
    temp = []
    for q in range(qmax + 1):
        try:
            value = ARIMA(D_data, (p, 1, q)).fit().bic
            temp.append(value)
        except:
            temp.append(None)
        bic_matrix.append(temp)

bic_matrix = pd.DataFrame(bic_matrix)  # 将其转换成Dataframe 数据结构
p, q = bic_matrix.stack().astype(float).idxmin()  # 先使用stack 展平, 然后使用 idxmin 找出最小值的位置

print(u'BIC 最小的p值 和 q 值:%s,%s' % (p, q))  # BIC 最小的p值 和 q 值:0,1
# 所以可以建立ARIMA 模型
model = ARIMA(data, (p, 1, q)).fit()
model.summary2()
# 保存模型
model.save('model.pkl')
# 模型加载
from statsmodels.tsa.arima_model import ARIMAResults

loaded = ARIMAResults.load('model.pkl')
# 预测未来五个单位
predictions = loaded.forecast(5)
# 预测结果为:
pre_result = predictions[0]
print(u'预测结果为:', pre_result)
# 标准误差为:
error = predictions[1]
print(u'标准误差为:', error)
# 置信区间为:
confidence = predictions[2]
print(u'置信区间为:', confidence)