如何用Python对数据进行差分数据

diff函数是从数学上来说是将数据與平移后的数据进行比较得出的差异数据。从操作的意义上来说是两条临近记录的差值,也就是一阶差分数据下面用举例子的方式,將diff的功能进行阐述:

现在有一个DataFrame类型的数据df如下:

现在对df进行一阶差分数据操作:df.diff(),得到结果:

}

:数据科学、人工智能从业者的茬线大学

数据科学(Python/R/Julia)、机器学习、深度学习

在数据选择之前是要把所有的菜品都洗好并放在不同的容器里。现在要进行切配了需要紦这些菜品挑选出来,比如做一盘凉拌黄瓜需要先把黄瓜找出来;要做一盘可乐鸡翅,需要先把鸡翅找出来

数据分析也是同样的道理,你要分析什么首先要把对应的数据筛选出来。

常规的数据选择主要有列选择、行选择、行列同时选择三种方式

1、选择某一列/某几列

茬Excel中选择某一列直接用鼠标选中这一列即可;如果要同时选择多列,且待选择的列不是相邻的这个时候就可以先选中其中一列,然后按住Ctrl键不放再选择其他列。举个例子同时选择客户姓名和成交时间这两列,如下图所示:


在Python中我们想要获取某列只需要在表df后面的方括號中指明要选择的列名即可如果是一列,则只需要传入一个列名;如果是同时选择多列则传入多个列名即可,多个列名用一个list存起来

在Python中我们把这种通过传入列名选择数据的方法称为普通索引。

除了传入具体的列名我们还可以传入具体列的位置,即第几列对数据進行选取,通过传入位置来获取数据时需要用到iloc方法

在上面的代码中,iloc后的方括号中逗号之前的部分表示要获取行的位置只输入一个冒号,不输入任何数值表示获取所有的行;逗号之后的方括号表示要获取的列的位置列德位置同样是也是从0开始计数。

我们把这种通过傳入具体位置来选择数据的方式称为位置索引

在Excel中,要选择连续的几列时直接用鼠标选中这几列即可操作。当然了你也可以先选择┅列,然后按住Ctrl键再去选择其他列由于要选取的列时连续的,因此没有必要这么麻烦

在Python中可以通过前面介绍的普通索引个位置索引获取某一列或多列的数据。当你要获取的是连续的某几列用普通索引和位置索引也是可以做到的,但是因为你要获取的列是连续的所以呮要传入这些连续列的位置区间即可,同样需要用到iloc方法

在上面的代码中,iloc后的方括号中逗号之前的表示选择的行当只传入一个冒号時,表示选择所有行;逗号后面表示要选择列的位置区间0:3表示选择第1列到第4列之间的值(包含第1列单不包含第4列),我们把这种通过传叺一个位置区间来获取数据的方式称为切片索引

1、选择某一行/某几行

在Excel中选择行与选择列的方式是一样的,先选择一行按住Ctrl键再选择其他行。

在Python中获取行的方式主要有两种,一种是普通索引即传入具体行索引的名称,需要用到loc方法;另一种是位置索引即传入具体嘚行数,需要用到iloc方法

为了看的更清楚,我们对行索引进行自定义

在Excel中选择连续的某几行与选择连续的某几列的方法一致,不在赘述

在Python中,选择连续的某几行时你同样可以把要选择的每一个行索引名字或者行索引的位置输进去。很显然这是没有必要的只要把连续荇的位置用一个区间表示,然后传给iloc即可

前面说到获取某一列时,获取的是这一列的所有行我们还可只筛选出这一列中满足条件的值。

比如年龄这一列需要把非异常值(大于200的属于异常值),即小于200岁的年龄筛选出来该怎么实现呢?

在Excel中我们直接使用筛选功能将滿足条件的值筛选出来,筛选方法如下图所示:

筛选年龄小于200的数据前后的对比如下图所示:

在Python中,我们直接在表名后面指明哪列要满足什么条件就可以把满足条件的数据筛选出来。

我们把上面这种通过传入一个判断条件来选择数据的方式称为布尔索引

传入的条件也鈳以是多个,如下为选择的年龄小于200且唯一识别码小于102的数据

上面的数据选择都是针对单一的行或者列进行选择,实际业务中我们也会鼡到行、列同时选择所谓的行、列同时选择就是选择出行和列的相交部分。

例如我们要选择第二、三行和第二、三列相交部分的数据,下图中的阴影部分就是最终的选择结果

行列同时选择在Excel中主要是通过鼠标拖拽实现的,与前面的单一行/列选择方法一致此处不再赘述,接下来主要讲讲在Python中是如何实现的

1、普通索引+普通索引选择指定的行和列

位置索引+位置索引是通过同时传入行、列索引的位置来获取数据,需要用到iloc方法


loc方法中的第一对方括号表示行索引的选择,传入行索引的名称;loc方法中的第二对方括号表示列索引的选择传入列索引的名称。

2、位置索引+位置索引选择指定行和列

位置索引+位置索引是通过同事传入行、列索引的位置来获取数据需要用到iloc方法。

在iloc方法中的第一对方括号表示行索引的选择传入要选择行索引的位置;第二对方括号表示列索引的选择,传入要选择列索引的位置行和列索引的位置都是从0开始计数的。

3、布尔索引+普通索引选择指定的行和列

布尔索引+普通索引是先对表进行布尔索引选择行然后通过普通索引选择列。

上面的代码表示选择年龄小于200的订单编号和年龄先通过布尔索引选择出年龄小于200的所有行,然后通过普通索引选择订单编號和年龄这两列

4、切片索引+切片索引选择指定的行和列

切片索引+切片索引是通过同时传入行、列索引的位置区间进行数据选择。

5、切片索引+普通索引选择指定的行和列

前面我们说过如果是普通索引,就直接传入行或者列名用loc方法即可;如果是切片索引,也就是传入行戓者列的位置区间要用iloc方法。如果是切片索引+普通索引也就是行(列)用切片索引,列(行)用普通索引这种交叉索引要用ix方法。

關注“AIU人工智能实验室”回复“录播”获取更多人工智能精选直播视频!

}

标签(空格分隔): 时间序列数據分析


本文的内容主要来源于博客:本人做了适当的注释和补充
英文不错的读者可以前去阅读原文。

在閱读本文之前 ,推荐先阅读:

本文主要分为四个部分:

  1. 用pandas处理时序数据
  2. 怎样检查时序数据的稳定性
  3. 怎样让时序数据具有稳定性

1. 用pandas导入和处理时序数据

数据文件可在github:

因为ARIMA模型要求数据是稳定的所以这一步至关重要。

1. 判断数据是稳定的常基于对于时间是常量的几个统计量:

    X是时序数据的值t是时间。可以看到左图数据的均值对于时间轴来说是常量,即数据的均值不是时间的函数,所有它是稳定的;右图随着时间的推移数据的值整體趋势是增加的,所有均值是时间的函数数据具有趋势,所以是非稳定的 可以看到左图,数据的方差对于时间是常量即数据的值域圍绕着均值上下波动的振幅是固定的,所以左图数据是稳定的而右图,数据的振幅在不同时间点不同所以方差对于时间不是独立的,數据是非稳定的但是左、右图的均值是一致的。 一个时序数据的自协方差就是它在不同两个时刻i,j的值的协方差。可以看到左图的自协方差于时间无关;而右图随着时间的不同,数据的波动频率明显不同导致它i,j取值不同就会得到不同的协方差,因此是非稳定的雖然右图在均值和方差上都是与时间无关的,但仍是非稳定数据

#这里以一年为一个窗口,每一个时间t的值由它前面12個月(包括自己)的均值代替标准差同理。 #dftest的输出前一项依次为检测值p值,滞后数使用的观测数,各个置信度下的临界值


可以看到数据的rolling均值/标准差具有越来越大的趋势,是不稳定的
且DF-test可以明确的指出,在任何置信度下数据都不是稳定的。

3. 让时序数据变成稳定的方法

让数据变得不稳定的原因主要有俩:

  1. 趋势(trend)-数据随着时间变化比如说升高或者降低。
  2. 季节性(seasonality)-数据在特定的时间段内变动比如说节假日,或者活动导致数据的异常

由于原数据值域范围比较大,为了缩小值域同时保留其他信息,常用嘚方法是对数化取log。

  • 聚合 : 将时间轴缩短以一段时间内星期/月/年的均值作为数据值。使不同时间段内的值差距缩小
  • 平滑: 以一个滑动窗口内的均值代替原来的值,为了使值之间的差距缩小
  • 多项式过滤:用一个回归模型来拟合现有数据使得数据更平滑。


可以看到做了處理之后的数据基本上没有了随时间变化的趋势,DFtest的结果告诉我们在95%的置信度下数据是稳定的。

上面的方法是将所有的时间平等看待洏在许多情况下,可以认为越近的时刻越重要所以引入指数加权移动平均-- Exponentially-weighted moving average.(pandas中通过ewma()函数提供了此功能。)


可以看到相比普通的Moving Average新的数據平均标准差更小了。而且DFtest可以得到结论:数据在99%的置信度上是稳定的

  • 1 差分数据化: 以特定滞后数目的时刻的值的作差
  • 2 分解: 对趋势和季节性分别建模在移除它们


如图,可以看出相比MA方法Differencing方法处理后的数据的均值和方差的在时间轴上的振幅明显缩小了。DFtest的结论是在90%的置信度下数据是稳定的。

#分解(decomposing) 可以用来把时序数据中的趋势和周期性数据都分离出来:
 
 
 
 


如图可以明显的看到将original数据 拆分成了三份。Trend数据具囿明显的趋势性Seasonality数据具有明显的周期性,Residuals是剩余的部分可以认为是去除了趋势和季节性数据之后,稳定的数据是我们所需要的。

#消除了trend 和seasonal之后只对residual部分作为想要的时序数据进行处理


如图所示,数据的均值和方差趋于常数几乎无波动(看上去比之前的陡峭,但是要注意他的值域只有[-0.05,0.05]之间)所以直观上可以认为是稳定的数据。另外DFtest的结果显示Statistic值原小于1%时的Critical value,所以在99%的置信度下数据是稳定的。

4. 对时序数据进行预测

假设经过处理已经得到了稳定时序数据。接下来我们使用ARIMA模型
对数据已经预测。ARIMA的介绍可以见本目錄下的另一篇文章

先画出ACF,PACF的图像,代码如下:


图中,上下两条灰线之间是置信区间p的值就是ACF第一次穿过上置信区间时的横轴值。q的值就昰PACF第一次穿过上置信区间的横轴值所以从图中可以得到p=2,q=2

step2: 得到参数估计值p,dq之后,生成模型ARIMA(pd,q)
为了突出差别用三种参数取值的三个模型作为对比。


图中蓝线是输入值,红线是模型的拟合值RSS的累计平方误差。


由RSS可知模型3--ARIMA(2,1,2)的拟合度最好,所以我们确萣了最终的预测模型

step3: 将模型代入原数据进行预测
因为上面的模型的拟合值是对原数据进行稳定化之后的输入数据的拟合,所以需要对拟匼值进行相应处理的逆操作使得它回到与原数据一致的尺度。


#由于差分数据化有一阶滞后所以第一个月的数据是空的,
#累加现有的diff嘚到每个值与第一个月的差分数据(同log底的情况下)。
#先以ts_log的第一个值作为基数复制给所有值,然后每个时刻的值累加与第一个月对应嘚差值(这样就解决了第一个月diff数据为空的问题了)

前面一篇文章,总结了ARIMA建模的步骤
(1). 获取被观测系统时间序列数据;
(2). 对数据绘图,觀测是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分数据运算化为平稳时间序列;
(3). 经过第二步处理,已经得到平稳时间序列要对平稳时间序列分别求得其自相关系数ACF 和偏自相关系数PACF,通过对自相关图和偏自相关图的分析得到最佳的阶层 p 和阶数 q
(4). 由以上得到的d、q、p,得到ARIMA模型然后开始对得到的模型进行模型检验。
具体例子会在另一篇文章中给出

本文结合一个例子,说明python如何解决:
1.判断一个時序数据是否是稳定对应步骤(1)
2. 怎样让时序数据稳定化。对应步骤(2)
3. 使用ARIMA模型进行时序数据预测对应步骤(3,4)

另外对data science感兴趣的同学可以关注这個网站,干货还挺多的

}

我要回帖

更多关于 差分数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信