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. 2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?

    福哥答案2021-02-16: 自然智慧即可.1.普通递归.有代码.需要判断同列和斜线.2.位运算递归.有代码.3.我的递归.有代码.只需要判断斜线. 代码用golang编写,代码如下: packag ...

  2. 2021-02-28:给定一个整型数组arr,和一个整数num。某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量。

    2021-02-28:给定一个整型数组arr,和一个整数num.某个arr中的子数组sub,如果想达标,必须满足:sub中最大值 – sub中最小值 <= num,返回arr中达标子数组的数量. ...

  3. 【C++】requires关键字简介

    requires 是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于 typename 和 class 关键字. requires关键 ...

  4. Selenium - 浏览器配置(4) - 打开无痕浏览器

    Selenium - 浏览器配置 无痕浏览器 开启谷歌浏览器的无痕浏览模式: from selenium import webdriver # 引入浏览器配置 chrome_options = web ...

  5. java设计模式【抽象工厂模式】

    java设计模式[抽象工厂模式] 抽象工厂模式 抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类.在这个模式中,我们只关心产品的抽象接口,而将 ...

  6. 如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队

    测试,没有分析与设计就失去了灵魂: 测试人员在编写用例之前,该如何进行测试分析与设计呢?上次在<测试的底层逻辑>中讲到了[输入输出测试模型],还讲到了[2W+1H测试分析法],但2W1H分 ...

  7. Ubuntu 18.04 (Bionic) 简单快速的安装mongodb

    按步骤走,不带脑子式安装(注意4.0版本mongodb官方已经不再支持,以下代码中可以修改mongodb版本号安装,目前最新版为6.0,如果懒得改直接用也可以,文章后边第三章第一条代码会直接升级为最新 ...

  8. centos安装Vue

    一直以来,有关LINUX的系统安装包,都是比较随意,直接使用yum进行或者apt-get 安装 标准安装流程是什么的呢.我们通过centos安装Vue进行展示 1 首先下载安装nodejs , htt ...

  9. 如何使用 Megatron-LM 训练语言模型

    在 PyTorch 中训练大语言模型不仅仅是写一个训练循环这么简单.我们通常需要将模型分布在多个设备上,并使用许多优化技术以实现稳定高效的训练.Hugging Face  Accelerate 的创建 ...

  10. Maven进阶学习指南

    前言 当我们在开发项目时,有时需要用到外部依赖组件,例如当我们需要Json序列化的时候需要用到FastJson组件,我们可以通过下载对应jar包加载到项目中.但当一个大的项目同时需要依赖各种各样的外部 ...