- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
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模型分析的文章就讲到这里了,如果你想了解更多关于用Python语言进行多元时间序列ARIMAX模型分析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
至少在某些 ML 系列语言中,您可以定义可以执行模式匹配的记录,例如http://learnyouahaskell.com/making-our-own-types-and-typeclasses -
这可能是其他人已经看到的一个问题,但我正在尝试寻找一种专为(或支持)并发编程而设计的语言,该语言可以在 .net 平台上运行。 我一直在 erlang 中进行辅助开发,以了解该语言,并且喜欢建立一个稳
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我正在寻找一种进程间通信工具,可以在相同或不同系统上运行的语言和/或环境之间使用。例如,它应该允许在 Java、C# 和/或 C++ 组件之间发送信号,并且还应该支持某种排队机制。唯一明显与环境和语言
我有一些以不同语言返回的文本。现在,客户端返回的文本格式为(en-us,又名美国英语): Stuff here to keep. -- Delete Here -- all of this below
问题:我希望在 R 中找到类似 findInterval 的函数,它为输入提供一个标量和一个表示区间起点的向量,并返回标量落入的区间的索引。例如在 R 中: findInterval(x = 2.6,
我是安卓新手。我正在尝试进行简单的登录 Activity ,但当我单击“登录”按钮时出现运行时错误。我认为我没有正确获取数据。我已经检查过,SQLite 中有一个与该 PK 相对应的数据。 日志猫。
大家好,感谢您帮助我。 我用 C# 制作了这个计算器,但遇到了一个问题。 当我添加像 5+5+5 这样的东西时,它给了我正确的结果,但是当我想减去两个以上的数字并且还想除或乘以两个以上的数字时,我没有
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这就是我所拥有的 #include #include void print(int a[], int size); void sort (int a[], int size); v
你好,我正在寻找我哪里做错了? #include #include int main(int argc, char *argv[]) { int account_on_the_ban
嘿,当我开始向数组输入数据时,我的代码崩溃了。该程序应该将数字读入数组,然后将新数字插入数组中,最后按升序排列所有内容。我不确定它出了什么问题。有人有建议吗? 这是我的代码 #include #in
我已经盯着这个问题好几个星期了,但我一无所获!它不起作用,我知道那么多,但我不知道为什么或出了什么问题。我确实知道开发人员针对我突出显示的行吐出了“错误:预期表达式”,但这实际上只是冰山一角。如果有人
我正在编写一个点对点聊天程序。在此程序中,客户端和服务器功能写入一个唯一的文件中。首先我想问一下我程序中的机制是否正确? I fork() two processes, one for client
基本上我需要找到一种方法来发现段落是否以句点 (.) 结束。 此时我已经可以计算给定文本的段落数,但我没有想出任何东西来检查它是否在句点内结束。 任何帮助都会帮助我,谢谢 char ch; FI
我的函数 save_words 接收 Armazena 和大小。 Armazena 是一个包含段落的动态数组,size 是数组的大小。在这个函数中,我想将单词放入其他称为单词的动态数组中。当我运行它时
我有一个结构 struct Human { char *name; struct location *location; int
我正在尝试缩进以下代码的字符串输出,但由于某种原因,我的变量不断从文件中提取,并且具有不同长度的噪声或空间(我不确定)。 这是我的代码: #include #include int main (v
我想让用户选择一个选项。所以我声明了一个名为 Choice 的变量,我希望它输入一个只能是 'M' 的 char 、'C'、'O' 或 'P'。 这是我的代码: char Choice; printf
我正在寻找一种解决方案,将定义和变量的值连接到数组中。我已经尝试过像这样使用 memcpy 但它不起作用: #define ADDRESS {0x00, 0x00, 0x00, 0x00, 0x0
我是一名优秀的程序员,十分优秀!