精华内容
下载资源
问答
  • 时间序列数据简介

    2021-08-11 19:14:18
    前言 1. 引言 1.1 时间序列定义 1.2 应用场景 1.3研究方法的递进 2. 时间序列数据 2.1 数据的获取 2.2 数据时间轴的确定 2.3 时间序列遇到问题

    前言

    由于研究方向是时间序列预测,对时间序列数据也颇感兴趣,特此简单记录学习过程。

    参考文章:

    1. 时间序列数据分析101 - (1) 一份全面详尽的时间序列入门教程

    1. 引言

    1.1 时间序列

    • 定义:按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周月等。
      比如,每天某产品的用户数量,每个月的销售额,这些数据形成了以一定时间间隔的数据。
    • 时间序列分析:指从按时间排序的数据点中抽取有价值的总结和统计信息的行为。
      时间序列分析既包含了对过去数据的诊断,也包括对未来数据的预测

    时间序列可以分为平稳序列和非平稳序列两大类

    • 平稳序列
      序列中的各观察值基本上在某个固定的水平上波动,虽然在不同的时间段波动的程度不同,但并不存在某种规律,波动可以看成是随机的
    • 非平稳序列
      包含趋势、季节性或周期性的序列,它可能只含有其中一种成分,也可能含有几种成分。

    1.2 应用场景

    • 医学
    • 天气
    • 经济学
    • 天文学
    • 海洋学

    落地场景:预测、异常检测和动态时间规整等

    1.3 研究方法的递进

    • 统计学方法 :
    • 传统时序方法:AR、ARMA、ARIMA
    • 机器学习模型:ANN、XGBoost、RF
    • 深度学习模型:LSTM、Transformer、Bert

    时间序列分析的主要任务之一是要建立时间序列适合的模型,通过建立模型来描述现象、事物随时间推移的变化规律性;并常常借助于模型进行预测。

    2. 时间序列数据

    2.1 数据的获取

    • 开源数据仓库

    开源时间序列数据集

      - 音乐库数据
      - 服务监控数据集
      - 国家经济数据
      - 政府开放数据
      - 数据竞赛网站
    
    • 从非显式数据中构造时间特征,创造时间序列数据

    2.2 数据时间轴的确定

    有时候在数据存储时并没有一列显式存在的时间列,这时候就需要我们去人为寻找和构造。

    • 以事件记录的时间构造时间列
    • 以另一个和时间相关的元素构造时间列,例如在一个数据集中行驶距离和时间是正相关的,此时就可以以距离来构造时间列
    • 以物理轨迹的顺序作为时间列,例如在医学,天气等领域有些数据是以图片的形式存储的,此时可以从图像中提取时间列

    2.3 时间序列遇到问题

    • 时间值是在哪个过程产生的,以及何时产生的。通常事件发生的时间和事件被记录的时间往往是不一致的。
    • 处理历史遗留数据,并没有清洗记录的文档说明,也无法找到处理数据流的人来确认时间戳产生的方式。
    • 时间分辨率,这对于后续特征构造和模型有效性都有很大的影响。
    • 数据缺失值处理以及可靠性
    展开全文
  • 在前几次分享中我们知道,很多时序算法都依赖完整的时序数据进行建模,许多业务也需要数据保持完整性,以更好地进行可视化与分析。然而在真实场景中,由于采集能力或网络传输的原因,时序数据常常会有缺...

    在前几次分享中我们知道,很多时序算法都依赖完整的时序数据进行建模,许多业务也需要数据保持完整性,以更好地进行可视化与分析。然而在真实场景中,由于采集能力或网络传输的原因,时序数据常常会有缺失、断点的情况。如何处理这些有缺失的时间序列呢?

    图 | 两种不同类型的时序数据缺失

    有关时间序列的补缺工作大体上分为:删除填充这两类。删除所考虑的不是进行填补,而是将缺失值作为特征之一输入到时序模型,例如异常检测,行为分析等;而填充是找到时序变化的规律,将值补充进去,分为统计方式填充机器学习填充两种方式。

    本文就上面时序补缺的两大类方向整理相关工作,供大家阅读。

    01

    缺失数据删除

    最直接的缺失数据处理的方式,就是直接忽略这些缺失值,简称为直接删除法,该方法常用在离散型的时间序列处理中,比如用户购物行为序列,事件序列等,这类序列数据没有固定的采集间隔,一般会把数据点之间的间隔时间作为特征进行分析。

    图 | 融入时间间隔信息的LSTM: TLSTM[1] (KDD 2017)

    比如上图所展示了TLSTM模型,来自KDD 2017年的工作,其将数据之间的间隔作为特征进行输入。TLSTM中专门设计了一种新的门结构对这种间隔信息进行加权聚合。

    当然,该类方法可能会舍弃数据中的一些重要信息,在监控/IoT/风控等这种稳定性要求高的业务中,不能适用,因为每个数据点所代表的信息都很重要。

    02

    缺失数据填补

    将缺失的数据删除一般只适用于少部分对数据完整度要求不高的场景,大部分场景(例如监控、安全等)需要我们尽可能将缺失的数据填充。数据填充需要我们找到时间序列一定的变化规律,从而将值补充进去。这里与时间序列的预测有一点相似,不同的是,时间序列预测中我们看不到所要预测点后面的数据,而时序补缺中,我们可以分析缺失点前后的数据,从而更精准的对缺失数据进行填充。

    数据填充基本分为统计方式填充机器学习填充两种方式。

    统计方式填充

    a

    基于统计学的填充方法是时间序列补缺中常用的方法,其计算复杂度低,易操作,在许多精度要求不高的业务场景中比较适用。

    就近填充

    就近填充包括:前推法LOCF,用缺失之前的最后一次观测值填补;与后推法NOCB, 使用缺失值后面的观测值进行填补。这个方法是时序当中最基本的方法。

    特征值填充

    特征值填充包括:均值、中值、常用值等。这类方法计算快,进行简单的统计即可实现数据的填补。其一般直接忽略数据的时序信息假定时序数据里面基本没有很强趋势性。

    线性插值

    这个方法历史悠久。其假定时序之间变动有很强的趋势,通过拟合数据的趋势变化,进而进行填补。早期天文学缺失数据都用这个方法。线性插补的方法包括一元线性回归,多元线性回归,岭回归等,有关方法可以参考之前的文章:《TS技术课堂 | 时间序列回归》

    季节性+线性插值

    经济数据或者季节波动数据,常常不符合简单的线性变化强假设。对这样的数据进行补缺,一般的线性插值法效果比较差。这里需要模型同时捕捉时序数据的季节性和总体趋势性,进而对数据的演变模式更好的拟合,实现缺失值数据的补充。

    除了这些统计方法, 一般来说每个领域里面缺失值的填补还要借鉴专业知识来判断。比如以国家军费缺失数据为例,如果你知道因为战乱带来的缺失。那么战时数据比和平年代数据就更合适,很简单就近填补。

    机器学习填充

    b

    随着计算能力的大幅提升,现今许多的场景下的时间序列补缺都采用了机器学习的方式,常见的方法包括基于最近邻方法(KNN),循环神经网络(RNN),随机森林和矩阵分解的缺失值填充算法。

    有监督数据填充

    这类的方法的本质是以缺失点附近的数据作为特征,预测缺失点的数据,通过海量的历史数据中挖掘相似的变化模型,从而进行更精准的数据填充。包括:

    • KNN:找到缺失点附近数据最相似的若干个历史数据点,对缺失值进行填补

    • RNN:通过循环神经网络拟合时序数据的变化趋势,对缺失数据进行填补。这里一般多使用双向RNN

    • 随机森林:这里以缺失点附近的数据作为特征,缺失数据作为要预测的值,在海量数据中训练一个高拟合随机树,对缺失点进行预测。

    • 时序生成:近些年随着生成对抗网络(GAN)的兴起,许多方法开始尝试做时间序列的生成,通过生成模型捕捉时间序列的分布特征,对时序数据进行再生成,进而填补数据。

    多值插补

    多值插补是近些年兴起的时序数据补缺方法,其主要应用于包括时空数据在内的多维时间序列问题。其补全数据不仅只关注自身的时序演变,同时关注相邻时序,特别是有影响关系的时序指标之间的影响。例如在交通中,某一路段的交通量与其上游、下游路段的交通量直接相关。这类方法依赖于缺失数据不同属性间关系,寻找最类似样本,对于突发情况下的数据丢失,异常数据点(离群点)的补全有更好的适应性。

    • 矩阵分解:不同的时间序列之间往往相互关联,通过矩阵分解等方法学习时序矩阵的整体特征,对时间特性矩阵进行低秩逼近,从而修补缺失数据。该类方法计算复杂度低 , 可以处理较大规模的数据。

    图 | 时序正则化矩阵分解: TRMF[2](NeurIPS 2016)

    • 组合分析:不同学科的数据补缺可能都有默认或者建议的方法,比如社会学或者人口学对于无应答的问卷数据,就是假定用类似用户数据进行填补。很多的场景下的数据填补需要给出填补数据的合理性。面对这样的情况,矩阵分解这类方法难以给出直观的解释。因此,近年来一些方法考虑分析多源时序数据实体之间的外在属性,构建可解释的关联关系,组合多源时序及其关系进行数据的填补。

    图 | 基于社群关系的电力系统时间序列补缺[3](WWW 2019)

    上图所示的WWW 2019的工作,其基于用户的邻里关系,关联不同用户的用电数据,对缺失的数据进行填补。

    03

    开源工具

    开源社区有许多优秀的项目可以帮助我们对缺失数据进行补全。这里简单为大家列举若干热门的项目:

    • https://sklearn.org/modules/generated/sklearn.preprocessing.Imputer.html

    Sklearn实现了多种基于统计方法的缺失数据补全算法

    • https://github.com/amices/mice

    该仓库实现了基于链式方程法的多维时序补缺算法

    • https://github.com/stekhoven/missForest

    该仓库实现了基于随机森林的一种非参数混合类型补缺算法

    • https://github.com/cran/softImpute

    该仓库实现了通过迭代软阈值SVD的完成矩阵进行补缺的算法

    • https://github.com/zjunet/STI

    该仓库实现了基于社群关系进行多源时间序列补缺的算法

    • https://github.com/xinychen/transdim

    该仓库实现了当前主流的基于矩阵分解的时间序列缺失值填充算法和预测算法

    • ...

    04

    总结

    时间序列数据的补缺有很多不同的方法。在进行补缺之前,第一步需要我们对缺失的性质做出判断:如果是Missing at Random还是Missing Not at Random,一般前者删除,后者填充。但是填充不一定能带来更好结果,要先自己根据缺失比例和原因进行判断。

    再者,如果你对数据生成机制很熟悉的情况下,可能一些简单方法就可以实现很好的数据补缺。对于本身纯粹依赖算法,不能给出解释机制的时间序列补缺是不能完全信服的,因为缺失本身表明这些样本信息不足。这里常常需要增加专业知识的判断,因为专业知识判断就相当于额外增补信息。

    参考

    [1] Inci M. Baytas, Cao Xiao, Xi Zhang, Fei Wang, Anil K. Jain, and Jiayu Zhou. Patient Subtyping via Time-Aware LSTM Networks. KDD 2017.

    [2] Yu, H. F., Rao, N., & Dhillon, I. S.Temporal regularized matrix factorization for high-dimensional time series prediction. NeurIPS 2016.

    [3] Zongtao, L; Yang, Y; Wei, H; Zhongyi, T; Ning, L and Fei, W. How Do Your Neighbors Disclose Your Information: Social-Aware Time Series Imputation. WWW 2019

    END

    公众号:AI蜗牛车

    保持谦逊、保持自律、保持进步

    个人微信

    备注:昵称+学校/公司+方向

    如果没有备注不拉群!

    拉你进AI蜗牛车交流群

    展开全文
  • 时间序列是按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周月等。比如,每天某产品的用户数量,每个月的销售额,这些数据形成了以一定时间间隔的数据。 通过对这些时间序列的...

    时间序列系列文章:

    时间序列(一):时间序列数据与时间序列预测模型
    时间序列(二):时间序列平稳性检测
    时间序列(三):ARIMA模型实战

    时间序列及其预测是日常工作中建模,分析,预测的重要组成部分。本系列我们将从0开始介绍时间序列的含义,模型及其分析。本篇为第一部分,我们主要介绍时间序列,与其常用的预测模型。

    时间序列定义:

    时间序列是按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周月等。比如,每天某产品的用户数量,每个月的销售额,这些数据形成了以一定时间间隔的数据。

    通过对这些时间序列的分析,从中发现和揭示现象发展变化的规律,并将这些知识和信息用于预测。比如销售量是上升还是下降,销售量是否与季节有关,是否可以通过现有的数据预测未来一年的销售额是多少等。

    对于时间序列的预测,由于很难确定它与其他变量之间的关系,这时我们就不能用回归去预测,而应使用时间序列方法进行预测。

    采用时间序列分析进行预测时需要一系列的模型,这种模型称为时间序列模型。

    时间序列预测模型与方法

    注:本部分只关注相关模型与分析的方法,模型的选择,调参与优化会放在后续文章中详细讲解

    原始数据

    本文所使用原始数据与代码,可以在公众号:Smilecoc的杂货铺 中回复“时间序列”获取。可直接扫描文末二维码关注!

    朴素法

    朴素法就是预测值等于实际观察到的最后一个值。它假设数据是平稳且没有趋势性与季节性的。通俗来说就是以后的预测值都等于最后的值。

    这种方法很明显适用情况极少,所以我们重点通过这个方法来熟悉一下数据可视化与模型的评价及其相关代码。

    #朴素法
    dd = np.asarray(train['Count'])#训练组数据
    y_hat = test.copy()#测试组数据
    y_hat['naive'] = dd[len(dd) - 1]#预测组数据
    
    #数据可视化
    plt.figure(figsize=(12, 8))
    plt.plot(train.index, train['Count'], label='Train')
    plt.plot(test.index, test['Count'], label='Test')
    plt.plot(y_hat.index, y_hat['naive'], label='Naive Forecast')
    plt.legend(loc='best')
    plt.title("Naive Forecast")
    plt.show()
    

    得到结果:
    在这里插入图片描述
    我们通过计算均方根误差,检查模型在测试数据集上的准确率。
    其中均方根误差(RMSE)是各数据偏离真实值的距离平方和的平均数的开方

    #计算均方根误差RMSE
    from sklearn.metrics import mean_squared_error
    from math import sqrt
    
    # mean_squared_error求均方误差
    rmse = sqrt(mean_squared_error(test['Count'], y_hat['naive']))
    print(rmse)
    

    得到均方根误差为1053

    简单平均法

    简单平均法就是预测的值为之前过去所有值的平均.当然这不会很准确,但这种预测方法在某些情况下效果是最好的。

    #简单平均法
    y_hat_avg = test.copy()
    y_hat_avg['avg_forecast'] = train['Count'].mean()
    

    其后续可视化与模型效果评估方法与上述一致,这里不再赘述,需要详细代码可以查看相关源码。得到RMSE值为2637

    移动平均法

    我们经常会遇到这种数据集,比如价格或销售额某段时间大幅上升或下降。如果我们这时用之前的简单平均法,就得使用所有先前数据的平均值,但在这里使用之前的所有数据是说不通的,因为用开始阶段的价格值会大幅影响接下来日期的预测值。因此,我们只取最近几个时期的价格平均值。很明显这里的逻辑是只有最近的值最要紧。这种用某些窗口期计算平均值的预测方法就叫移动平均法。

    #移动平均法
    y_hat_avg = test.copy()
    #利用时间窗函数rolling求平均值u
    y_hat_avg['moving_avg_forecast'] = train['Count'].rolling(60).mean().iloc[-1]
    

    其后续可视化与模型效果评估方法与上述一致,这里不再赘述,需要详细代码可以查看相关源码。得到RMSE值为1121

    指数平滑法

    在做时序预测时,一个显然的思路是:认为离着预测点越近的点,作用越大。比如我这个月体重100斤,去年某个月120斤,显然对于预测下个月体重而言,这个月的数据影响力更大些。假设随着时间变化权重以指数方式下降——最近为0.8,然后0.8**2,0.8**3…,最终年代久远的数据权重将接近于0。将权重按照指数级进行衰减,这就是指数平滑法的基本思想。

    指数平滑法有几种不同形式:一次指数平滑法针对没有趋势和季节性的序列,二次指数平滑法针对有趋势但没有季节性的序列,三次指数平滑法针对有趋势也有季节性的序列。“

    所有的指数平滑法都要更新上一时间步长的计算结果,并使用当前时间步长的数据中包含的新信息。它们通过”混合“新信息和旧信息来实现,而相关的新旧信息的权重由一个可调整的参数来控制。

    一次指数平滑

    一次指数平滑法的递推关系如下:

    s i = α x i + ( 1 − α ) s i − 1 , 其 中 0 ≤ α ≤ 1 s_{i}=\alpha x_{i}+(1-\alpha)s_{i-1},其中 0 \leq \alpha \leq 1 si=αxi+(1α)si10α1

    其中, s i s_{i} si是时间步长i(理解为第i个时间点)上经过平滑后的值, x i x_{i} xi 是这个时间步长上的实际数据。 α \alpha α可以是0和1之间的任意值,它控制着新旧信息之间的平衡:当 α \alpha α 接近1,就只保留当前数据点;当 α \alpha α 接近0时,就只保留前面的平滑值(整个曲线都是平的)。我们展开它的递推关系式:

    我们展开它的递推关系式:
    s i = α x i + ( 1 − α ) s i − 1 = α x i + ( 1 − α ) [ α x i − 1 + ( 1 − α ) s i − 2 ] = α x i + ( 1 − α ) [ α x i − 1 + ( 1 − α ) [ α x i − 2 + ( 1 − α ) s i − 3 ] ] = α [ x i + ( 1 − α ) x i − 1 + ( 1 − α ) 2 x i − 2 + ( 1 − α ) 3 s i − 3 ] = . . . = α ∑ j = 0 i ( 1 − α ) j x i − j \begin{aligned} s_{i}&=\alpha x_{i}+(1-\alpha)s_{i-1} \\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)s_{i-2}]\\ &=\alpha x_{i}+(1-\alpha)[\alpha x_{i-1}+(1-\alpha)[\alpha x_{i-2}+(1-\alpha)s_{i-3}]]\\ &=\alpha[x_{i}+(1-\alpha)x_{i-1}+(1-\alpha)^{2}x_{i-2}+(1-\alpha)^{3}s_{i-3}]\\ &=... \\ &=\alpha\sum_{j=0}^{i}(1-\alpha)^{j}x_{i-j} \end{aligned} si=αxi+(1α)si1=αxi+(1α)[αxi1+(1α)si2]=αxi+(1α)[αxi1+(1α)[αxi2+(1α)si3]]=α[xi+(1α)xi1+(1α)2xi2+(1α)3si3]=...=αj=0i(1α)jxij

    可以看出,在指数平滑法中,所有先前的观测值都对当前的平滑值产生了影响,但它们所起的作用随着参数 α \alpha α 的幂的增大而逐渐减小。那些相对较早的观测值所起的作用相对较小。同时,称α为记忆衰减因子可能更合适——因为α的值越大,模型对历史数据“遗忘”的就越快。从某种程度来说,指数平滑法就像是拥有无限记忆(平滑窗口足够大)且权值呈指数级递减的移动平均法。一次指数平滑所得的计算结果可以在数据集及范围之外进行扩展,因此也就可以用来进行预测。预测方式为:

    x i + h = s i x_{i+h}=s_{i} xi+h=si

    s i s_{i} si是最后一个已经算出来的值。h等于1代表预测的下一个值。

    我们可以通过statsmodels中的时间序列模型进行指数平滑建模。官方文档地址为:
    https://www.statsmodels.org/stable/generated/statsmodels.tsa.holtwinters.SimpleExpSmoothing.html
    具体代码如下:

    #一次指数平滑
    from statsmodels.tsa.api import SimpleExpSmoothing
     
    y_hat_avg = test.copy()
    fit = SimpleExpSmoothing(np.asarray(train['Count'])).fit(smoothing_level=0.6, optimized=False)
    y_hat_avg['SES'] = fit.forecast(len(test))
    

    之后同样进行数据可视化并查看模型效果

    plt.figure(figsize=(16, 8))
    plt.plot(train['Count'], label='Train')
    plt.plot(test['Count'], label='Test')
    plt.plot(y_hat_avg['SES'], label='SES')
    plt.legend(loc='best')
    plt.show()
    

    可视化结果为:
    在这里插入图片描述
    RMSE结果为1040

    二次指数平滑

    在介绍二次指数平滑前介绍一下趋势的概念。

    趋势,或者说斜率的定义很简单: b = Δ y / Δ x b=Δy/Δx b=Δy/Δx,其中 Δ x Δx Δx为两点在x坐标轴的变化值,所以对于一个序列而言,相邻两个点的 Δ x = 1 Δx=1 Δx=1,因此 b = Δ y = y ( x ) − y ( x − 1 ) b=Δy=y(x)-y(x-1) b=Δy=y(x)y(x1)。 除了用点的增长量表示,也可以用二者的比值表示趋势。比如可以说一个物品比另一个贵20块钱,等价地也可以说贵了5%,前者称为可加的(addtive),后者称为可乘的(multiplicative)。在实际应用中,可乘的模型预测稳定性更佳,但是为了便于理解,我们在这以可加的模型为例进行推导。
    指数平滑考虑的是数据的baseline,二次指数平滑在此基础上将趋势作为一个额外考量,保留了趋势的详细信息。即我们保留并更新两个量的状态:平滑后的信号和平滑后的趋势。公式如下:
    基准等式
    s i = α x i + ( 1 − α ) ( s i − 1 + t i − 1 ) s_{i}=\alpha x_{i}+(1-\alpha)(s_{i-1}+t_{i-1}) si=αxi+(1α)(si1+ti1)
    趋势等式
    t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 t_{i}=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1} ti=β(sisi1)+(1β)ti1

    第二个等式描述了平滑后的趋势。当前趋势的未平滑“值”( t i t_{i} ti )是当前平滑值( s i s_{i} si )和上一个平滑值( s i − 1 s_{i-1} si1)的差;也就是说,当前趋势告诉我们在上一个时间步长里平滑信号改变了多少。要想使趋势平滑,我们用一次指数平滑法对趋势进行处理,并使用参数 β \beta β (理解:对 t i t_{i} ti 的处理类似于一次平滑指数法中的 s i s_{i} si ,即对趋势也需要做一个平滑,临近的趋势权重大)。

    为获得平滑信号,我们像上次那样进行一次混合,但要同时考虑到上一个平滑信号及趋势。假设单个步长时间内保持着上一个趋势,那么第一个等式的最后那项就可以对当前平滑信号进行估计。

    若要利用该计算结果进行预测,就取最后那个平滑值,然后每增加一个时间步长就在该平滑值上增加一次最后那个平滑趋势:

    x i + h = s i + h t i x_{i+h}=s_{i}+ht_{i} xi+h=si+hti

    在这里插入图片描述
    之后使用二次指数平滑进行预测:

    from statsmodels.tsa.api import Holt
     
    y_hat_avg = test.copy()
     
    fit = Holt(np.asarray(train['Count'])).fit(smoothing_level=0.3, smoothing_slope=0.1)
    y_hat_avg['Holt_linear'] = fit.forecast(len(test))
    

    结果如图:
    在这里插入图片描述
    得到对应的RMSE为1033

    三次指数平滑

    在应用这种算法前,我们先介绍一个新术语。假如有家酒店坐落在半山腰上,夏季的时候生意很好,顾客很多,但每年其余时间顾客很少。因此,每年夏季的收入会远高于其它季节,而且每年都是这样,那么这种重复现象叫做“季节性”(Seasonality)。如果数据集在一定时间段内的固定区间内呈现相似的模式,那么该数据集就具有季节性。
    在这里插入图片描述
    二次指数平滑考虑了序列的基数和趋势,三次就是在此基础上增加了一个季节分量。类似于趋势分量,对季节分量也要做指数平滑。比如预测下一个季节第3个点的季节分量时,需要指数平滑地考虑当前季节第3个点的季节分量、上个季节第3个点的季节分量…等等。详细的有下述公式(累加法):

    s i = α ( x i − p i − k ) + ( 1 − α ) ( s i − 1 + t i − 1 ) t i = β ( s i − s i − 1 ) + ( 1 − β ) t i − 1 p i = γ ( x i − s i ) + ( 1 − γ ) p i − k \begin{aligned} s_{i}&=\alpha (x_{i}-p_{i-k})+(1-\alpha)(s_{i-1}+t_{i-1}) \\ t_{i} &=\beta (s_{i}-s_{i-1})+(1-\beta)t_{i-1}\\ p_{i}&=\gamma (x_{i}-s_{i})+(1-\gamma)p_{i-k} \end{aligned} sitipi=α(xipik)+(1α)(si1+ti1)=β(sisi1)+(1β)ti1=γ(xisi)+(1γ)pik

    其中, p i p_{i} pi 是指“周期性”部分。预测公式如下:

    x i + h = s i + h t i + p i − k + h x_{i+h}=s_{i}+ht_{i}+p_{i-k+h} xi+h=si+hti+pik+h

    k 是这个周期的长度。

    在使用二次平滑模型与三次平滑模型前,我们可以使用sm.tsa.seasonal_decompose分解时间序列,可以得到以下分解图形——从上到下依次是原始数据、趋势数据、周期性数据、随机变量(残差值)

    在这里插入图片描述
    根据分析图形和数据可以确定对应的季节参数

    具体代码为:

    #三次指数平滑
    from statsmodels.tsa.api import ExponentialSmoothing
     
    y_hat_avg = test.copy()
    fit1 = ExponentialSmoothing(np.asarray(train['Count']), seasonal_periods=7, trend='add', seasonal='add', ).fit()
    y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
    

    在这里插入图片描述
    得到的RMSE为575。我们可以看到趋势和季节性的预测准确度都很高。你可以试着调整参数来优化这个模型。

    AR模型

    AR(Auto Regressive Model)自回归模型是线性时间序列分析模型中最简单的模型。通过自身前面部分的数据与后面部分的数据之间的相关关系(自相关)来建立回归方程,从而可以进行预测或者分析。服从p阶的自回归方程表达式如下:

    x t = ϕ 1 x t − 1 + ϕ 2 x t − 2 + ⋯ + ϕ p x t − p + μ t x_{t}=\phi_{1}x_{t-1}+\phi_{2}x_{t-2}+\cdots+\phi_{p}x_{t-p}+\mu_{t} xt=ϕ1xt1+ϕ2xt2++ϕpxtp+μt

    表示为 A R ( p ) AR(p) AR(p),。其中, μ t \mu_{t} μt表示白噪声,是时间序列中的数值的随机波动,但是这些波动会相互抵消,最终是0。 ϕ \phi ϕ表示自回归系数。

    所以当只有一个时间记录点时,称为一阶自回归过程,即AR(1)。其表达式为:
    x t = ϕ 1 x t − 1 + μ t x_{t}=\phi_{1}x_{t-1}+\mu_{t} xt=ϕ1xt1+μt

    利用Python建立AR模型一般会用到我们之后会说到的ARIMA模型(AR模型中的p是ARIMA模型中的参数之一,只要将其他的参数设置为0即为AR模型)。您可以先阅读后续ARIMA模型的内容并参考文件中的代码查看具体的内容

    MA模型

    MA(Moving Average Model)移动平均模型通过将一段时间序列中白噪声(误差)进行加权和,可以得到移动平均方程。如下模型为q阶移动平均过程,表示为MA(q)。

    x t = μ + μ t + θ 1 μ t − 1 + θ 2 μ t − 2 + ⋯ + θ q μ t − q x_{t}=\mu+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q} xt=μ+μt+θ1μt1+θ2μt2++θqμtq

    其中 x t x_{t} xt表示t期的值,当期的值由前q期的误差值来决定, μ μ μ值是常数项,相当于普通回归中的截距项, μ t \mu_{t} μt是当期的随机误差。MA模型的核心思想是每一期的随机误差都会影响当期值,把前q期的所有误差加起来就是对t期值的影响。

    同样,利用Python建立MA模型一般会用到我们之后会说到的ARIMA模型,您可以先阅读后续ARIMA模型的内容并参考文件中的代码查看具体的内容

    ARMA模型

    ARMA(Auto Regressive and Moving Average Model)自回归移动平均模型是与自回归和移动平均模型两部分组成。所以可以表示为ARMA(p, q)。p是自回归阶数,q是移动平均阶数。

    x t = ϕ 1 x t − 1 + ϕ 2 x t − 2 + ⋯ + ϕ p x t − p + μ t + θ 1 μ t − 1 + θ 2 μ t − 2 + ⋯ + θ q μ t − q x_{t}=\phi_{1}x_{t-1}+\phi_{2}x_{t-2}+\cdots+\phi_{p}x_{t-p}+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q} xt=ϕ1xt1+ϕ2xt2++ϕpxtp+μt+θ1μt1+θ2μt2++θqμtq

    从式子中就可以看出,自回归模型结合了两个模型的特点,其中,AR可以解决当前数据与后期数据之间的关系,MA则可以解决随机变动也就是噪声的问题。

    ARIMA模型

    ARIMA(Auto Regressive Integrate Moving Average Model)差分自回归移动平均模型是在ARMA模型的基础上进行改造的,ARMA模型是针对t期值进行建模的,而ARIMA是针对t期与t-d期之间差值进行建模,我们把这种不同期之间做差称为差分,这里的d是几就是几阶差分。ARIMA模型也是基于平稳的时间序列的或者差分化后是稳定的,另外前面的几种模型都可以看作ARIMA的某种特殊形式。表示为ARIMA(p, d, q)。p为自回归阶数,q为移动平均阶数,d为时间成为平稳时所做的差分次数,也就是Integrate单词的在这里的意思。

    具体步骤如下:

    x t = ϕ 1 w t − 1 + ϕ 2 w t − 2 + ⋯ + ϕ p w t − p + μ t + θ 1 μ t − 1 + θ 2 μ t − 2 + ⋯ + θ q μ t − q x_{t}=\phi_{1}w_{t-1}+\phi_{2}w_{t-2}+\cdots+\phi_{p}w_{t-p}+\mu_{t}+\theta_{1}\mu_{t-1}+\theta_{2}\mu_{t-2}+\cdots+\theta_{q}\mu_{t-q} xt=ϕ1wt1+ϕ2wt2++ϕpwtp+μt+θ1μt1+θ2μt2++θqμtq

    上面公式中的 w t w_{t} wt表示t期经过d阶差分以后的结果。我们可以看到ARIMA模型的形式基本与ARMA的形式是一致的,只不过把 X X X换成了 w w w

    使用ARIMA进行预测代码如下:

    from statsmodels.tsa.arima_model import ARIMA
     
    ts_ARIMA= train['Count'].astype(float)
    fit1 = ARIMA(ts_ARIMA, order=(7, 1, 4)).fit()
    y_hat_ARIMA = fit1.predict(start="2013-11-1", end="2013-12-31", dynamic=True)
    

    并画出预测值与实际值图形:

    plt.figure(figsize=(16, 8))
    plt.plot(train['Count'], label='Train')
    plt.plot(test['Count'], label='Test')
    plt.plot(y_hat_ARIMA, label='ARIMA')
    plt.legend(loc='best')
    plt.show()
    

    在这里插入图片描述
    并计算RMSE:

    from sklearn.metrics import mean_squared_error
    from math import sqrt
      
    rmse = sqrt(mean_squared_error(test['Count'],y_hat_ARIMA.to_frame()))
    print(rmse)
    

    得到对应的RMSE为3723

    SARIMA模型

    SARIMA季节性自回归移动平均模型模型在ARIMA模型的基础上添加了季节性的影响,结构参数有七个:SARIMA(p,d,q)(P,D,Q,s)
    其中p,d,q分别为之前ARIMA模型中我们所说的p:趋势的自回归阶数。d:趋势差分阶数。q:趋势的移动平均阶数。
    P:季节性自回归阶数。
    D:季节性差分阶数。
    Q:季节性移动平均阶数。
    s:单个季节性周期的时间步长数。

    import statsmodels.api as sm
    y_hat_avg = test.copy()
    fit1 = sm.tsa.statespace.SARIMAX(train.Count, order=(2, 1, 4), seasonal_order=(0, 1, 1, 7)).fit()
    y_hat_avg['SARIMA'] = fit1.predict(start="2013-11-1", end="2013-12-31", dynamic=True)
    

    得到实际值与预测值如下:

    plt.figure(figsize=(16, 8))
    plt.plot(train['Count'], label='Train')
    plt.plot(test['Count'], label='Test')
    plt.plot(y_hat_avg['SARIMA'], label='SARIMA')
    plt.legend(loc='best')
    plt.show()
    

    在这里插入图片描述
    并计算RMSE:

    from sklearn.metrics import mean_squared_error
    from math import sqrt
    rmse = sqrt(mean_squared_error(test['Count'], y_hat_avg['SARIMA']))
    print(rmse)
    

    结果为933

    其他时间序列预测的模型还有SARIMAX模型(在ARIMA模型上加了季节性的因素),Prophet模型,ARCH模型,LSTM神经网络模型等。限于篇幅,感兴趣的同学可以自行查看相关模型资料

    在后续的文章中我们将讲解如何确定数据的平稳性与数据预处理,为后续时间序列的建模做准备

    参考文章:
    https://www.analyticsvidhya.com/blog/2018/02/time-series-forecasting-methods/
    https://blog.csdn.net/anshuai_aw1/article/details/82499095

    相关代码与数据可关注公众号并回复:时间序列获取
    在这里插入图片描述

    展开全文
  • 面板数据(PanelData)是将截面数据和时间序列数据综合起来的一种数据类型,该数据具有横截面和时间序列两个维度,当这类数据按两个维度进行排列时,数据都排在一个平面上,与排在一条线上的一维数据有着明显的不同,...

    面板数据(Panel

    Data)是将截面数据和时间序列数据综合起来的一种数据类型,该数据具有横截面和时间序列两个维度,当这类数据按两个维度进行排列时,数据都排在一个平面上,与排在一条线上的一维数据有着明显的不同,整个表格像是一个面板,所以称为面板数据(Panel

    Data)。但是,实际上如果从数据结构内在含义上,应该把Panel

    Data称为“时间序列-截面数据”,这样更能体现数据本质上的特点。该数据为也被称为“纵向数据(Longitudinal

    Data)”,“平行数据”,“TS-CS数据(Time Series-Cross

    Section)”。它是截面上个体在不同时间点的重复测量数据。面板数据从横截面(cross

    section)看,是由若干个体(entity,unit,individual)在某一时点构成的截面观测值,从纵剖面(longitudinal

    section)看每个个体都是一个时间序列。

    从时空维度来看,可以将计量经济学中应用的数据分为三类:1是横截面数据;2是时间序列数据;3是面板数据或者纵向数据。

    1、横截面数据(Cross-sectional data)

    横截面数据是指在某一时点收集的不同对象的数据。它对应同一时点上不同空间(对象)所组成的一维数据集合,研究的是某一时点上的某种经济现象,突出空间(对象)的差异。横截面数据的突出特点就是离散性高。横截面数据体现的是个体的个性,突出个体的差异,通常横截面数据表现的是无规律的而非真正的随机变化。即计量经济学中所谓的“无法观测的异质性”。在分析横截面数据时,应主要注意两个问题:一是异方差问题,由于数据是在某一时期对个体或地域的样本的采集,不同个体或地域本身就存在差异;二是数据的一致性,主要包括变量的样本容量是否一致、样本的取样时期是否一致、数据的统计标准是否一致。

    2、时间序列数据(Time-series

    data)

    时间序列数据是指对同一对象在不同时间连续观察所取得的数据。它着眼于研究对象在时间顺序上的变化,寻找空间(对象)历时发展的规律。利用时间序列作样本时,要注意几个问题:一是所选择的样本区间内经济行为的一致性问题;二是样本数据在不同样本点之间不可比,需要对原始数据进行调整,消除其不可比因素;三是样本观测值过于集中,因而时间序列数据不适宜于对模型中反映长期变化关系的结构参数的估计;四是模型随机误差的序列相关问题。

    3、纵向数据(Longitudinal

    data)或面板数据(Panel data)

    面板数据,即Panel Data,是截面数据与时间序列综合起来的一种数据资源。

    在分析时,多用PanelData模型,故也被称为面板数据模型.

    它可以用于分析各样本在时间序列上组成的数据的特征,它能够综合利用样本信息,通过模型中的参数,既可以分析个体之间的差异情况,又可以描述个体的动态变化特征。

    展开全文
  • 使用 TimeGAN 建模和生成时间序列数据

    千次阅读 热门讨论 2021-09-09 09:20:12
    在本文中,我们将研究时间序列数据并探索一种生成合成时间序列数据的方法。 时间序列数据 — 简要概述 时间序列数据与常规表格数据有什么不同呢? 时间序列数据集有一个额外的维度——时间。 我们可以将其视为 3D ...
  • 前言数据是驱动科技发展的源泉,平时我们科研中也经常需要在各种开源数据上验证自己模型的效果。那时间序列目前可以使用的开源数据集有哪些呢?本期为大家做一次较为全面的整理汇总。UCR Time ...
  • 开源时间序列数据

    千次阅读 2021-01-21 09:22:19
    数据是驱动科技发展的源泉,我们平常科研中也常常需要在各种开源数据上验证自己模型的效果。时间序列目前可以使用的开源数据集有哪些呢?本期为大家做一次梳理。
  • 多元时间序列数据的预测和建模标签:#机器学习##预测#时间:2018/09/28 15:44:19作者:小木#### 简介时间是决定企业是上升还是下降的最关键因素。 这就是为什么我们看到商店和电子商务平台的销售与节日保持一致。 ...
  • 通过FEDOT将AutoML用于时间序列数据

    千次阅读 2021-07-03 09:03:44
    大多数现代开源AutoML框架并没有广泛地涵盖时间序列预测任务。本文中我们将深入地研究AutoML框架之一FEDOT,它可以自动化时间序列预测的机器学习管道设计。因此,我们将通过时间序列预测的现实世界任务详细解释FEDOT...
  • data = pd.read_excel(r'你的数据位置',index_col=0)#读取数据 data data1 = data.values[:,:]#截取所需要的数据 data1.shape import numpy as np X = []#开一个空的东西用来存数据 for i in range(0,n,m):#n是你所...
  • 1. 什么是时间序列? 1.1 Timestamp类型(时间戳) 1.2 DatetimeIndex与PeriodIndex 2. 创建固定频率的时间...4. 提取时间序列数据信息 4.1 加减时间数据--Timedelta类 【练习】绘制出5个城市的PM2.5随时间的变化情况。
  • CNN对时间序列数据进行分类【Keras】

    千次阅读 2021-12-01 08:51:49
    项目结构如上所示 tsv_cnnfile.py为训练的代码 inference.py为模型推理的代码 注意调用训练代码时候可以通过 ...数据集:37类,训练集390行,测试集391行,每行的数据长度有176。 # Adiac...
  • 网络化传感器和执行器在许多现实系统中的普及,例如智能系统建筑物、工厂、发电厂和数据中心为这些系统生成大量的多元时间序列数据。许多这样的网络物理系统(cps)是为关键任务而设计的,因此是网络攻击的目标。...
  • 与温度不同,温度通常在四季中表现出明显的趋势,而雨量作为一个时间序列可能是相当不稳定的。夏季的降雨量与冬季的降雨量一样多是很常见的。本数据为某地区1959年11月到2019年12月的降雨量数据(查看文末了解数据...
  • 用于时间序列数据的泊松回归模型

    千次阅读 2021-04-28 09:15:15
    如果数据集是计数的时间序列,则会产生额外的建模复杂性,因为时间序列数据通常是自相关的。以前的计数会影响将来计数的值。如果回归模型不能充分捕获这些相关性中包含的“信息”,“未解释的”信息将以自相关误差的...
  • 傅立叶变换是一种从完全不同的角度查看数据的强大方法:从时域到频域。 但是这个强大的运算用它的数学方程看起来很可怕。 将时域波变换为频域的公式如下: 下图很好地说明了傅立叶变换:将一个复杂的波分解成许多...
  • 只有数据平稳,才可以借数据。 只有借数据,才可以做分析。 什么是白噪声序列 白噪声序列也称为纯随机序列,它满足两个性质 1)数据是平稳的 2)t≠s的时候,方差为0,说明t和s没有线性的关系 白噪声的性质 在白...
  • 我有一个pandas用户登录数据框,如下所示:id datetime_login646 2017-03-15 15:30:25611 2017-04-14 11:38:30611 2017-05-15 08:49:01651 2017-03-15 15:30:25611 2017-03-15 15:30:25652 2017-03-08 14:03:56652 ...
  • %SAMPEN 计算时间序列data的样本熵 % data为输入数据序列 % m为初始分段,每段的数据长度 % r为阈值 % $Author: lskyp % $Date: 2010.6.20 data = data(:)'; N = length(data); % 分段计算距离 for k = N - m:-1:1...
  • 我们拿到数据的时候,时间序列数据主要分为四类,1.长期趋势。2.季节变动。3.循环变动 4.不规则数据。 给大家普及下(手动狗头): 1.长期趋势: 长期趋势是在很长时间实践按照某种特定趋势变化。简单来说,就是函数...
  • 时间序列数据的插补, 有很多不同的方法。当然第一步仍然是判断是Missing at Random 还是Missing Not at Random,一般前者删除,后者插补。但是插补不一定能带来更好结果,要先自己根据缺失比例,和原因判断。1、...
  • 多年NDVI数据时间序列数据的MK检验

    千次阅读 2021-01-18 22:47:51
    教程照片及其他详细信息请...对于非正态分布的水文气象数据,Mann-Kendall秩次相关检验具有更加突出的适用性。Mann-Kendall也经常用于气候变化影响下的降水、干旱频次趋势检测。Mann-Kendall非参数秩次检验在数据趋势检
  • 时序图、自相关图和偏相关图是判断时间序列数据是否平稳的重要依据。本文涉及的扩展库numpy、pandas、statsmodels一般可以使用pip进行在线安装,如果安装失败,可以到http...
  • ——平稳性的意义如何检验时间序列数据的平稳性?——单位根检验数据不平稳怎么办?——协整检验单整、协整(cointegration)协整检验总结——时间序列数据的一般处理流程 为什么要把时间序列变成平稳的?——平稳性...
  • K线的计算周期可将其分为日K线,周K线,月K线,年K线 很多网站提供了日线、周K线、月K线等周期数据,但是...频率转换和时间序列重采样,对象必须具有类似日期时间的索引(DatetimeIndex,PeriodIndex或TimedeltaIndex
  • 那么有没有一个比较成熟完整的模块可以很方便的进行一些时序数据建模的工作呢,答案是有的,sktime顾名思义,就是最大程度借鉴了sklearn的接口模式来开发出来的专门用于时间序列建模的工具库。 地址在这里,首页...
  •  本文主要实现对时间序列聚类算法研究和相关...时间序列数据是实值型的序列数据,具有数据量大、数据维度高以及数据是不断更新的等特点。 时间序列聚类方法的分类: 什么是聚类?聚类是一种无监督学习方法,聚类就..
  • R语言ggplot2可视化时间序列数据:ggplot2可视化在时间轴上添加按月的箱图(boxplot)
  • 针对大量出现的KPI流快速部署异常检测模型 12 Buzz: 对复杂 KPI 基于VAE对抗训练的非监督异常检测 13 MAD: 基于GANs的时间序列数据多元异常检测 相关: VAE 模型基本原理简单介绍 GAN 数学原理简单介绍以及代码实践...
  • 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤胡未灭,鬓先秋。泪空流。「数仓宝贝库」,带你学数据!导读:分析时间序列数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 789,052
精华内容 315,620
关键字:

时间序列数据