Stationary Series 平稳序列

平稳序列有三个基本标准:

1、序列的均值(mean)不应该是时间的函数(意思是不应该随时间变化),而应该是一个常数。下面的左图满足这个条件,而右图的均值受时间的变化影响。

2、序列的方差(variance)不应该是时间的函数。这种特性称为homoscedasticity(同方差性)。下图描绘了平稳序列和非平稳序列,注意右图分布的不同变化范围。

3、t时间段的序列和前一个时间段的序列的协方差(协方差,衡量的是两个变量在一段时间内同向变化的程度)应该只和时间间隔有关,而与时间t无关,在时间序列中,因为是同一个变量在不同时间段的值序列,所以这里的协方差称为自协方差。右图随着时间的增加,有一段变得越来越紧密了。所以右图的序列的协方差不是常数。

带有趋势和季节性成分的时间序列都是非平稳的,下图给出了更多的区分平稳性的例子:

为什么要关注序列的平稳性?

大多数的统计预测方法都是以平稳时间序列为假设前提来设计的。 比如,对于时间序列自回归预测来说,我们的假设是变量的历史和现状呈现出的基本特性,在未来阶段的一个长时期里会维持不变,而这里的基本特性一般就是用上面提到的均值、方差、自协方差来表示。 更具体的说,自回归预测模型本质是'利用序列的滞后阶数(lags)作为自变量'的线性回归模型,比如lags=2表示使用变量的t-1和t-2时刻的值作为自变量来预测t时刻的值。那么通过在历史序列上训练模型后,得到的这个线性回归模型的各自变量的系数就代表了各滞后时刻的值与下一时刻值的相关性,如果时间序列接近平稳,这些相关性在未来一段时间内都不会有大的变化,那么预测未来就成为了可能。 所以,相对非平稳序列的预测,平稳序列的预测更简单和可靠。

非平稳序列如何做预测?

对于非平稳时间序列的预测,我们需要先将其转换为平稳时间序列,方法包括:

差分(一阶或n阶)

取log

开根号

时间序列分解

综合使用上面的方法

一般来说,做个一阶差分,就可以得到接近平稳的时间序列了,如果方差随时间变化较大,那么先取log再做一阶差分就可以了。

什么是差分?

比如有一个序列:[1,5,2,12,20] 一阶差分,得到:[5-1, 2-5, 12-2, 20-12] = [4, -3, 10, 8] 二阶差分(即在一阶差分之后,再做一次差分),得到:[-3-4, -10-3, 8-10] = [-7, -13, -2]

如何测试序列的平稳性?

对于判断时间序列是否平稳,可以通过肉眼观测时间序列图,就类似上面提到的平稳性的3个基本标准,或者 将时间序列分成多个连续的部分,计算各部分的均值、方差和自相关性(或协方差),如果结果相差很大,那么序列就不平稳。但是这些方法都不能量化平稳性,也就是用一个数值来表示出时间序列的平稳性。为此,我们可以使用‘Unit Root Tests’即单位根检验,该方法的思想是如果时间序列有单位根,则就是非平稳的。

以下是常用的两个基于单位根检验思想的实现:

Augmented Dickey Fuller test (ADF Test) 零假设为序列有单位根,是非平稳的,P-Value如果小于显著级别(0.05),则可以拒绝零假设。

Kwiatkowski-Phillips-Schmidt-Shin – KPSS test (trend stationary) 与ADF正好相反,零假设为序列是平稳的。另外,在python中,可以通过指定regression='ct'参数来让kps把“确定性趋势(deterministic trend)”的序列认为是平稳的。所谓确定性趋势的序列就是斜率始终保持不变的序列,比如下面这样的:

下面是对应的python代码:

from statsmodels.tsa.stattools import adfuller, kpss

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv', parse_dates=['date'])

# ADF Test

result = adfuller(df.value.values, autolag='AIC')

print(f'ADF Statistic: {result[0]}')

print(f'p-value: {result[1]}')

for key, value in result[4].items():

print('Critial Values:')

print(f' {key}, {value}')

# KPSS Test

result = kpss(df.value.values, regression='c')

print('\nKPSS Statistic: %f' % result[0])

print('p-value: %f' % result[1])

for key, value in result[3].items():

print('Critial Values:')

print(f' {key}, {value}')

输出:

ADF Statistic: 3.14518568930674

p-value: 1.0

Critial Values:

1%, -3.465620397124192

Critial Values:

5%, -2.8770397560752436

Critial Values:

10%, -2.5750324547306476

KPSS Statistic: 1.313675

p-value: 0.010000

Critial Values:

10%, 0.347

Critial Values:

5%, 0.463

Critial Values:

2.5%, 0.574

Critial Values:

1%, 0.739

白噪声和平稳序列的区别

白噪声的遵循均值为0的随机分布,没有丝毫的模式可言。用python制造一个白噪声序列,并可视化如下:

randvals = np.random.randn(1000)

pd.Series(randvals).plot(title='Random White Noise', color='k')

去除趋势

减去最佳拟合线

减去均值线,或者移动平均线

减去/除以 利用时间序列分解出的趋势序列

去除季节性

季节性窗口内的移动平均法,平滑季节性

季节性差分,就是用当前值减去一个季节窗口之前对应的时刻的值

减去/除以 利用时间序列分解出的季节性序列

如何判断序列是否有季节性?

通过肉眼看图

通过自相关函数判断

from pandas.plotting import autocorrelation_plot

df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv')

# Draw Plot

plt.rcParams.update({'figure.figsize':(9,5), 'figure.dpi':120})

autocorrelation_plot(df.value.tolist())

时间序列分解出的季节性序列来计算,其思想是越没有季节性,那么Rt的方差和Rt+St的方差越应该区别不大,反之,这个方差的比值越应该小于1,公式如下:

Fs越接近0,越没有季节性,越接近1,季节性越强。

原文作者: 程序员一一涤生(云+社区)

python处理时间序列非平稳_用python做时间序列预测4:平稳/非平稳时间序列相关推荐

  1. python时间序列因果检验_用python做时间序列预测八:Granger causality test(格兰杰因果检验)...

    如果想知道一个序列是否对预测另一个序列有用,可以用Granger causality test(格兰杰因果检验). Granger causality test的思想 如果使用时间序列X和Y的历史值来 ...

  2. python文本结构化处理_在Python中标记非结构化文本数据

    python文本结构化处理 Labelled data has been a crucial demand for supervised machine learning leading to a n ...

  3. python时间序列分析航空旅人_用python做时间序列预测一:初识概念

    利用时间序列预测方法,我们可以基于历史的情况来预测未来的情况.比如共享单车每日租车数,食堂每日就餐人数等等,都是基于各自历史的情况来预测的. 什么是时间序列? 时间序列,是指同一个变量在连续且固定的时 ...

  4. python时间序列因果检验_用python做时间序列预测8:Granger causality test(格兰杰因果检验)...

    如果想知道一个序列是否对预测另一个序列有用,可以用Granger causality test(格兰杰因果检验). Granger causality test的思想 如果使用时间序列X和Y的历史值来 ...

  5. python字符串大写字母个数_【python实例】统计字符串里大写字母,小写字母的个数和非字母的个数...

    """ 给定一个以下字符串:统计大写字母的个数,小写字母的个数,非字母的个数. str1 = "ajdkkKDKEK1343KFKiriromfkfKKRIOW ...

  6. python交互式和文件式_使用Python创建和自动化交互式仪表盘

    python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...

  7. python 按需加载_基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)...

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 文档转换为PDF有些图片无法完全显示,请移步我的博客查看 完成 ...

  8. python中nomodulenamed怎么解决_关于 python ImportError: No module named 的问题

    今天在 centos 下安装 python setup.py install 时报错:ImportError: No module named sysconfig, 当时急着用,就顺手直接源码编译了一 ...

  9. python中函数的调用_慢步python,编程中函数的概念,python中函数的声明和调用

    函数,曾经是一个很高大尚的概念.笔者是在高中数学里认识的函数,先是从y=2x+3 这条代数式开始的.y是因变量,x是自变量,y因为x取值的变化而变化. 再后来式子变成这样:f(x)=2x+3,f(x) ...

  10. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

最新文章

  1. java程序设计_Java程序设计:学习笔记(4-5)(未完工)
  2. mxnet nd中的asscalar() 向量转换为标量 转
  3. 这 100 个心理学知识你必须了解
  4. 黑苹果没有找到触控板为什么还是能用_为什么Macbook触控板体验领先Windows那么多,却难以取代鼠标?...
  5. 查询去重_如何在 1 秒内做到大数据精准去重?
  6. python flask框架教程_Flask框架从入门到实战
  7. TensorFlow 教程 --新手入门--1.2 下载安装
  8. 停下来,等等灵魂(三)
  9. BP网络算法及其改进
  10. python 立体匹配_手写双目立体匹配 SGM 算法(下)
  11. 用 label 控制 Pod 的位置 - 每天5分钟玩转 Docker 容器技术(128)
  12. 利用Quartz2D--context绘制矩形
  13. 车联网在智慧城市中的发展与应用
  14. 【Other】千字文 硬笔 楷书 字帖
  15. HDU 1069 DP
  16. [附源码]JAVA+ssm计算机毕业设计高校请假管理系统(程序+Lw)
  17. 测试微信号连接的开发的步骤
  18. java 只有try 不catch_Java异常处理只有Try-Catch吗?
  19. html5文档样式,jQuery HTML5文件上传美化插件jQuery.filer
  20. 由开发者的人品问题领略测试人员的人品问题

热门文章

  1. Ubuntu中安装微信(wechat)
  2. Matplotlib调整字体大小
  3. 使用 Metasploit 利用 MySQL 默认空密码或弱密码漏洞 (CVE-2002-1809, CNNVD-200212-263, CVE-1999-0502)
  4. 如何查看JDK版本信息
  5. FANUC机器人系统知识学习
  6. Java开发微信支付实践
  7. Win7+OpenCV2.4.10+VS2010安装教程
  8. 软件实施工程师到底是做什么的?
  9. 旧计算机 云桌面,切换桌面(云桌面切换到自己电脑)
  10. Boot Camp 驱动