首页 > 编程语言 >基于python的非平稳时间序列模型

基于python的非平稳时间序列模型

时间:2024-07-21 11:29:14浏览次数:11  
标签:plt python 模型 tr 差分 fontsize fig 序列


前言

平稳时间序列指的是宽平稳时间序列,就是指时间序列的均值、方差和协方差等一二阶矩存在但不随时间改变,表现为时间的常数。若三个条件有一个不成立,那么就称该序列为非平稳时间序列。包括确定性趋势时间序列和随机性趋势时间序列。
要想把非平稳的时间序列转化为平稳的时间序列,需要去趋势和差分方法消除确定性趋势和随机性趋势。
实际数据分析中,一阶差分提取线性趋势、二阶或三阶等地阶差分提取曲线趋势,对于含有季节趋势的数据,通常选取差分的步长等于季节的周期可以较好地提取季节信息。
处理确定性趋势时间序列最好采用减去趋势部分的方法来去趋势,特别是对于曲线趋势明显的方差齐性序列来讲,采用此方法更好;而处理随机性趋势的时间序列最好使用差分运算来去趋势。
一般来讲,具有随机性趋势的非平稳时间序列在经过适当差分之后会变成一个平稳时间序列。此时,我们称这个非平稳序列为差分平稳序列。对差分平稳序列可以使用求和自回归移动平均模型(ARIMA)进行拟合。对非平稳时间序列的思路是转化为平稳序列,如果检验是非平稳的序列,对其进行差分运算,直到检验是平稳的;如果检验是平稳的,那么转入ARMA的建模步骤。
对序列作一阶差分可以消除线性趋势;作二阶、三阶等低阶差分可以消除曲线趋势,但是我们也知道这样做会有过差分风险,即人为造成的非平稳和不好的信息。在进行ARIMA建模时,一方面要看到差分运算能够充分提取确定性信息,另一方面也要看到差分运算的解释性不强,同时有过差分风险。
如果担心浪费残差信息。当残差中含有自相关系数时,可继续对残差序列建立自回归模型,这样即自然的提出了残差自回归模型。.
在进行残差自回归模型建模时,首先拟合趋势项和季节变化项,然后进行残差检验。当残差序列自相关不显著时,则建模结束;当残差序列自相关性显著时,再对残差进行建模。残差的建模步骤与ARIMA模型建模步骤一致。

代码

#一阶差分运算
elec_prod = np.loadtxt("elec_prod.txt")
index = pd.date_range(start="1974", end="2007", freq="M")
elec_df = pd.Series(elec_prod,index=index).diff()

fig = plt.figure(figsize=(12,4), dpi=150)
ax = fig.add_subplot(111)
ax.plot(elec_df, linestyle="-", color="blue")
ax.set_ylabel(ylabel="一阶差分序列值",fontsize=17)
ax.set_xlabel(xlabel="时 间",fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/5_3.png')

#二阶差分运算
ningxia_gdp = np.loadtxt("ningxia_gdp.txt")
index = pd.date_range(start="2001", end="2021", freq="Y")
ningxia_gdp_df = pd.Series(ningxia_gdp,index=index).diff().diff()

fig = plt.figure(figsize=(12,4),dpi=150)
ax = fig.add_subplot(111)
ax.plot(ningxia_gdp_df, marker="o", linestyle="-", color="blue")
ax.set_ylabel(ylabel="二阶差分序列值", fontsize=17)
ax.set_xlabel(xlabel="时间", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/5_4.png')

#首先做一阶差分取消线性趋势,然后做四步差分提取季节趋势
Index = pd.date_range(start="2013", end="2017-06-30", freq="Q")
gdp_df = pd.read_csv('JDGDP.csv'); gdp_df.index = Index

cgdp = gdp_df.diff().diff(periods=4)
fig = plt.figure(figsize=(12,4),dpi=150)
ax = fig.add_subplot(111)
ax.plot(cgdp, marker="o", linestyle="-", color="blue")
ax.set_ylabel(ylabel="差分序列值", fontsize=17)
ax.set_xlabel(xlabel="时间", fontsize=17)
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname='fig/5_5.png')

#序列作一阶差分运算,对所得差分序列作出时序图、自相关图和偏自相关图
tr_data = np.loadtxt("tr_industry.txt")
Index = pd.date_range(start="1995", end="2015", freq="Y")
tr_ts = pd.Series(tr_data,index=Index)
tr_diff = tr_ts.diff()

fig = plt.figure(figsize=(12,6), dpi=150)
ax1 = fig.add_subplot(221)
ax1.plot(tr_ts,marker='o', linestyle='-', color='b')
ax1.set_ylabel(ylabel="第三产业增加值", fontsize=17)
ax1.set_xlabel(xlabel="图 5.7 第三产业增加值序列的时序图")
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
ax2 = fig.add_subplot(222)
ax2.plot(tr_diff, marker='o', linestyle='-', color='b')
ax2.set_ylabel(ylabel="一阶差分序列", fontsize=17)
ax2.set_xlabel(xlabel="图 5.8 差分序列的时序图")
plt.xticks(fontsize=15); plt.yticks(fontsize=15)
ax3 = fig.add_subplot(223)
ACF(tr_diff[1:], lag=8)
ax4 = fig.add_subplot(224)
PACF(tr_diff[1:], lag=8, xlabel='lag',fname="fig/5_7.png")

import statsmodels.api as sm
tr_res = sm.tsa.SARIMAX(tr_ts, order=(0, 1, 1))
tr_est = tr_res.fit()
print(tr_est.summary())

acorr_ljungbox(tr_est.resid[1:],lags = [2,4,6,8],boxpierce=True, return_df=True)

tr_fore = tr_est.get_forecast()
confint = pd.concat([tr_fore.summary_frame(alpha=0.20),tr_fore.summary_frame().iloc[:,2:]],axis=1,ignore_index=False)
print(confint)

fig = plt.figure(figsize=(12,4),dpi=150)
ax = fig.add_subplot(111)
ax.plot(tr_ts, marker="o", linestyle="-", color="blue")
fcast1 = tr_est.get_forecast(2).summary_frame()
fcast1['mean'].plot(ax=ax, marker="o", color="red")
fcast2 = tr_est.get_forecast(steps=2).summary_frame(alpha=0.2)
ax.fill_between(fcast1.index, fcast1['mean_ci_lower'], fcast1['mean_ci_upper'], color='green', alpha=0.3)
ax.fill_between(fcast2.index, fcast2['mean_ci_lower'], fcast2['mean_ci_upper'], color='black', alpha=0.5)
ax.legend(["Real Values","Forecast"],loc="upper left",fontsize=13)
ax.set_ylabel(ylabel="第三产业增加值", fontsize=17)
ax.set_xlabel(xlabel="时 间", fontsize=17)
plt.xticks(rotation=360,fontsize=15); plt.yticks(fontsize=15)
fig.tight_layout(); plt.savefig(fname="fig/5_11.png")

标签:plt,python,模型,tr,差分,fontsize,fig,序列
From: https://blog.csdn.net/frankgis/article/details/140574446

相关文章

  • 猫头虎 Python知识点分享:pandas--read_csv()用法详解
    ......
  • 使用 Python 绘图
    我有一个.txt文件,从中找到有序对,然后使用numpy和matplotlib绘制图形。例如,这些是我的有序对:[[(4.0,0),(0,6.0)],[(6.0,0),(0,3.0)]](每个子列表代表最终图形中的一条线)图形如下所示:但我想找到两条线之间的交点。如果有更多的线,我怎样才能找到它们......
  • 用python计算形状的距离
    我想计算该图像的最小垂直距离和最大水平距离。就像线条一样。我正在尝试:_,binary_image=cv2.threshold(image,0,255,cv2.THRESH_BINARY)horizontal_distances=np.sum(binary_image==255,axis=1)max_horizontal_distance=np.max(horizontal_distance......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 带时间戳的 Python 命令行历史记录
    有没有办法记录每个命令的时间?例如,挂钩交互式shell,以便它将相同的内容写入~/.python_history到~/.python_history_timestamps但带有时间戳?我正在跟踪我白天所做的事情并将其放入我的日历中。为了帮助回溯,我使用了firefox历史记录、Dropbox活动、一个......
  • 在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”
    我试图在迭代字典时从字典中删除一个键。从字典中删除键时,我得到:RuntimeError:dictionarychangedsizeduringiteration我的代码:mydict={'one':1,'two':2,'three':3,'four':4}fork,vinmydict.items():ifk=='two'......
  • Python pyTelegramBotAPI:设置不受循环影响的变量
    我想创建一个基本上是布尔值的变量(无论机器人是否工作)。但是,当使用TeleBot.polling()时,脚本开始无限循环,所以如果我在代码开头设置一个变量就像:is_bot_working=True,变量将始终为真,反之亦然。那么,我应该如何设置一个不受循环影响的变量?这就是代码:impor......
  • 编解码器无法解码位置 2-3 中的字节:截断的 \UXXXXXXXX 转义 (Python QREADER)
    我正在尝试pythonqreader模块,但每次我尝试运行它时,我都会收到SyntaxError:(unicodeerror)'unicodeescape'codeccan'tDecodebytesinposition2-3:truncated\UXXXXXXXXescapeerror.fromqreaderimportQReaderfromcv2importQRCodeDetector,imreadfrompyz......
  • Python 工程师对 3D 高斯溅射的介绍(第 1 部分)
    从Python工程师的角度理解和编写GaussianSplatting欢迎来到雲闪世界。2023年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的3D高斯溅射”的论文。¹该论文展示了实时神经渲染的重大进步,超越了NeRF等先前方法的实用性。²......
  • AI跟踪报道第48期-新加坡内哥谈技术-本周AI新闻:Open AI 和 Mistral的小型模型
       每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https:......