1.ARIMAX模型定义

  ARIMAX模型是指带回归项的ARIMA模型,又称扩展的ARIMA模型。回归项的引入有利于提高模型的预测效果。引入的回归项一般是与预测对象(即被解释变量)相关程度较高的变量。比如分析居民的消费支出序列时,消费会受到收入的影响,如果将收入也纳入到研究范围,就能够得到更精确的消费预测。

2.ARIMAX的建模步骤

  读取数据(观察值序列)-->通过观察响应变量的时序图来判断是否需要进行差分来提取序列相关信息-->进行差分使得差分后的序列无趋势无周期-->切分训练数据与测试数据

-->平稳性检验(一般会进行单位根检验和自相关图与偏自相关图检验)-->纯随机性检验-->协整检验(EG两步法)-->建立ARIMAX模型-->模型检验和优化-->未来预测-->做图像可视化观察

注:本案例未进行纯随机性检验和协整检验,有需要可自行添加

3.本案例数据查看

案例数据中,第一列为时间序列数据,第二列为响应数据,第三列以及后每列数据为输入数据

4.当缕清数据性质后进行操作,具体Python代码步骤如下(有省略步骤请按具体建模步骤自行添加)

  4.1倒库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from statsmodels.tsa.stattools import adfuller as ADF
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
import pyflux as pf #pyflux库是一个专门用来建立时间序列模型的python库,需要numpy 1.23.0版本
from sklearn.metrics import mean_absolute_error,mean_squared_error #绝对值误差 plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

  4.2读取数据

df=pd.read_excel("时间序列的多元回归分析.xlsx")
data=df.copy()
data.set_index('year',inplace=True)
#展示部分所用数据
print(data.head())

  4.3进行一阶差分

data=data.diff(1).iloc[1:,]
print(data.head())

  

  4.4观察每一个标量指标经过差分后的时序图

plt.figure(figsize=(20,20))
plt.subplot(3,3,1)
data.EXP.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("EXP") plt.subplot(3,3,2)
data.CUR.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("CUR") plt.subplot(3,3,3)
data.CRR.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("CRR") plt.subplot(3,3,4)
data.D.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("D") plt.subplot(3,3,5)
data.Trade.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("Trade") plt.subplot(3,3,6)
data.Invest.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("Invest") plt.subplot(3,3,7)
data.Rate.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("Rate") plt.subplot(3,3,8)
data.Gov.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("Gov") plt.subplot(3,3,9)
data.Pro.plot(c='r')
plt.grid()
plt.xlabel("年份")
plt.ylabel("Pro") plt.show()

  4.5切分数据

#切分数据 85%训练 15%测试
trainnum = np.int64(data.shape[0] * 0.85)
traindata = data.iloc[0:trainnum, :]
testdata = data.iloc[trainnum:data.shape[0], :]
print(traindata.shape)
print(testdata.shape)

  4.6单位根检验

#单位根检验:检验序列平稳性
def Adf_test(data):
Adftest = ADF(data, autolag='BIC')
Adfoutput = pd.Series(Adftest[0:4], index=['Test Statistic', 'p-value', 'Lags Used', 'Number of Observations Used'])
print(">>>{}的单位根检验结果:".format(data.name))
print(Adfoutput) Adf_test(traindata.EXP) # p-value 0.994235 不平稳
Adf_test(traindata.CUR) # p-value 0.384367 不平稳
Adf_test(traindata.CRR) # p-value 0.992719 不平稳
Adf_test(traindata.D) # p-value 1.000000 不平稳
Adf_test(traindata.Trade) # p-value 0.126649 不平稳
Adf_test(traindata.Invest) # p-value 0.236028 不平稳
Adf_test(traindata.Rate) # p-value 1.151937e-26 平稳
Adf_test(traindata.Gov) # p-value 0.999009 不平稳
Adf_test(traindata.Pro) # p-value 0.907343 不平稳

  4.7对每个差分后的数组进行自相关图与偏自相关图绘制

#对每个数组进行自相关图与偏自相关图绘制
#ACF(自相关图)、PACF(偏自相关图)
def Acf_Pacf(data):
f = plt.figure(facecolor='white',figsize=(6,2))
ax1 = f.add_subplot(121)
plot_acf(data, lags=data.shape[0]//2-1, ax=ax1)
ax2 = f.add_subplot(122)
plot_pacf(data, lags=data.shape[0]//2-1, ax=ax2)
plt.show() Acf_Pacf(traindata.EXP)
Acf_Pacf(traindata.CUR)
Acf_Pacf(traindata.CRR)
Acf_Pacf(traindata.D)
Acf_Pacf(traindata.Trade)
Acf_Pacf(traindata.Invest)
Acf_Pacf(traindata.Rate)
Acf_Pacf(traindata.Gov)
Acf_Pacf(traindata.Pro)

  4.8建立ARIMAX模型

#建立ARIMAX模型(利用差分后的数据进行建模,实际上仍然相当于arimax(p,d,q))
model=pf.ARIMAX(data=traindata,formula="EXP~CUR+CRR+D+Trade+Invest+Rate+Gov+Pro",ar=1,integ=0,ma=1)
result=model.fit("MLE")
print(result.summary())

  4.9模型结果拟合

#模型结果拟合
model.plot_fit(figsize=(5,3))

  4.10未来预测数据

#未来预测数据
future=model.predict(h=testdata.shape[0], #未来期数
oos_data=testdata, #测试集数据
intervals=True) #预测置信区间
print(future)
# print(future.to_excel("未来数据及置信区间.xlsx")) #未来预测图像(要注意是否进行了差分)
model.plot_predict(h=testdata.shape[0], #未来期数
oos_data=testdata, #测试集数据
past_values=traindata.shape[0],
figsize=(6,4))

  4.11可视化原始数据和预测数据进行对比

#可视化原始数据和预测数据进行对比
traindata.EXP.plot(figsize=(14,7),label="训练集数据")
testdata.EXP.plot(figsize=(14,7),label="测试集数据")
future.EXP.plot(style="g--o",label="未来预测数据")
#可视化出置信区间
plt.fill_between(future.index,future["5% Prediction Interval"],
future["95% Prediction Interval"],color='blue',alpha=0.15,
label="95%置信区间")
plt.grid()
plt.xlabel("Time")
plt.ylabel("EXP")
plt.title("ARIMAX(1,0,1)模型")
# plt.legend(loc=0)
plt.show()

  4.12模型优化,通过遍历寻找合适的 p,q

#通过遍历寻找合适的 p,q
p = np.arange(6)
q = np.arange(6)
pp,qq = np.meshgrid(p,q)
resultdf = pd.DataFrame(data = {"arp":pp.flatten(),"mrq":qq.flatten()})
resultdf["bic"] = np.double(pp.flatten())
resultdf["mae"] = np.double(qq.flatten())
## 迭代循环建立多个模型
for ii in resultdf.index:
model_i = pf.ARIMAX(data=traindata,formula="EXP~CUR+CRR+D+Trade+Invest+Rate+Gov+Pro",ar=resultdf.arp[ii],ma=resultdf.mrq[ii],integ=0)
try:
modeli_fit = model_i.fit("MLE")
bic = modeli_fit.bic
EXP_pre = model.predict(h=testdata.shape[0],oos_data=testdata)
mae = mean_absolute_error(testdata.EXP,EXP_pre.EXP)
except:
bic = np.nan
resultdf.bic[ii] = bic
resultdf.mae[ii] = mae #绝对值误差
print("模型迭代结束")
print(resultdf.sort_values(by="bic").head())
#此时找到了最优的arma参数,换掉之前的模型参数即可

  到此,多元时间序列建模基本结束!

用Python语言进行多元时间序列ARIMAX模型分析的更多相关文章

  1. 基于R语言的时间序列指数模型

    时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...

  2. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  3. 如何系统地自学一门Python 语言(转)

    转自:http://www.phpxs.com/post/4521 零基础情况下,学一门语言充实下自己,Python,简洁.优美.容易使用,是一个很好的选择.那么如何系统地自学Python呢? 有的人 ...

  4. 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

    基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...

  5. sklearn:Python语言开发的通用机器学习库

    引言:深入理解机器学习并全然看懂sklearn文档,须要较深厚的理论基础.可是.要将sklearn应用于实际的项目中,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问 ...

  6. 基于Python的信用评分卡模型分析(二)

    上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...

  7. 强者联盟——Python语言结合Spark框架

    引言:Spark由AMPLab实验室开发,其本质是基于内存的高速迭代框架,"迭代"是机器学习最大的特点,因此很适合做机器学习. 得益于在数据科学中强大的表现,Python语言的粉丝 ...

  8. python(一):python语言基础

    一.python语言基本的8个要素 Python语言的8个要素:数据类型.对象引用.组合数据类型.逻辑操作符.运算操作符.控制流语句.输入/输出.函数的创建与引用.除此之外还有一个非常重要且无处不在的 ...

  9. 学习CV:《OpenCV 3计算机视觉Python语言实现第2版》中文PDF+英文PDF+代码

    理解与计算机视觉相关的算法.模型以及OpenCV 3 API背后的基本概念,有助于开发现实世界中的各种应用程序(比如:安全和监视领域的工具). OpenCV 3是一种先进的计算机视觉库,可以用于各种图 ...

  10. 关于《Selenium3自动化测试实战--基于python语言》

    2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...

随机推荐

  1. 2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多

    2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多 ...

  2. Python Numpy 切片和索引(高级索引、布尔索引、花式索引)

    张量(Tensor).标量(scalar).向量(vector).矩阵(matrix) Python Numpy 切片和索引(高级索引.布尔索引.花式索引) Python NumPy 广播(Broad ...

  3. 如何使用 Blazor 框架在前端浏览器中导入和导出 Excel

    前言 Blazor 是一个相对较新的框架,用于构建具有 .NET 强大功能的交互式客户端 Web UI.一个常见的用例是将现有的 Excel 文件导入 Blazor 应用程序,将电子表格数据呈现给用户 ...

  4. vue/cli3整合Cesium,加载离线arcgis 切片

    最開始使用webpack進行cesium 集成, 出现了问题一大堆,最后只好选择传统的方法直接引入了,具体操作如下 目录 一.安装cesium 二.使用script引用cesium 1.切换到 nod ...

  5. web自动化02-常见元素定位(不含xpath和css)

    1.熟悉前端基础   代码和元素是一一对应关系,程序需要通过代码中的某些特征,获取目标元素并进行操作 标签名     key = value      元素的属性和属性值   2.浏览器开发者工具   ...

  6. 文档在线预览(二)word、pdf文件转html以实现文档在线预览

    @[toc] 实现文档在线预览的方式除了上篇文章[<文档在线预览(一)通过将txt.word.pdf转成图片实现在线预览功能>](https://blog.csdn.net/q2qwert ...

  7. 10.5. 版本控制(如Git)

    版本控制系统(Version Control System,VCS)是软件开发过程中用于管理源代码的工具.它可以帮助你跟踪代码的变更历史,方便回滚到之前的版本,以及协同多人共同开发.Git是当前最流行 ...

  8. 为什么要重写equals要重写hashcode方法

    Java 比较(==, equals) 一.= = ==:比较两个对象的引用是否是同一个地址 二.equals object中equals方法调用的就是==,可以在其他类中重写该方法. 三.为什么要重 ...

  9. 文本识别分类系统python,基于深度学习的CNN卷积神经网络算法

    一.介绍 文本分类系统,使用Python作为主要开发语言,通过TensorFlow搭建CNN卷积神经网络对十余种不同种类的文本数据集进行训练,最后得到一个h5格式的本地模型文件,然后采用Django开 ...

  10. 7. RESTful

    1. RESTful简介 ‍ REST:Representational State Transfer,表现层资源状态转移. ①资源 ‍ 资源是一种看待服务器的方式,即,将服务器看作是由很多离散的资源 ...