时间序列数据处理_python处理时间序列数据 - CSDN
精华内容
参与话题
  • 二、时间序列的预处理

    万次阅读 2018-09-14 10:05:16
    一般情况下,拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。 一、平稳...

    一般情况下,拿到一个观察值序列之后,首先要对它的平稳性纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。

    一、平稳性检验

    1、特征统计量

    (1)概率分布

              数理统计的基础知识告诉我们分布函数或者密度函数能够完整地描述一个随机变量的统计特征。同样,一个堆积变量族{Xt} 的统计特征也完全由它们的联合分布函数或联合密度函数决定。

               当由于在实际应用中,要想得到序列的联合概率分布几乎是不可能的,而且联合概率分布通常涉及非常复杂的数学运算,这些原因导致我们很少直接使用联合概率分布进行时间序列分析。

    (2)特征统计量

             一个更简单的、更实用的描述时间序列统计特征的方法是研究该序列的低阶矩,特别是均值、方差、自协方差和自相关系数,它们也被称之为特征统计量。  

            尽管这些特征统计量不能描述随机序列全部的统计性质,但由于它们概率意义明显,易于计算,而且往往能代表随机序列的主要概率特征,所以我们对时间序列进行分析,主要就是通过分析这些特征量的统计特性,推断出随机序列的性质。 
    1.均值 
    2.方差 
    3.自协方差函数(autocovariance function)和自相关系数(autocorrelation coefficients)

    (3)自协方差函数与协方差函数的区别

            通常的协方差函数和自相关系数度量的是两个不同事件彼此之间的相互影响程度,而协方差函数和自相关系数度量的是同一事件在两个不同时期之间的相关程度,形象地讲就是度量自己过去的行为对自己现在的影响。

    2.平稳时间序列的定义 

       根据限制条件的严格程度,分为严平稳时间序列和宽平稳时间序列 

    (1)严平稳(strictly stationary)

             一种条件比较苛刻的平稳性定义,它认为只有当序列所有的统计性质都不会随着时间的推移而发生变化时,该序列才被认为平稳。随机变量族的统计性质由它们的联合概率分布族决定 。
            在实际中,要想获得随机序列的联合分布式一件非常困难的事,所以严平稳时间序列通过只有理论意义,在实践中更多的是条件比较宽松的平稳时间序列。

    (2)宽平稳(week stationary)

          使用序列的特征统计量来定义一种平稳性。它认为序列的统计性质主要由它的低阶矩决定,所以只要保证序列低阶平稳(二阶),就能保证序列的主要性质近似稳定。 

    在实际应用中,研究中最多的是宽平稳随机序列,以后见到平稳随机序列,如果不加特殊注明,指的都是宽平稳随机序列。如果序列不满足平稳条件,就称为非平稳序列。

            要证明某个随机过程是否是宽平稳过程(广义平稳过程)就必须的满足以上定义中的三个条件:

    (1)E[X(t)]=μ(常数)

    (2)E[X(t) X(t + h)]= γ( h ) ;(自协方差函数只与时间间隔有关,与起始点无关)

    (3)E[X2(t)< +∞ 。

          严平稳比宽平稳条件严格。严平稳是对序列联合分布的要求,以保证序列所有的统计特征都相同;而宽平稳只要求序列二阶平稳,对于高于二阶的矩没有任何要求。所以通常情况下,严平稳序列也满足宽平稳条件,而宽平稳序列不能反推平稳成立。

            这个不是绝对的,两种情况都有特例:

             比如服从可惜柯西分布的严平稳序列就不是宽平稳序列,因为它不存在一、二阶矩,所以无法验证它二阶平稳。严格地讲,只有存在二阶矩的严平稳序列才能保证它一定也是宽平稳序列。

    3.平稳时间序列的统计性质

    (1)常数均值

    (2)自协方差函数和自相关系数只依赖于时间的平移长度而与时间的起始点无关

    4.平稳性的检验

          一种是根据时序图和自相关图显示的特征做出判断的图检验方法;一种是构造检验统计量进行假设检验的方法。 图检验是一种操作简便,运用广泛的平稳性判别方法,它的缺点是判别结论带有很强的主观色彩。所以最好能用统计检验的方法加以辅助判断。目前最常用的平稳性检验方法是单位根检验(unit root test)。 

    (1)时序图检验 

    根据平稳时间序列均值、方差Wie常数的性质,平稳时间序列的时序图应该是显示出该数列始终在一个常数值附近随机波动,而且波动的范围有界的特点。

     

     

    (2)自相关图检验

           自相关图就是一个平面二维坐标垂线图,一个坐标轴表示延迟时期数,另一个坐标轴表示自相关系数,通过以垂线表示自相关系数的大小。

           平稳时间序列通常具有短期相关性,该性质使用自相关系数来描述就是随着延迟期数k的增加,平稳时间序列的自相关系数ρ会很快地衰减为0;反之,非平稳序列的自相关系数ρ衰减向0的速度通常会比较慢,这就是利用自相关图进行平稳性判断的标准。

    二、纯随机性检验

         当拿到一个观察值序列之后,首先是判断它的平稳性,通过平稳性检验,序列可以分为平稳序列和非平稳序列两大类。

          对于非平稳序列,由于它不具有二阶矩平稳的性质,所以对它的统计分析要周折一些,通常要进行进一步的检验、变换或处理之后,才能确定适当的拟合模型。 
           如果序列平稳,情况就简单多了,我们有一套非常成熟的平稳序列建模方法。但是,并不是所有的平稳序列都值得建模。只有那些序列值之间具有密切的相关关系,历史数据对未来的发展有一定影响的序列,才值得我们花时间去挖掘历史数据中的有效信息,用来预测序列未来的发展。 
            如果序列值彼此之间的任何相关性,那就意味着该序列是一个没有记忆的序列,过去的行为对将来的发展没有任何的影响,这种序列我们称之为纯随机序列。从统计分析的角度而言,纯随机序列是没有任何分析价值的序列。 

    1、纯随机性检验

            纯随机性检验也称为白噪声检验,是专门用来检验序列是否为随机序列的一种方法。如果一个序列是纯随机序列,那么它的序列值之间应该是没有任何相关关系。

     

    2、假设条件

    由于序列之间的变异性是绝对的,而相关性是偶然的,所以假设条件如下确定:

    • 原假设:延迟期数小于或等于m期的序列值之间相互独立。
    • 备选假设:延迟期数小于或等于m期的序列值之间有相关性。

    3、检验统计量

    (1)Q统计量

    Box和Pierce推导出了Q统计量

    根据正态分布和卡方分布之间的关系,我们很容易推导出Q统计量近似服从自由度为m的卡方分布:

     

    当Q统计量大于卡方分布的分位点,或者统计量的P值小于a时候,可以以1-a的置信水平拒绝原假设,认为该序列为非白噪声序列,否则,接受原假设,认为序列为纯随序列。

    (2)LB统计量

    在实际应用中人们发现Q统计量在大样本长夜(n很大的场合)检验效果很好,但是在小样本场合就不太精确,为了弥补这一缺陷,Box和Ljong又推导出LB统计量

     

    Box和Ljung证明LB统计量同样近似的服从自由度为m的卡方分布。
    实际上LB统计量就是Box和Pierce的Q统计量的修正,所以人们习惯上吧他们统称为Q统计量,分别纪委QNP和QLB统计量,在各种检验场合普遍采用的Q统计量通常指的就是LB统计量。

    注意:一般情况下我们只检验前6期和前12期的Q统计量和LB统计量就可以直接判断该序列是否为白噪声序列。这是因为,

     1、平稳序列通常具有短期相关性,如果序列之间存在明显的相关关系,通常指存在于延迟时期比较短的序列值之间,所以,如果一个平稳序列的短期延迟值之间不存在显著的相关关系,通常长期之间就更不会存在显著的相关关系。

    2、假如一个平稳序列显示出短期显著的短期相关性,那么该序列就一定不是白噪声序列,我们就可以继续对该序列进行相关性分析。

    展开全文
  • 时间序列分析:数据预处理步骤引言:什么是时间序列分析一.平稳时间序列1.什么是平稳时间序列2.平稳时间序列的意义3.时间序列的特征统计量二.时间序列的平稳性检验1.导入数据(以分析某公司2000年--2003年每月销售...

    步骤

    引言:什么是时间序列分析

    时间序列分析法,就是将经济发展、购买力大小、销售变化等同一变数的一组观察值,按时间顺序加以排列,构成统计的时间序列,然后运用一定的数字方法使其向外延伸,预计市场未来的发展变化趋势,确定市场预测值。时间序列分析法的主要特点,是以时间的推移研究来预测市场需求趋势,不受其他外在因素的影响。不过,在遇到外界发生较大变化,如国家政策发生变化时,根据过去已发生的数据进行预测,往往会有较大的偏差。

    一.平稳时间序列

    1.什么是平稳时间序列

    时间序列是指将某种现象某一个统计指标在不同时间上的各个数值,按时间先后顺序排列而形成的序列。平稳时间序列粗略地讲,一个时间序列,如果均值没有系统的变化(无趋势)、方差没有系统变化,且严格消除了周期性变化,就称之是平稳的。

    2.平稳时间序列的意义

    归根结底,我们分析时间序列数据是希望能捕捉到数据当中的规律,基于规律,我们可以做预测。因此平稳,可以理解为这个规律是不随时间变化的,基于此,我们后面的分析和预测才有意义。

    3.时间序列的特征统计量

    在这里插入图片描述

    二.时间序列的平稳性检验

    1.导入数据(以分析某公司2000年–2003年每月销售数据为例)

    在R中输入一下命令

    sale = read.table("/home/ddy/桌面/five.txt",header=T,sep = '\t')
    head(sale)
    

    得到结果如下:
    在这里插入图片描述
    销售量数据的序列为:
    在这里插入图片描述

    2.时序图检验

    销售量数据的序列的时序图为:

    plot(sale_volume,main = "2000-2003年每月销售量",col = 8)
    

    在这里插入图片描述
    由时序图可得出该公司每月的销售数据以年为周期呈现规则的周期性,因此该公司每月的销售数据序列一定不是平稳序列。

    3.自相关检验

    销售量数据的序列的自相关图为:

    > acf(sale_volume)
    

    在这里插入图片描述
    在自相关图中,我们发现图中显示出明显的对称性,这是具有单调趋势的非平稳序列的一种典型的自相关图形式,即认为该序列为非平稳序列。

    4.时序图和自相关 图的注意事项

    无论是时序图还是自相关 图,使用它们作为检验方法时都具有较强的主观性,没有引入客观的统计量。因此,时序图与 自相关 图仅能用来排除非平稳时序,不能用来判断一个时序是否是平稳时序!即描述性检验方法仅仅是为计量性检验方法作一个初步筛选,如果时序没有通过描述性检验方法,就不需要进行计量性检验了;而即使时序通过了描述性检验方法,仍需要进行计量性检验来进一步确认时序为平稳时序。

    三.纯随机性检验

    1.白噪声序列的性质

    白噪声序列,是指白噪声过程的样本实称,简称白噪声。白噪声序列的特点表现在任何两个时点的随机变量都不相关,序列中没有任何可以利用的动态规律,因此不能用历史数据对未来进行预测和推断。
    白噪声序列的自相关函数为0。白噪声是平稳时间序列中的一个极端情况,具有十分广泛的应用。由于前后时点上的值不相关,白噪声序列可以作为新息序列,即t时刻的白噪声值εt与之前的白噪声序列{εt-1,εt-2,…}不相关,可以看做t-1到t之间进入系统的新信息。下图给出的是一个白噪声序列的折线图。
    在这里插入图片描述

    2.纯随机性检验

    (1)检验原理

    Barlett定理:如果一个时间序列是纯随机的,得到一个观察期数为n的观察序列,那么该序列的延迟非零期的样本自相关系数将近似服从均值为0,方差为序列观察期数倒数的正态分布。
    即是:
    在这里插入图片描述

    (2)检验假设条件

    原假设:延迟期数小于或等于m期的序列值之间相互独立

    在这里插入图片描述

    备择假设:延迟期数小于或等于m期的序列值之间有相关性
    在这里插入图片描述

    (3)检验统计量

    Q统计量:
    在这里插入图片描述
    LB统计量:
    在这里插入图片描述

    (4)检验结果分析

    在这里插入图片描述
    根据检验结果我们可以得出,P值都小于显著性水平0.05。因此,我们拒绝序列纯随机的原假设,我们可以认为该公司每月的销售数据序列变动不属于随机变动,这说明我们可以根据历史信息来预测未来年份的该公司每月的销售数据以及其他统计分析。

    展开全文
  • 时间序列数据处理

    2019-03-26 17:09:38
    摘要: 随着云计算和IoT的发展,时间序列数据的数据量急剧膨胀,高效的分析时间序列数据,使之产生业务价值成为一个热门话题。阿里巴巴数据库事业部的HiTSDB团队为您分享时间序列数据的计算分析的一般方法以及优化...
        

    摘要: 随着云计算和IoT的发展,时间序列数据的数据量急剧膨胀,高效的分析时间序列数据,使之产生业务价值成为一个热门话题。阿里巴巴数据库事业部的HiTSDB团队为您分享时间序列数据的计算分析的一般方法以及优化手段。

    演讲嘉宾简介:钟宇(悠你) 阿里巴巴 数据库高级专家,时间序列数据库HiTSDB的研发负责人。在数据库、操作系统、函数式编程等方面有丰富的经验。

    本次直播视频PPT,戳这里!

    本次分享主要分为以下几个方面:

    1. 时序数据库的应用场景
    2. 面向分析的时序数据存储
    3. 时序数据库的时序计算
    4. 时序数据库的计算引擎
    5. 时序数据库展望

    一,时序数据库的应用场景

    时序数据就是在时间上分布的一系列数值。生活中常见的时序数据包括,股票价格、广告数据、气温变化、网站的PV/UV、个人健康数据、工业传感器数据、服务器系统监控数据(比如CPU和内存占用率)、车联网等。

    下面介绍IoT领域中的时间序列数据案例。IoT给时序数据处理带来了很大的挑战。这是由于IoT领域带来了海量的时间序列数据:

    1. 成千上万的设备
    2. 数以百万计的传感器
    3. 每秒产生百万条数据
    4. 24×7全年无休(区别于电商数据,电商数据存在高峰和低谷,因此可以利用低谷的时间段进行数据库维护,数据备份等工作)
    5. 多维度查询/聚合
    6. 最新数据实时可查

    IoT中的时间序列数据处理主要包括以下四步:

    1. 采样
    2. 传输
    3. 存储
    4. 分析

    二,面向分析的时序数据存储

    下面介绍时间序列数据的一个例子。这是一个新能源风力发电机的例子。每个风力发电机上有两个传感器,一个是功率,一个是风速,并定时进行采样。三个设备,一共会产生六个时间序列。每个发电机都有多种标签,这就会产生多个数据维度。比如,基于生产厂商这个维度,对功率做聚合。或基于风场,对风速做聚合等。现在的时序数据库底层存储一般用的是单值模型。因为多值模型也可以一对一的映射到单值模型,但这个过程可能会导致性能损失。但是,在对外提供服务时,单值模型和多值模型都有应用。比如,OpenTSDB就是用单值模型对外提供服务的,而influxDB则是多值模型。但这两种数据库的底层存储用的都是单值模型。

    图片描述

    现实中的应用案例事实上会更复杂。像风力发电机这样的案例,它的设备和传感器的数量,我们可以认为是稳中有增的,不会发生特别剧烈的改变。它的数据采样的周期也是严格的定期采样。下图是一个工业案例,以滴滴这样的运营商为例。由于其业务特性,其车辆数量的增长和下降会出现暴涨暴跌。

    图片描述

    总体而言,现实世界的复杂之处在于:

    1. 未必是总是定时采样。
    2. 时间线可能是高度发散。以互联网广告为例,在对广告进行采样时,新广告的增长和老广告的下线速度很快,时间线就很有可能时高度发散的。
    3. 主键和schema修改。前面例子中提到的Tag,可以对应数据库的schema,在实际业务中可能会频繁改动。现在一般的时序数据库中,主键是会默认生成的,即所有tag的组合。因此,在新增tag时,主键就会改变,则变为了另一个对象。
    4. 分布式系统和片键。由于数据量很大,因此需要对数据进行分片,片键的选择也是一个难以抉择的问题。
    5. 数据类型。以刚才提到的单值模型为例。假设有一个三维的加速度传感器,同一时间点上会产生三个关联的数据,这时的数据类型就应该是一个维度为3的矢量,即一个新的数据类型。
    6. 需要对每个数据点的值做过滤。假设每辆车上都装有GPS传感器,假设要统计某一时间段内,一公里内,出现了哪些车辆,分别由哪些厂商生产。此时需要对地理位置进行过滤。

    下图是过去提出利用HiTSDB对时序问题的解决方案。在这种方案中,未解决发散问题,较高维数据和值过滤问题。用倒排索引来存储设备信息,并把时间点上的数据存在高压缩比缓存中。这两者结合,实际上将逻辑上的一个表分成了两个表,用以解决多维度查询和聚合的问题。但使用这种方案依然有很多问题无法解决。

    图片描述

    下面是HiTSDB的一些优势和不足:

    1. 优势:

    ·倒排索引可以很方便的筛选设备;

    ·高压缩比缓存具有很高的写入和读取能力

    ·方便的时间切片

    ·无schema,灵活方便支持各种数据模型

    1. 不足:

    ·在非定时采样场景下可能导致数据稀疏

    ·值没有索引,因此值过滤只能线性过滤

    · Schema改动导致时间线变动

    ·广播查限制了QPS

    在此基础上,进行了演进,如下图。

    图片描述

    1. 引入了Adaptive schema,即如果未指定一个数据表的schema,则认为写入的第一条数据中包含的TagKV即是片键也是主键,用以确定唯一性以及数据会被分片到哪一个节点上。
    2. 压缩块也不再是按固定的时间切片了,引入了meta index,用以查询每个数据块的开始和结束时间。在一个时间段内攒够了足够的数据后,把整个数据块进行压缩。
    3. 参考列存的思路,值索引到压缩块。值索引不再像传统数据库那样索引到行。
    4. 多值索引和空间切分。

    三,时序数据库的时序算法

    上面所述的存储结构主要是为了方便进行时序数据的加工和分析。时序有一些特殊算法。

    1. 降采样和插值:传感器采样出的点可能特别密集,在分析趋势时,会希望进行过滤。通过降采样可以利用一段时间内的最小值/最大值/平均值来替代。

    ·降采样算法:min/max/avg。

    ·插值算法:补零/线性/贝塞尔曲线

    1. 聚合计算:由于采样是精确到每个传感器的,但有时需要的数据并不仅是精确到某个传感器的。比如,希望比较两个不同厂商的发电机,哪个在风场中产生了更多的电。那么就需要对传感器数据进行聚合。

    ·逻辑聚合:min/max

    ·算术聚合:sum/count/avg

    ·统计:histogram/percentile/Standard Deviation

    1. 时间轴计算

    ·变化率:rate

    对时序数据进行加工的分析的重要目的是发现异常。下面介绍在异常检测中如何定义问题。从异常检测的角度来看时间序列数据,分为三个维度:time, object, metric。

    1. 固定两个维度,只考虑一个维度的数据。

    ·T: only consider time dim,单一对象单一metric即单个时间序列):spikes & dips、趋势变化、范围变化。

    ·M: only consider metric,找出不符合metric之间相互关系的数据。

    ·O: only consider object,找出与众不同的对象。

    1. 固定一个维度,只考虑两个维度的数据。

    ·MT:固定对象,考虑多个时间序列(每个对应一个metric),并找出其相互变化方式不同的作为异常。

    ·MO:不考虑时间特性,考虑多个对象且每个对象都可以用多个metric表示,如何从中找出不同的对象。

    ·TO:多个对象单一metric,找出变化趋势不同的对象。

    在异常检测中,面向问题有如下计算方法:

    1. 内置函数

    ·高压缩比缓存直接作为窗口缓存

    ·对于满足数据局部性的问题,直接在高压缩比缓存上运行

    ·结果直接写回

    ·定时调度 vs 数据触发

    1. 外置计算

    ·定时查询 vs 流式读取

    ·使用同样的查询语言执行查询或定义数据源

    ·数据库内置时间窗口

    ·数据流的触发机制

    针对时序数据,又可以将计算分为预计算和后计算。

    图片描述

    预计算:事先将结果计算完并存储。这是流计算中常用的方式。其特点如下:

    ·数据存储量低

    ·查询性能高

    ·需要手工编写计算过程

    ·新的计算无法立即查看结果

    ·灵活性差

    ·不保存原始数据

    后计算:先存数据,需要时进行计算。这是数据库中常用的方式。其特点如下:

    ·数据存储量大

    ·查询/聚合性能瓶颈

    ·任何查询都可以随时获得结果

    ·使用DSL进行查询

    ·灵活性好

    ·保存原始数据

    四,时序数据库的计算引擎

    基于两种计算的特点,在时序数据处理中,我们使用的是一种混合架构。有数据进来时,有预聚合规则,如果符合规则就进行预聚合,把数据写入数据库中。在查询时,如果符合预聚合规则,就可以很快得到结果。对于不满足预聚合规则的数据,会将其从数据库中读出,进行后聚合。中间的聚合引擎是一种类似流式计算的架构,数据库或者数据源都可以作为数据源。数据源的来源对于引擎是不可见的,它的功能是接收数据,计算并产生结果。因此,预计算和后计算都可以利用这一种逻辑进行,并放在同一个运行环境中。

    图片描述

    在逻辑上,上图是可行的。但实际上,如果要用这种方式进行流计算,由于数据源可能出现乱序等问题,就必须要利用窗口函数,将数据放入时间窗口中整理好,但这种缓存的效率其实并不高,实际情况下,是按照下图这种逻辑进行的。数据会被写进数据库,由于数据库有高压缩比缓存,是专门针对时序数据的。当一个时间窗口结束时,利用持续查询来进行预计算。它会将高压缩比缓存中的数据拿一部分出来做预聚合再写回数据库中。这样,这个缓存机制就替代了原来的时间窗口,节省了很多内存,降低了很多计算开销。

    图片描述

    使用类似于流的架构的好处是可以将其很快的接入异构计算的环境中。正如大家熟知的,流计算可以转化为一个DAG。结合前面提到的降采样和聚合的例子。以一个加法为例,可以把数据切成三片放入不同的工作节点上计算,计算完后再进行一次聚合输出数据。工作节点既可能是CPU也可能是GPU。接入异构计算的环境中,可以加速数据的计算。

    图片描述

    五,时序数据库展望

    下图是对未来架构的展望。

    图片描述

    1. 存储层

    ·类似lambda架构,基于一系列不可修改的文件

    ·针对不同的场景提供不同的存储格式

    1. 计算层

    ·流式架构,基于内存的异构计算,自动填充热数据

    ·数据分片,支持高QPS读取

    1. 索引

    ·全局的索引 vs 文件局部索引

    1. 大数据

    ·可以直接在大量的文件上跑MR,也可以通过高压缩比缓存以流的方式订阅数据

    未来,这个数据库将会演化成时序数据平台。它可以兼容SQL生态,一系列大数据平台,以及融合边缘计算。在部署时可以在云和边缘部署一整套的管理架构,同时把用SQL描述的规则下放到云板和边缘板上,形成一整套数据处理方案。

    图片描述

    POLARDB :https://www.aliyun.com/produc...
    HBASE: https://www.aliyun.com/produc...

    云数据库RDS PPAS 版: https://www.aliyun.com/produc...

    原文链接

    展开全文
  • 时间序列的方法处理数据

    千次阅读 2018-03-05 08:41:09
    作者:蓝京,商业银行数据分析师1、 本文简介 本文以处理A股财务报表为例,介绍了将数据转换成时间序列后在进行处理的一些方法和思路。将会用到xts,lapply,do.call等数据结构和函数。 我们从各个途径获得了个股...
        

    作者:蓝京,商业银行数据分析师


    1、 本文简介

          本文以处理A股财务报表为例,介绍了将数据转换成时间序列后在进行处理的一些方法和思路。将会用到xts,lapply,do.call等数据结构和函数。

     

          我们从各个途径获得了个股的财务报表原始数据后,还需要对数据做一些处理,以便后续指标计算和使用。举个简单的例子,个股发布的利润表和现金流量表,在年内各个季度值都是累计值,不方便环比比较,所以我们现在想把它们全部都处理成当季实际发生额。对于这样的数据,无论是SQL还是R,Python里面传统的数据结构,实现起来都是要费一番功夫进行数据处理的。但是如果使用了时间序列的方法,再结合一些R语言自带的语法结构,只需要短短几行代码,就能完成复杂的数据清洗。


    2、 原始数据

          原始文件我已经整理好了,记录了*万科*,*国农科技*,*世纪星源*和*深振业A*这四只股票从2014年一季度到2017年三季度,利润表里“营业总收入”的数据(单位:万元)。每只个股有15条记录,合计60行数据。数据结构如下:

    ## 'data.frame':    60 obs. of  3 variables:
    ##  $ 季度      : chr  "2017-09-30" "2017-06-30" ...
    ##  $ 名称      : chr  "万科" "万科" "万科" "万科" ...
    ##  $ 营业总收入: int  11710050 6981048 1858923 ...

    以万科为例,具体内容如下:

    data[data$名称=="万科",]
    ##  季度 名称 营业总收入
    ## 1  2017-09-30 万科   11710050
    ## 2  2017-06-30 万科    6981048
    ## 3  2017-03-31 万科    1858923
    ## 4  2016-12-31 万科   24047724
    ## 5  2016-09-30 万科   11705480
    ## 6  2016-06-30 万科    7479529
    ## 7  2016-03-31 万科    1461131
    ## 8  2015-12-31 万科   19554913
    ## 9  2015-09-30 万科    7959621
    ## 10 2015-06-30 万科    5026680
    ## 11 2015-03-31 万科     889434
    ## 12 2014-12-31 万科   14638800
    ## 13 2014-09-30 万科    6313959
    ## 14 2014-06-30 万科    4096190
    ## 15 2014-03-31 万科     949722

    我们看到,每只个股按照时间倒序排列,营业总收入是一个累计值。比如,表中显示万科在2017年3季度的营业收入为11710050(万元),2季度的营业收入为6981048(万元),那么万科2017年3季度的营业收入世纪发生额为11710050-6981048=4729002 万元。我们的目的是在原始数据的基础之上,再加一列,把单季度的发生额加在后面。

    3、处理过程

    3.1、数据切分

    原始数据里有4只股票,他们的数据结构是一致的,处理方法也一致,为了方便处理,把原始数据从数据框切成列表。在dataframe上使用split,可以将dataframe按照指定的条件切成一个个列表。示例如下:

    data<-split(data,data$名称)   
    #数据类型
    class(data) ## [1] "list"
    #列表名称
    names(data) ## [1] "国农科技" "深振业A"  "世纪星源" "万科"
    # 第一个列表内容
    data[[1]] ##          季度     名称 营业总收入
    ## 16 2017-09-30 国农科技       7100
    ## 17 2017-06-30 国农科技       2929
    ## 18 2017-03-31 国农科技       1087
    ## 19 2016-12-31 国农科技      28767
    ## 20 2016-09-30 国农科技      21757
    ## 21 2016-06-30 国农科技      10215
    ## 22 2016-03-31 国农科技       1348
    ## 23 2015-12-31 国农科技      12045
    ## 24 2015-09-30 国农科技       8889
    ## 25 2015-06-30 国农科技       5955
    ## 26 2015-03-31 国农科技       2094
    ## 27 2014-12-31 国农科技       8061
    ## 28 2014-09-30 国农科技       4842
    ## 29 2014-06-30 国农科技       2743
    ## 30 2014-03-31 国农科技       1130

    这样数据从dataframe切分成了4个列表,分别对应每一只个股。

    3.2、数据处理

    df<-data[[1]]
    df$季度<-as.Date(df$季度)
    df<-as.xts(df[-c(1,2)],order.by=df$季度)
    class(df)
    ## [1] "xts" "zoo"
    df ##            营业总收入

    ## 2014-03-31       1130
    ## 2014-06-30       2743
    ## 2014-09-30       4842
    ## 2014-12-31       8061
    ## 2015-03-31       2094
    ## 2015-06-30       5955
    ## 2015-09-30       8889
    ## 2015-12-31      12045
    ## 2016-03-31       1348
    ## 2016-06-30      10215
    ## 2016-09-30      21757
    ## 2016-12-31      28767
    ## 2017-03-31       1087
    ## 2017-06-30       2929
    ## 2017-09-30       7100

    时间序列只能处理数值型的数据,数据转化成时间序列后,原来数据框中的日期和名称都消失了。要在后面在加上去。现在开始计算单季数据,只要拿当前的值减去上期的值即可。在时间序列了,可以使用DIFF差分函数来实现,diff(x,n),表示将当前值减去N个周期前的值。默认n=1.将处理后的数据合并会原来的数据。并把日期加上去。

    datadiff<-diff(df)
    datanew<-as.data.frame(merge(df,datadiff))
    datanew<-cbind(row.names(datanew),datanew)
    colnames(datanew)<-c("季度","营业总收入","营业总收入单季")
    datanew
    ## 季度 营业总收入 营业总收入单季

    ## 2014-03-31       1130             NA ## 2014-06-30       2743           1613
    ## 2014-09-30       4842           2099
    ## 2014-12-31       8061           3219
    ## 2015-03-31       2094          -5967
    ## 2015-06-30       5955           3861
    ## 2015-09-30       8889           2934
    ## 2015-12-31      12045           3156
    ## 2016-03-31       1348         -10697
    ## 2016-06-30      10215           8867
    ## 2016-09-30      21757          11542
    ## 2016-12-31      28767           7010
    ## 2017-03-31       1087         -27680
    ## 2017-06-30       2929           1842
    ## 2017-09-30       7100           4171

    注意到这个结果还有一个问题,一个是一季度的数据不需要减去上期值,一季度的单季数值等于累计值。所以数据还要处理一下。

    #quarter方法来自lubridate包,可以传入文本判断季度
    datanew[quarter(datanew$季度)==1,3]=datanew[quarter(datanew$季度)==1,2]
    DataPrc<-function (x){
     
     #转成时间序列
     x$季度<-as.Date(x$季度)
     StkNam<-as.character(x$名称[1])
     x<-as.xts(x[-c(1,2)],order.by=x$季度)
     
     #利用差分计算单期值并合并
     x.diff<-diff(x)
     x.new<-as.data.frame(merge(x,x.diff))
     x.new<-cbind(row.names(x.new),StkNam,x.new)
     colnames(x.new)<-c("季度","名称","营业总收入","营业总收入单季")
     #处理特殊情况
     #quarter 方法来自lubridate包,可以传入文本判断季度
     x.new[quarter(x.new$季度)==1,4]=x.new[quarter(x.new$季度)==1,3]
     
     x.new
     
     }
     
     stkdata<-lapply(data,DataPrc)
     
     stkdata
     ## $国农科技
     ##                  季度     名称 营业总收入 营业总收入单季
     ## 2014-03-31 2014-03-31 国农科技       1130           1130
     ## 2014-06-30 2014-06-30 国农科技       2743           1613
     ## 2014-09-30 2014-09-30 国农科技       4842           2099
     ## 2014-12-31 2014-12-31 国农科技       8061           3219
     ## 2015-03-31 2015-03-31 国农科技       2094           2094
     ## 2015-06-30 2015-06-30 国农科技       5955           3861
     ## 2015-09-30 2015-09-30 国农科技       8889           2934
     ## 2015-12-31 2015-12-31 国农科技      12045           3156
     ## 2016-03-31 2016-03-31 国农科技       1348           1348
     ## 2016-06-30 2016-06-30 国农科技      10215           8867
     ## 2016-09-30 2016-09-30 国农科技      21757          11542
     ## 2016-12-31 2016-12-31 国农科技      28767           7010
     ## 2017-03-31 2017-03-31 国农科技       1087           1087
     ## 2017-06-30 2017-06-30 国农科技       2929           1842
     ## 2017-09-30 2017-09-30 国农科技       7100           4171

    ## $深振业A ##                  季度    名称 营业总收入 营业总收入单季 ## 2014-03-31 2014-03-31 深振业A      26292          26292 ## 2014-06-30 2014-06-30 深振业A      49149          22857 ## 2014-09-30 2014-09-30 深振业A      64985          15836 ## 2014-12-31 2014-12-31 深振业A     232873         167888 ## 2015-03-31 2015-03-31 深振业A     138923         138923 ## 2015-06-30 2015-06-30 深振业A     202261          63338 ## 2015-09-30 2015-09-30 深振业A     230546          28285 ## 2015-12-31 2015-12-31 深振业A     365431         134885 ## 2016-03-31 2016-03-31 深振业A      38249          38249 ## 2016-06-30 2016-06-30 深振业A      86869          48620 ## 2016-09-30 2016-09-30 深振业A     114571          27702 ## 2016-12-31 2016-12-31 深振业A     335883         221312 ## 2017-03-31 2017-03-31 深振业A     116791         116791 ## 2017-06-30 2017-06-30 深振业A     186960          70169 ## 2017-09-30 2017-09-30 深振业A     231926          44966

    ## ## $世纪星源 ##                  季度     名称 营业总收入 营业总收入单季 ## 2014-03-31 2014-03-31 世纪星源       1218           1218 ## 2014-06-30 2014-06-30 世纪星源       2386           1168 ## 2014-09-30 2014-09-30 世纪星源       3585           1199 ## 2014-12-31 2014-12-31 世纪星源       5278           1693 ## 2015-03-31 2015-03-31 世纪星源       1349           1349 ## 2015-06-30 2015-06-30 世纪星源       3629           2280 ## 2015-09-30 2015-09-30 世纪星源       4576            947 ## 2015-12-31 2015-12-31 世纪星源       8413           3837 ## 2016-03-31 2016-03-31 世纪星源       4342           4342 ## 2016-06-30 2016-06-30 世纪星源      18995          14653 ## 2016-09-30 2016-09-30 世纪星源      35050          16055 ## 2016-12-31 2016-12-31 世纪星源      48186          13136 ## 2017-03-31 2017-03-31 世纪星源       7145           7145 ## 2017-06-30 2017-06-30 世纪星源      20360          13215 ## 2017-09-30 2017-09-30 世纪星源      31423          11063

    ## $万科 ##                  季度 名称 营业总收入 营业总收入单季 ## 2014-03-31 2014-03-31 万科     949722         949722 ## 2014-06-30 2014-06-30 万科    4096190        3146468 ## 2014-09-30 2014-09-30 万科    6313959        2217769 ## 2014-12-31 2014-12-31 万科   14638800        8324841 ## 2015-03-31 2015-03-31 万科     889434         889434 ## 2015-06-30 2015-06-30 万科    5026680        4137246 ## 2015-09-30 2015-09-30 万科    7959621        2932941 ## 2015-12-31 2015-12-31 万科   19554913       11595292 ## 2016-03-31 2016-03-31 万科    1461131        1461131 ## 2016-06-30 2016-06-30 万科    7479529        6018398 ## 2016-09-30 2016-09-30 万科   11705480        4225951 ## 2016-12-31 2016-12-31 万科   24047724       12342244 ## 2017-03-31 2017-03-31 万科    1858923        1858923 ## 2017-06-30 2017-06-30 万科    6981048        5122125 ## 2017-09-30 2017-09-30 万科   11710050        4729002

    4、合并

    以上结果显示数据都是列表,把它们合成一个数据框。方便后续处理。你当然可以选择使用循环将列表合并,但R里处理循环的效率实在无法恭维。这里有个更好的办法,代码如下:

    result<- do.call(rbind,stkdata)
    rownames(result) <- NULL
    head(result[result$名称=="世纪星源",],2)
    # 季度     名称 营业总收入 营业总收入单季
    ## 2014-03-31 世纪星源     1218    1218
    ## 2014-06-30 世纪星源     2386    1168

    do.call() 是告诉列表一个函数,让列表里的所有元素来执行这个函数。将其用于列表合并,效果比循环好太多。

    这样,我们就把数据整理完毕了。这种差分的数据处理方法,在很多场景都有应用。比如运营上拿到了一系列周期上的指标数值,都同时会看看同比、环比的增减情况。这些数据使用传统的数据结构,使用传统的数据处理方法,计算脚本都是很复杂的,而把数据转化成时间序列后,这些处理的过程都可以用简单的方法解决。另外,在使用R进行数据分析时,应该利用这种向量化语言的特点,用向量化的方法处理数据。

    640?wx_fmt=png


    展开全文
  • 场景:节日客流量预测季节销量预测实时股价预测案例:客流量预测解读:通过实际值和预测值的对比可直观看出预测的准确程度原理:时间序列回归(TSR)是一种动态数据处理的统计方法,研究随机时间序列数据遵循的统计...
  • 前言 因近期进行时间序列分析时遇到了数据预处理中的缺失值处理问题,其中日期缺失和填充在网上没有找到... 收集时间序列数据,相信看这篇博客的各位已经完成了这步。  需要安装pandas模块,并利用Python的Lib文...
  • 时间序列异常事件检测

    万次阅读 2015-02-11 20:23:10
    我们称这样的数据为异常数据,对异常数据处理在某些领域很有价值,例如在网络安全领域,可以利用异常数据挖掘来分析网络中的异常行为;在金融领域异常数据挖掘可以识别信用卡的欺诈交易、股市的操控行为、会计
  • 机器学习中对于时间序列数据进行train、val、test划分时需要注意的问题是,不要将val中的数据出现在train中,准确的说,是选取的val数据的时间节点不能与train中数据时间节点有任何交集。否则,你会发现训练时,...
  • 周期性时间序列的预测

    万次阅读 2018-08-18 00:04:58
    女主宣言AIOps 从立项到现在已经半年有余,从最开始的 LVS 异常检测,到如今的实时关联分析,智能运维已经渗透到我们日常运维中的许多场景,之后我们会将积累的经验分享出...
  • 时间序列的归一化方法

    万次阅读 2015-03-30 20:24:14
    在机器学习、模式识别的模型训练之前,通常需要对数据进行预处理工作,在哪种情况下选用哪种预处理方法,仍然是很多工作...由于时间序列的特殊性(1、相邻序列之间的模式相关性,2、在时间维度上数据是不断产生的),因
  • EXCEL篇—时间序列分析(季节指数法)

    万次阅读 多人点赞 2019-08-13 13:35:42
    之前跟大家一起分享了如何用EXCEL进行回归分析,现在跟大家一起来学习一下如何用EXCEL做时间序列分析。 在百科里,时间序列分析分析的解释是这样的:时间序列(或称动态数列)是指将同一统计指标的数值按其发生的...
  • 处理时间序列数据时,经常需要对数据进行预处理,然后在使用复杂模型处理数据。其中,常用的一种方法就是对数据取log,进行log变形。那么什么样的时间序列数据需要进行取log呢?查阅资料发现,如果数据满足如下两点...
  • Temporal Convolutional Network   ...比如改变卷积核的参数,容易控制模型的记忆大小;...Receptive field = nb_stacks_of_residuals_blocks * kernel_size * last_dilation. If a T...
  • 时间序列的异常值处理

    千次阅读 2018-12-18 18:08:34
    问题描述:开盘价的日收益率出现了异常值,9000多倍,什么原因导致? 答案:如图所示:由于开盘价出现了异常,价格为0.01;导致以此价格为基础计算的相关指标均异常;如果要还原真值,如果用均值与中位数均不合理,...
  • 时间序列分类

    千次阅读 2018-08-19 10:15:16
    时间序列分类比较麻烦是因为我们用于模型训练的数据的每条样本一般是一个特征向量x对应一个y的形式,而时间序列的大量的信息藏在它的结构中,不仅仅体现在数值上。没意识到这一点的话,我们提取的特征可能就没有什么...
  • 在python中经常会用到pandas来处理数据,最常用的数据类型是dataframe,但是有时候在dataframe有时间字段需要画时间序列图的时候会遇到一些问题,下面是我处理这个问题的一个小案例,希望可以帮到在坑里的小朋友哦,...
  • 时间序列分析

    千次阅读 2016-08-03 10:03:01
    时间序列的特点 序列中的数据数据点的位置依赖于时间,即数据的取值依赖于时间的变化,但不一定是时间t的严格函数。 每一时刻的取值或数据点的位置具有一定的随机性,不可能完全准确地用历史数据预测。 前后时刻...
  • EMD经验模态分解——分析时间序列

    万次阅读 多人点赞 2017-10-01 16:20:20
    EMD,(Empirical Mode Decomposition),经验模态分解 Time Series Data,时间序列数据
  • 基于keras的LSTM时间序列预测

    万次阅读 热门讨论 2018-07-18 15:43:13
    本文使用air passenger航空公司乘客数据集,来测试LSTM在时间序列中的预测: 问题 这里我们使用前n个月的乘客量来预测下一个月的乘客量 数据分析 航空公司乘客数据集为1949年1月到1960年12月...
  • ARIMA模型

    万次阅读 多人点赞 2015-06-06 19:54:41
    在时域分析里,生成时间序列数据的随机过程按照统计规律的特征是否随着时间变化而变化分为两类,如果随机过程的特征随着时间变化,如GDP的时间序列一般随着时间稳定增长,则此过程是非平稳的;相反,如果随机过程的...
1 2 3 4 5 ... 20
收藏数 415,655
精华内容 166,262
关键字:

时间序列数据处理