热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(五十)时间序列分析一:效应分解法

时间序列的效应分解将时间序列分为趋势、周期、随机三个部分,并对前两个部分(稳定的可用于预测的)使用曲线拟合。长期趋势变动:序列朝着一定的方向持续上升或下降,或停留在某一水平上的倾向

时间序列的效应分解

将时间序列分为趋势、周期、随机三个部分,并对前两个部分(稳定的可用于预测的)使用曲线拟合。

  • 长期趋势变动:序列朝着一定的方向持续上升或下降,或停留在某一水平上的倾向。比如随着企业近段时间拓展业务,销售额稳步上升的趋势。
  • 周期性/季节性变动:周期性通常是指经济周期,由非季节因素引起的与波形相似的涨落起伏波动,比如GDP增长率随经济周期的变化而变化。但是周期性变动稳定性不强,在实际操作中主要考虑的是季节性变动,比如啤酒的销售量在春夏季较高而在秋冬季较低、交通流量在上班高峰时大而其他时间小等。
  • 随机变动:随机变动指随机因素导致时间序列的小幅度波动。

这三种效应可以组合成加法模型和乘法模型,即三种效应之间相加或者相乘,图形上的区别就是加法效应下季节效应的振幅随时间变化不大(第一行图),乘法效应下振幅逐渐增大(第二行图)。
《(五十)时间序列分析一:效应分解法》
《(五十)时间序列分析一:效应分解法》

案例

AirPassengers数据集是一份某航空公司从1949年到1960年每月的客运量数据。可以使用Facebook数据科学家贡献的fbprophet包(安装时cmd里面运行 conda install -c conda-forge fbprophet):

import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
df = pd.read_csv(r'C:\Users\lenovo\Desktop\AirPassengers.csv')
#将字符串改为日期
df['DATE'] = pd.to_datetime(df['DATE'])
df.head()
Out[4]:
DATE AIR
0 1949-01-01 112
1 1949-02-01 118
2 1949-03-01 132
3 1949-04-01 129
4 1949-05-01 121

由于Prophet函数要求其只能处理单变量的时间序列,导入的数据第一列必须是日期类型的变量,变量名为“ds” ;第二列必须为数值类型的变量,变量名称必须为”y”:

df = df.rename(columns={ 'DATE':'ds','AIR':'y'})
df.head(2)
Out[6]:
ds y
0 1949-01-01 112
1 1949-02-01 118
#看看该时间序列数据的趋势和周期性
pd.plotting.register_matplotlib_converters()
#上一条代码是因pandas版本的问题造成时间戳'Timestamp'的报错处理
ax = df.set_index('ds').plot(figsize=(12, 8))
ax.set_ylabel('Monthly Number of Airline Passengers')
ax.set_xlabel('Date')
plt.show()

《(五十)时间序列分析一:效应分解法》
下面使用Prophet函教对时间序列进行建模。虽然该函数有很多参数,但是大郎分采用默认即可。其中只有两个参数需要修改:growth参数用于指定长期趋势部分的拟合函数的形式,选项有Iiner和logistic两个。通过观察该数据集的趋势可以确定是线性趋势,假设发现时间序列的趋势是非线性的,无论是指数形式还是对数形式,均可以选择logstic;预测值的置信区间默认为80%,而我们常用的是95%,因此需要设置一下:

# 设置趋势的形式和预测值的置信区间为95%
my_model = Prophet(growth='linear',interval_width=0.95)
my_model.fit(df)

接下来进行预测。make_future_dataframe函数用于准备好预测使用的日期字段,periods参数指定预测的期数,由于freq设置为“MS”代表月度数据,因此36期代表生成了3年的月度字段。predict函数使用只有日期字段的空表进行预测,其预测的输出变量较多,主要变量是时间序列的预测均值”yhat”,预测均值95%置信区间的下限”yhat_lower”,预测均值95%置信区间的上限”yhat_upper”:

future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(2)
Out[7]:
ds yhat yhat_lower yhat_upper
178 1963-11-01 534.021253 488.073721 578.596021
179 1963-12-01 563.611828 517.280040 606.959414

最后展示预测的结果,其中uncertainty参数用于设置是否在图中展示置信区间:

my_model.plot(forecast,uncertainty=True)

《(五十)时间序列分析一:效应分解法》
在图中,蓝色的实线为预测的均值,浅蓝色区域为95%的置信区间,黑色的点为原始数据,最后三年为预测数据。可以发现随着时间的增长,季节效应的振幅逐渐增大,但是Prophet本身没有设置加法效应和乘法效应的选项,只能做加法效应模型。如果需要做乘法模型,只需要对时间序列取自然对数

import numpy as np
df['y'] = np.log(df['y'])
my_model = Prophet(growth='linear',interval_width=0.95)
my_model.fit(df)
future_dates = my_model.make_future_dataframe(periods=36, freq='MS')
forecast = my_model.predict(future_dates)
my_model.plot(forecast,uncertainty=True)

《(五十)时间序列分析一:效应分解法》
可以看到,这个模型拟合效果更好(对比1957年-1961年那一段),预测更符合实际情况。也就是说如果季节效应随着趋势增加,就需要对数据取对数再建模


推荐阅读
  • 本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。 ... [详细]
  • 本文介绍了如何使用MATLAB调用摄像头进行人脸检测和识别。首先需要安装扩展工具,并下载安装OS Generic Video Interface。然后使用MATLAB的机器视觉工具箱中的VJ算法进行人脸检测,可以直接调用CascadeObjectDetector函数进行检测。同时还介绍了如何调用摄像头进行人脸识别,并对每一帧图像进行识别。最后,给出了一些相关的参考资料和实例。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了源码分析--ConcurrentHashMap与HashTable(JDK1.8)相关的知识,希望对你有一定的参考价值。  Concu ... [详细]
  • AstridDAO 专访:波卡稳定币黑马 BAI
    加入Pol ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
author-avatar
奈奈奈酱奈32_875
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有