时间序列的季节性:3种模式及8种建模方法

news2024/11/24 14:53:46

分析和处理季节性是时间序列分析中的一个关键工作,在本文中我们将描述三种类型的季节性以及常见的8种建模方法。

什么是季节性?

季节性是构成时间序列的关键因素之一,是指在一段时间内以相似强度重复的系统运动。

季节变化可以由各种因素引起,例如天气、日历或经济条件。各种应用程序中都有这样的例子。由于假期和旅游的缘故,夏天的机票更贵。另一个例子是消费者支出,由于因为12月的假期而增加。

季节性是指某些时期的平均值与其他时期的平均值不同。这个问题导致该系列是非平稳的。这就是为什么在建立模型时分析季节性是很重要的。

3种模式

在时间序列中可以出现三种类型的季节模式。季节性可以是确定性的,也可以是随机的。在随机方面,季节模式可能是平稳的,也可能不是。

这些季节性并不是相互排斥的。时间序列可以同时具有确定性和随机季节性成分。

1、确定的季节性

具有确定性季节性的时间序列具有恒定的季节模式。它总是以一种可预测的方式出现,无论是在强度上还是在周期性上:

相似强度:在同一季节期间,季节+模式的水平保持不变;

不变周期性:波峰和波谷的位置不改变。也就是说季节模式每次重复之间的时间是恒定的。

比如说下面这个就是一个具有确定性季节性的合成月时间序列:

 import numpy as np
 
 period = 12
 size = 120
 beta1 = 0.3
 beta2 = 0.6
 sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 
 xt = np.cumsum(np.random.normal(scale=0.1, size=size))
 
 series_det = xt + beta1*sin1 + beta2*cos1 + np.random.normal(scale=0.1, size=size)

我们也可以用傅里叶级数来模拟季节性。傅里叶级数是不同周期的正弦和余弦波。如果季节性是确定性的,那么用傅里叶级数来描述是非常准确的。

2、随机平稳的季节性

 beta1 = np.linspace(-.6, .3, num=size)
 beta2 = np.linspace(.6, -.3, num=size)
 sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 
 xt = np.cumsum(np.random.normal(scale=0.1, size=size))
 
 # synthetic series with stochastic seasonality
 series_stoc = xt + beta1*sin1 + beta2*cos1 + np.random.normal(scale=0.1, size=size)

在连续的季节周期(如一年)中随机平稳的季节性演变。虽然强度难以预测,但周期性大致保持不变。

有了确定性的季节性,给定月份的预测不会随年份而改变。对于随机平稳季节性,最佳猜测取决于前一年同月的值。

3、随机非平稳季节性

季节模式会在几个季节期间发生显著变化,这种季节性的周期性也随着时间的推移而变化。这意味着波峰和波谷的位置不同。

这种季节性模式的例子出现在不同的领域。这些数据包括消费系列或工业生产数据。当时间序列具有综合季节性时,变化很难预测。

季节性时间序列的测试

可视化时间序列是一种检查季节模式的简单方法。但是可视化并不能系统的说明季节性的模式,所以就需要更系统的方法来描述时间序列的而季节性。

1、测量季节强度

我们可以根据以下方法量化季节模式的强度:

 import pandas as pd
 from statsmodels.tsa.api import STL
 
 def seasonal_strength(series: pd.Series) -> float:
     # time series decomposition
     series_decomp = STL(series, period=period).fit()
     
     # variance of residuals + seasonality
     resid_seas_var = (series_decomp.resid + series_decomp.seasonal).var()
     # variance of residuals
     resid_var = series_decomp.resid.var()
 
     # seasonal strength
     result = 1 - (resid_var / resid_seas_var)
 
     return result

这个函数估计季节性的强度,不管它是确定性的还是随机的。

 # strong seasonality in the deterministic series
 seasonal_strength(series_det)
 # 0.93
 
 # strong seasonality in the stochastic series
 seasonal_strength(series_stoc)
 # 0.91

如果该值高于0.64[2],则需要应用季节性差异过滤器。另一种检测季节性的方法是QS测试,它在季节性滞后时检查自相关性。

2、检测非平稳季节性

有一些统计检验是用来检验季节模式是否是非平稳的。

一个常见的例子是Canova-Hansen (CH)测试。其假设如下:

  • H0(零假设):季节模式平稳(无季节单位根);
  • H1:该系列包含一个季节性单位根

OCSB测试和HEGY测试是CH的两种替代方法。这些方法都可以在Python的pmdarima 库中找到。

 from pmdarima.arima import nsdiffs
 
 period = 12 # monthly data
 
 nsdiffs(x=series_det, m=period, test='ch')
 nsdiffs(x=series_det, m=period, test='ocsb')
 
 nsdiffs(x=series_stoc, m=period, test='ch')
 nsdiffs(x=series_stoc, m=period, test='ocsb')

函数nsdiffs返回使序列平稳所需的季节差步数。

3、相关性检测

还有其他专为季节数据设计的检测。例如,季节性肯德尔检验是一种非参数检验,用于检查季节性时间序列的单调趋势。

检测季节性模式

季节性指的是在一段时间内重复出现的模式。这是一个重要的变化来源,对建模很重要。

有很多种种处理季节性的方法,其中一些方法在建模之前去掉了季节成分。经季节调整的数据(时间序列减去季节成分)强调长期影响,如趋势或商业周期。而另外一些方法增加了额外的变量来捕捉季节性的周期性。

在讨论不同的方法之前,先创建一个时间序列并描述它的季节模式,我们还继续使用上面的代码

 period = 12 # monthly series
 size = 120
 
 beta1 = np.linspace(-.6, .3, num=size)
 beta2 = np.linspace(.6, -.3, num=size)
 sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
 
 xt = np.cumsum(np.random.normal(scale=0.1, size=size))
 
 yt = xt + beta1 * sin1 + beta2 * cos1 + np.random.normal(scale=0.1, size=size)
 
 yt = pd.Series(yt)

然后通过强度来描述季节模式:

 seasonal_strength(yt, period=12)
 # 0.90

结果为0.90,表明季节性确实很强。该时间序列的自相关图如下图所示:

再使用我们上面介绍的Canova-Hansen检验来查看季节性单位根:

 from pmdarima.arima import nsdiffs
 
 nsdiffs(x=yt, m=period, test='ch')
 # 0

结果为0,表示不存在季节单位根。也就是说季节模式是平稳的。

那么,我们该如何应对像这样的季节性模式呢?

季节性建模

1、虚拟变量

季节性虚拟变量是一组二元变量。它们表示一个观测值是否属于一个给定的时期(例如一月)。

下面是一个如何创建这些变量的例子:

 from sktime.transformations.series.date import DateTimeFeatures
 from sklearn.preprocessing import OneHotEncoder
 
 monthly_feats = DateTimeFeatures(ts_freq='M',
                                  keep_original_columns=False,
                                  feature_scope='efficient')
 
 datetime_feats = monthly_feats.fit_transform(yt)
 datetime_feats = datetime_feats.drop('year', axis=1)
 
 encoder = OneHotEncoder(drop='first', sparse=False)
 encoded_feats = encoder.fit_transform(datetime_feats)
 
 encoded_feats_df = pd.DataFrame(encoded_feats,
                                 columns=encoder.get_feature_names_out(),
                                 dtype=int)

这段代码产生如下数据。

在每个观察中获得有关季度和月份的信息(左侧表)。该信息存储在datetime_feats对象中。然后使用one-hot编码来创建虚拟变量(右侧表)。

如果季节性是确定的,那么季节虚拟变量是非常有效。因为确定的季节性种季节模式是固定的,也就是强度和周期性基本不变。并且我们还可以通过检验季节虚拟变量的系数来分析季节效应及其变化,这有利于模型的可解释性。

但是季节性虚拟变量的缺点也很明显,它假设不同的时期是独立的。比如1月份的观测结果与12月份的观测结果相关。虚拟变量对这种相关性视而不见。所以如果季节模式发生变化,虚拟变量就会产生很多问题。

2、傅里叶级数

傅里叶级数是基于正弦和余弦波的周期性和确定性的变量。与季节性虚拟变量相反,这些三角函数将季节性建模为周期性模式,并且这种结构更能反映现实。

sktime中包含了很好的方法:

 from sktime.transformations.series.fourier import FourierFeatures
 
 fourier = FourierFeatures(sp_list=[12],
                           fourier_terms_list=[4],
                           keep_original_columns=False)
 
 fourier_feats = fourier.fit_transform(yt)

这里需要指定两个主要参数:

  • sp_list:将季节期间作为一个列表(例如,12个月的数据)
  • fourier_terms_list:项的个数,指要包含的正弦和余弦级数的个数。这些都会影响到表示的平滑度。

傅里叶级数是可以添加到模型中的解释变量。并且可以将这些特性与滞后特性结合起来。

3、径向基函数

径向基函数(RBF)是傅里叶级数的替代方法。它他用过创建重复的钟形曲线来模拟重复的图案。

在scikit-lego包中有一个RepeatingBasisFunction方法:

 from sklego.preprocessing import RepeatingBasisFunction
 
 rbf_encoder = RepeatingBasisFunction(n_periods=4,
                                      column='month_of_year',
                                      input_range=(1, 12),
                                      remainder='drop',
                                      width=0.25)
 
 rbf_features = rbf_encoder.fit_transform(datetime_feats)
 rbf_features_df = pd.DataFrame(rbf_features,
                                columns=[f'RBF{i}'
                                         for i in range(rbf_features.shape[1])])

该方法最重要的三个参数如下:

  • n_periods:要包含的基函数的个数
  • input_range:列的输入范围。例如,在上面的例子中,我们使用(1,12),这是月份的范围;
  • width:径向基函数的宽度,主要的作用是控制其平滑度

与傅里叶级数一样,RBF变量可以用作模型中的解释变量。

4、季节性自回归

自回归是大多数预测模型的基础。这个想法是使用最近的过去观察(滞后)来预测未来的值。这个概念可以扩展到季节性模型。季节性自回归模型包括同一季节的过去值作为预测因子。

SARIMA是一种流行的方法,它应用了这个想法:

 import pmdarima as pm
 model = pm.auto_arima(yt, m=12, trace=True)
 
 model.summary()
 # Best model:  ARIMA(0,1,0)(1,0,0)[12]

利用季节滞后作为解释变量是模拟季节性的有效方法。但是在使用这种方法时,应该处理季节性单位根。因为非平稳的数据会产生很多问题。

5、添加额外变量

季节性虚拟变量或傅立叶级数等方法都可以捕捉到周期性模式。但是这些方法都是替代性的方法。

我们也可以通过添加额外变量的方式对季节性进行建模,例如温度或每个月的工作日数等外生变量来模拟季节性。

6、季节性差分

通过在建模之前从数据中删除季节性来处理季节性。这种方法叫做季节差分。

季节差异是取同一季节连续观测值之间的差异的过程。这种操作对于去除季节性单位根部特别有用。

可以使用diff方法进行季节差异:

 from sklearn.model_selection import train_test_split
 from sktime.forecasting.compose import make_reduction
 from sklearn.linear_model import RidgeCV
 
 train, test = train_test_split(yt, test_size=12, shuffle=False)
 
 train_sdiff = train.diff(periods=12)[12:]
 
 forecaster = make_reduction(estimator=RidgeCV(),
                             strategy='recursive',
                             window_length=3)
 
 forecaster.fit(train_sdiff)
 diff_pred = forecaster.predict(fh=list(range(1, 13)))

我们在差分序列上建立了Ridge回归模型。通过还原差值运算,可以得到原始尺度上的预报。

7、时间序列分解

还可以使用时间序列分解方法(如STL)去除季节性。

差分和分解的区别是什么?

差分和分解都用于从时间序列中去除季节性。但是转换后的数据的建模方式不同。

当应用差分时,模型使用差分数据。所以需要还原差分操作以获得原始尺度上的预测。

而使用基于分解的方法,需要两组预测。一个是季节性部分,另一个是季节性调整后的数据。最后的预测是各部分预测的总和。

下面是一个基于分解的方法如何工作的例子:

 from statsmodels.tsa.api import STL
 from sktime.forecasting.naive import NaiveForecaster
 
 # fitting the seasonal decomposition method
 series_decomp = STL(yt, period=period).fit()
 
 # adjusting the data
 seas_adj = yt - series_decomp.seasonal
 
 # forecasting the non-seasonal part
 forecaster = make_reduction(estimator=RidgeCV(),
                             strategy='recursive',
                             window_length=3)
 
 forecaster.fit(seas_adj)
 
 seas_adj_pred = forecaster.predict(fh=list(range(1, 13)))
 
 # forecasting the seasonal part
 seas_forecaster = NaiveForecaster(strategy='last', sp=12)
 seas_forecaster.fit(series_decomp.seasonal)
 seas_preds = seas_forecaster.predict(fh=list(range(1, 13)))
 
 # combining the forecasts
 preds = seas_adj_pred + seas_preds

在这个例子中,我们建立了一个Ridge 回归模型来预测经季节调整后的数据。然后将两个预测加在一起。

8、动态线性模型(DLM)

回归模型的参数通常是静态的。它们不随时间变化,或者是时不变的。DLM是线性回归的一种特殊情况。其主要特点是参数随时间而变化,而不是静态的。

dlm假定季节性时间序列的结构随季节而变化。因此合理的方法是建立具有时变参数的模型。随季节变化的参数。

参考文献[4]中的书的第15章提供了这种方法的一个简洁的R示例。他们使用时变的MARSS(多元自回归状态空间)方法来模拟季节性变化。

总结

时间序列建模并不是一项简单的任务,它需要考虑多个因素和技术。季节性的存在可以对时间序列数据的分析和预测产生重要影响。识别和理解季节性模式有助于揭示数据的周期性变化、制定季节性调整策略以及进行更准确的预测。时间序列建模往往需要结合经验和领域知识,同时灵活运用不同的技术和方法,以获得准确、可靠的模型和预测结果。

作者:Vitor Cerqueira

https://avoid.overfit.cn/post/89fc450f115643ad8ef53cd31712ce68

引用:

[1] Canova, F. and Hansen, Bruce E. (1995) “Are seasonal patterns constant over time? A test for seasonal stability”. Journal of Business & Economic Statistics, 13(3), pp. 237–252

[2] Wang, X, Smith, KA, Hyndman, RJ (2006) “Characteristic-based clustering for time series data”, Data Mining and Knowledge Discovery, 13(3), 335–364.

[3] Holmes, Elizabeth E., Mark D. Scheuerell, and E. J. Ward. “Applied time series analysis for fisheries and environmental data.” NOAA Fisheries, Northwest Fisheries Science Center, Seattle, WA (2020).

[4] Holmes, Elizabeth E., Mark D. Scheuerell, and E. J. Ward. “Applied time series analysis for fisheries and environmental data.” NOAA Fisheries, Northwest Fisheries Science Center, Seattle, WA (2020).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看见未来:定位咨询如何预测行业趋势

商业竞争时代,变化无处不在。科技日新月异,消费者需求日益多元,市场环境更加动态不定。在这个快速发展的时代,如果企业想要继续领先,就必须有能力预见未来,适应并驾驭这些变化,这就是定位咨询的…

【QT】使用QtCreator进行debug

使用QtCreator进行debug 简单操作 设置断点 鼠标右键在需要打断点的地方打断点 debug 点击小甲虫按钮,启动之后可以看到三个窗口表格 这里显示变量的值。 这里显示函数当前的执行处以及断点的地方 这三个按钮分别代表的含义是: step into: 单步执行&…

通过宝塔面板部署一个SpringBoot+Vue前后端分离项目的指南(三更)

采取的部署方案 阿里云服务器->FinalShell->宝塔面板。 近期需要将自己的一个SpringBootVue前后端分离项目,并且是分模块开发的项目部署到服务器上,记录一下踩坑的地方,结合C站大佬的解决方案,循循善诱一步步部署到服务器上…

部署开源项目 Casdoor 身份认证管理系统到本地

前言 Casdoor是一个基于OAuth 2.0、OIDC、SAML 和 CAS 的,UI-first的身份和访问管理(IAM)/单点登录(SSO)平台。使用 Go 和react开发,前后端分离,内置第三方应用登录服务。 Casdoor 有四个核心概念,分别是 组织(Organization)&am…

vue3+antd——项目搭建初始化配置——技能提升

vue-antd-admin vue2 版本链接: https://gitee.com/iczer/vue-antd-admin?_fromgitee_search vue3 版本链接: https://github.com/stepui/stepin-template 预览地址: https://stepui.gitee.io/stepin-template 使用文档: http://stepui.gitee.io/step…

全网最全,接口测试面试题+答案,轻松拿捏面试官...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 你怎么理解get和p…

5. 缓存模块

缓存概述 对于缓存功能,相信大家都十分熟悉了。一旦我们发现系统的性能存在瓶颈需要优化时,可能第一时间想到的方式就是加缓存。缓存本质上是一种空间换时间的技术,它将计算结果保存在距离用户更近、或访问效率更高的存储介质中,…

使用supervisor启动进程open files too many问题

今天线上出现了open files too many的问题,查看问题: 1. ulimit -a查看系统最大值发现可以开启的文件句柄只有1024个 果断修复: 1. 查看全局配置文件 ls /etc/security/limits.d/ 比如环境中有如下配置文件,20-nproc.conf名字可…

e2e测试框架之Cypress

谈起web自动化测试,大家首先想到的是Selenium!随着近几年前端技术的发展,出现了不少前端测试框架,这些测试框架大多并不依赖于Selenium,这一点跟后端测试框架有很大不同,如Robot Framework做Web自动化测试本…

linux -rw-r--r-x的含义

-rw-r--r-x的含义 权限显示位一共为10位,分为四段,从第2位算起,每3个1组 -rw-r--r-x-表示为普通文件文件所属用户拥有的权限rw-:426该用户所属组拥有的权限r--:4其他用户拥有的权限r-x:415 操作英文对应数…

计及需求响应和电能交互的多主体综合能源系统主从博弈优化调度策略(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章 💥1 概述 文献来源: 摘要:针对区域综合能源系统多物理系统耦合和多利益主体参与特点,如何考虑各运行主体调度地位与调度…

Spring初识(二)

前言 经过前面的学习,我们已经知道spring就是包含了众多方法的Ioc,那么既然是容器,就具备两个功能,我们接下来就是要介绍以下两个功能: 1.将对象存储到容器(spring)中: 2.从容器(spring)中将对象取出来. 这两个功能就应发出来,spring的创建和使用. 一.Spring创建 我们先来说…

web浏览器在线预览Excel,PDF,world文档解决方案

众所周知啊,在web浏览器中是无法直接预览Excel、world文档等文件的,PDF有的浏览器是打开预览,有的浏览器是跳转到下载页,行为不一致也是让开发者头疼的事情。 今天给大家提供一个解决方案,实现office文件在线预览的解…

vue3中使用Vue.Draggable的clone模式及遇到的坑

最近有个需求是从左边一个列表中,拖动列表元素到右边列表中,并且不是移动拖拽,而是复制拖拽,元素在右边列表中可以重复,比如左边是参加某个游戏的队员名单,右边是出场顺序,队员可以重复上场。类…

网络运维工作是什么的?

互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 724 小时为用户提供高质量的服务。 运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,进行日常巡检发现服务…

【数学建模】数据预处理

在数学建模赛题中,官方给所有选手的数据可能受到主观或客观条件的影响有一定的问题,如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响,因此为了保证数据的真实性和建模结果的可靠性,需要在建模之前对数据进行相…

VS工程项目中属性中无Qt设置问题解决方案

VS工程项目中属性中无Qt设置问题解决方案 若VS工程中,创建的是Qt工程,或者从Qt Creator工程转换为VS 工程时,VS项目属性中确无Qt Project Setttings等设置时,可通过如下方案解决 1. 右键项目,在下拉框中选择Qt项 2.…

微信号长时间不用会被腾讯回收

我是卢松松,点点上面的头像,欢迎关注我哦! 估计很多人不知道的一个冷知识:你的微信号并不归你本人所有,你只有账号的使用权,微信账号的所有权归腾讯公司所有。如果长期不使用,或者是违规&#…

MySQL—创建和管理表(六)

1.数据库相关操作 -- 1 创建数据库 -- 1.1 创建一个保存员工信息的数据库 CREATE DATABASE employees; -- 1.2 其他相关指令 -- 1.2.1 查看当前所有数据库 SHOW DATABASES; -- 1.2.2 “使用”一个数据库,使其作为当前数据库 USE employees;-- 2 命名规则 -- 见ppt …

虹科分享 | MACsec-先进的车载网络安全解决方案

Media Access Control Security(简称 MACsec)是以太网上最先进的安全解决方案。它为以太网上传输的几乎所有帧提供完整性保护、重放保护和可选的机密性保护。与其他解决方案相比,包括了单播、组播和广播消息以及在第2层上运行的所有协议。 M…