用Python语言进行多元时间序列ARIMAX模型分析
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模型分析的更多相关文章
- 基于R语言的时间序列指数模型
时间序列: (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.时间序列分析的主要目的是根据已有的历史数据对未来进行预测.(百度百科) 主要考虑的因素: 1.长期趋势(Lon ...
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
- 如何系统地自学一门Python 语言(转)
转自:http://www.phpxs.com/post/4521 零基础情况下,学一门语言充实下自己,Python,简洁.优美.容易使用,是一个很好的选择.那么如何系统地自学Python呢? 有的人 ...
- 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
基于python语言的tensorflow的‘端到端’的字符型验证码识别 1 Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...
- sklearn:Python语言开发的通用机器学习库
引言:深入理解机器学习并全然看懂sklearn文档,须要较深厚的理论基础.可是.要将sklearn应用于实际的项目中,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问 ...
- 基于Python的信用评分卡模型分析(二)
上一篇文章基于Python的信用评分卡模型分析(一)已经介绍了信用评分卡模型的数据预处理.探索性数据分析.变量分箱和变量选择等.接下来我们将继续讨论信用评分卡的模型实现和分析,信用评分的方法和自动评分 ...
- 强者联盟——Python语言结合Spark框架
引言:Spark由AMPLab实验室开发,其本质是基于内存的高速迭代框架,"迭代"是机器学习最大的特点,因此很适合做机器学习. 得益于在数据科学中强大的表现,Python语言的粉丝 ...
- python(一):python语言基础
一.python语言基本的8个要素 Python语言的8个要素:数据类型.对象引用.组合数据类型.逻辑操作符.运算操作符.控制流语句.输入/输出.函数的创建与引用.除此之外还有一个非常重要且无处不在的 ...
- 学习CV:《OpenCV 3计算机视觉Python语言实现第2版》中文PDF+英文PDF+代码
理解与计算机视觉相关的算法.模型以及OpenCV 3 API背后的基本概念,有助于开发现实世界中的各种应用程序(比如:安全和监视领域的工具). OpenCV 3是一种先进的计算机视觉库,可以用于各种图 ...
- 关于《Selenium3自动化测试实战--基于python语言》
2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...
随机推荐
- 2022-02-12:k8s安装es,yaml如何写?
2022-02-12:k8s安装es,yaml如何写? yaml如下: apiVersion: v1 kind: Service metadata: labels: app: elasticsearc ...
- vue全家桶进阶之路34:Vue3 路由基本配置
在Vue3中,路由的基本配置是通过使用Vue Router库来实现的.以下是Vue3中路由的基本配置步骤: 安装Vue Router 使用npm或yarn在项目中安装Vue Router: npm i ...
- Python连接es笔记四之创建和删除操作
本文首发于公众号:Hunter后端 原文链接:Python连接es笔记四之创建和删除操作 这一篇笔记介绍一下索引和数据的创建和删除. 其实对于索引来说,如果可以接触到 kibana 的话,可以很方便的 ...
- 5.5. Java并发工具类(如CountDownLatch、CyclicBarrier等)
5.5.1 CountDownLatch CountDownLatch是一个同步辅助类,它允许一个或多个线程等待,直到其他线程完成一组操作.CountDownLatch有一个计数器,当计数器减为0时, ...
- JVM、JRE和JDK的理解
JVM JVM,全称为Java Virtual Machine,中文的意思是:Java虚拟机. 在理解Java虚拟机这个定义之前,我们先讲讲为何叫虚拟机呢?称为虚拟机,顾名思义,它应该不是真实存在 ...
- 前端Vue自定义询问弹框和输入弹框
前端Vue自定义询问弹框和输入弹框, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13119 效果图如下: 使用方法 < ...
- PostgreSQL JDBC 开发指导
JDBC 驱动程序 目录 设置 JDBC 驱动程序 初始化驱动程序 使用 SSL 发出查询和处理结果 调用存储函数和过程 存储二进制数据 JDBC 转义 PostgreSQL 扩展的 JDBC API ...
- Python史上最全种类数据库操作方法,你能想到的数据库类型都在里面!甚至还有云数据库!
本文将详细探讨如何在Python中连接全种类数据库以及实现相应的CRUD(创建,读取,更新,删除)操作.我们将逐一解析连接MySQL,SQL Server,Oracle,PostgreSQL,Mong ...
- EaselJS 源码分析系列--第二篇
在 第一篇 中我们大致分析了从: 创建舞台 -> 添加显示对象-> 更新显示对象 的源码实现 这一篇将主要分析几个常用显示对象自各 draw 方法的实现 让我们看向例子 examples/ ...
- 利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理
有时候,我们在处理大量文档的时候,需要批量给Word文档添加印章处理,方便打印操作,本篇随笔介绍利用Aspose.Word对Word文件添加印章处理以及实现业务数据的替换处理. 1.利用Aspose. ...