您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 时间序列分析
  所属分类: 算法与数据结构
  开发工具:
  文件大小: 2mb
  下载次数: 0
  上传时间: 2019-03-05
  提 供 者: van****
 详细说明:python时间序列分析2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 1.均值 X staticnary series Non-stationary serles Ⅹ是时序数捱的值,t是时间。可以看到左图,数据的均值对于时间轴来说是常量,即数据的均值 不是时间的函数所有它是稳定的;右图随着时间的推移,数捱的值整体趋势是增加的,所有均 值是时间的函数,数据具有趋势,所以是非稳定的 2.方差 X tationary series Non-Stationary series 可以看到左图,数据的方差对于时间是常量,即数据的值域围绕着均值上下波动的振幅是固定 的,所以左图数据是稳定的。而右图,数据的振幅在不同时间点不同,所以方差对于时间不是独 立的,数据是非稳定的。但是左、右图的均值是一致的。 3.自协方差 X Stationary series Non-Stationary series 个时序数据的自协方差,就是它在不同两个时刻j的值的协方差。可以看到左图的自协方差于 时间无关;而右图,随着时间的不同,数据的波动频率明显不同,导致它i,j取值不同,就会得 到不同的协方差,因此是非稳定的。虽然右图在均值和方差上都是与时间无关的,但仍是非稳定 数据。 2. python判断时序数据稳定性 有两种方法 1 Rolling statistic-即每个时间段内的平均的数据均值和标准差情况。 1. Dickey- Fuller Test--这个比较复杂,大致意思就是在一定置信水平下,对于时序数据假设 Null hy pothesis:非稳定 if诵过检验值( statistic)<临界值( critical value),则拒绝 null hypothesis,即数据是稳定 的;反之则是非稳定的 rom statsmdels tsa st att:ol s import adf:iller def teat stationarity(timeseries) 这里以一年为一个窗口,每一个时间t的值由它前面12个月(包括自己)的均值代替,标准差同理。 https://www.cnblogs.com/bradleon/p/6b32867.html 3/16 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 tig. add subp⊥o=( l-.plo=(timeseries, color blue label-Criginal' an=p1=.p⊥o=( rodman,co⊥or='red';⊥abe⊥='c-⊥ ing mear std plt p_ot (rols-d, color ='black', label= 'Rolling standard deviatior plt. legend(-oc =best) plt title('Rolling Mean Standard Deviation) plt. showiblosk=false) #Dickey-Ful er test print 'Resl: ts of Dickay-Fnller Test: ditest adfuller (timeseries, autolac ='AICT # detest的输出前一项依次为检测值,p值,滞后数,使用的观测数,各个置信度下的临界值 dEcutput pd Series(detect[0: 4], index =[ Teat statistic,'p-value'r'#Lacs used Nimber of observat i ans tised]) for key, value ir. df=est[ 4]. items(): dfoutput['CriticdI value (s)keyl ts= datd['#Pdssengers'I test stationarity i 结果如下 J00 Rolling Mean standard Deviation origina rol ing mean Hol ling standard deviation 500 195 ResuLts of Dickey- Fuller Test Test statistic 0.815369 p-vaLI fLacs used 13. 090009 Numer of observations Used 130, 000000 Critical value 5%5 2.884042 critical yalue 1% 3,81682 Critical value 10%) 2.57877Q 可以看到,数据的 rolling均值/标准差具有越来越大的趋势,是不稳定的。 且DF-tes可以明确的指出,在任何旹信度下,数据都不是稳定的 3.让时序数据变成稳定的方法 让数据变得不稳定的原因主要有俩 1.趋势(trenσ)-数据随着时间变化。比如说升高或者降低。 2.季节性( seasonality)-数据在特定的时间段内变动。比如说节假日,或者活动导致数据的异第 由于原数据值或范围比较大,为了缩小值域,同时保留其他信息,常用的方法是对数化,取log。 te log- np. log(ts) 1.检测和去除趋势 通常有三种方法 聚合:将时间轴缩短,以一段时间内星期/月/年的均值作为数据值。使不同时间段内的 值差距缩小。 https://www.cnblogs.com/bradleon/p/6b32867.html 4/16 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 ·平滑:以一个滑动窗口内的均值代替原来的值,为了使值之间的差距缩 多项式过滤:用—个回归模型来拟合现有数据,使得数据更平滑。 本文主要使用平滑方法 Moving average-移动平均 moving avg= pa rolling mean(ts Ioc,12) plt plct(ts lo plt. plct(movi d) 1949 1951 1957 可以看出 moving_average要比原值平滑许多 然后作差: aitt=ts⊥ ts log moving avg diff. dropna (inplace True) d deviati Rolling standard deviation -03 1950 1952 1954 1956 1958 Results of Dickey-FuLer Test Test statistic 3.162908 Used Number of observations Used 119.303000 Critical value (5% 2.B85151 Critical value (1) -3.485535 Criticalγ1ue(10吗3 2.573896 可以看到,做了处理之后的数据基本上没有了随时间变化的趋势, DEtest的结果告诉我们在95%的置 信度下,数据是稳定的。 上面的方法是将所有的时间平等看待,而在许多情况下,可以认为越近的时刻越重要。所以引入指数加 权移动平均-- Exponentially-weighted moving average.( pandas中通过ewma()函数提供了此 功能。) +ha11fe的值决定了衰减因子a1pha:a1pna=1-exp(1°g(0.5)/ha1=1ife https://www.cnblogs.com/bradleon/p/6b32867.html 16 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 s log ewma difi=ts log - expweichted av t Rol ing mean Standard Deviation 5 Original rolling mean Rolling standard deviation LO 1951 Results of Dickey Fuller Test: Test statis tlc 3,6日1262 p-value ,日5737 Used Number of obserations used 130, 000000 Critical value (5%g) 2.884642 Critical value (19 Critical value (104) 2.57R77 可以看到相比普通的 Moving average,新的数据平均标准差更小了。而且 DEtest可以得到结论:数 据在99%的置信度上是稳定的 1.检测和去除季节性 有两种方法 1差分化:以特定滞后数目的时刻的值的作差 ·2分解:对趋势和季节性分别建模在移除它们 Differencing-差分 3_10gd1ff= - s log shift( ta log dif=. drona (inplace=True) test stationarity(-s log diff) 03 Rolling Mean Standard Deviation 0.1 0.2 1951 Results of Dickey-Fuller Test: Test statist⊥c 2.717131 0,071121 芹 Lags Used 14000000 Number of Observations used Critical value(5% 2.884398 Critical va⊥ue(18) 3.482501 Crt主ca1 Value(10 2,578960 dtype: float64 如图,可以看出相比MA方法, Differencing方法处理后的数据的均值和方差的在时间轴上的振幅明显 https://www.cnblogs.com/bradleon/p/6b32867.html 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 缩小了。 DEtest的结论是在90%的置信度下,数据是稳定的 3. Dec 分解 分解( Ce composIng)可以用来把时序数据中的趋势和周期性数据都分离出来 Erom statsnodels. Lsd, seasonal i port seasonal_deccmpose def decompose(t-meseries) 返回包含三个部分 trend(趋势部分),ε eas ona1(季节性部分)和reε:dua1(残留邹分 decoinposi-ionl =seasonal decompose(timeseries) L-∈nd=deco! posit⊥or:. Erer: o seasonal=decomposition. season.al pLt. loti=s_⊥og,⊥abe⊥=' origina-') P dr label-'Trend' plt plot seasonal, label='seasorali=y' plt subplot (414) lt olot, label='Resicuals' return trend censoral, residual origina 5.0 1949 1 1953 1955 1957 Trend 643010 1951 1952 1954 1955 1956 1957 195E Seasonality 1949 1953 1955 1957 001 Residuals 0.15 1950 195? 1956 1957 如图可以明显的看到,将 orig inal数据拆分成了三份。 Trend数据具有明显的趋势性, Seasonality数 据具有明显的周期性, Residuals是剩余的部分,可以认为是去除了趋势和季节性数据之后,稳定的数 据,是我们所需要的 消除了 trend和aea3ona-之后,只对 residua1部分作为想雯旳时序数据进行处理 trend seasona, residual decompose(ts 1og) test stationarity( residual) https://www.cnblogs.com/bradleon/p/6b32867.html 7/16 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 Rolling mean standard deviation 0.05 0.00 0.05 0.10 Original rolling mean Rolling standard deviation 0.15 1950 19511952195319541955195619571958 Results ef Dickey-ruller Test Test statistic -6.33237e+b 2,88559e-gg #Lags used 9.器器e+ab Number of observations Uscd 1.2250:0c+4 Critical value (59) 2,885538e+ Critical value (1s 485122e+B6 Critical value (103: -2.575559e+B 如图所示,数据的均值和方差趋于常数,几乎无波动(看上去比之前的陡峭,但是要注意他的值域只有 [-0.05,0.05]之间),所以直观上可以认为是稳定的数据。另外 DEtest的结果显示, Statistic值原小于 1%时的 Critical value,所以在99%的置信度下,数据是稳定的, 4.对时序数据进行预测 假设经过处理,已经得到了稳定时序数据。接下来,我们使用 ARIMA模型 对数据已经预测。 ARIMA的介绍可以见本目录下的另一篇文章 step1:通过ACF,PACF进行 ARIMA(p,d,q)的p,q参数估计 由前文 Differencing部分已知,一阶差分后数据已经稳定,所以d=1。 所以用一阶差分化的ts_log_dff= ts_log- ts_log. shift(作为输入 等价于 Y-Yt 作为输入。 先画出 ACF PACF的图像代码如下 fACF and PAF pats From statsmodels. tsa. stattoolc import acf, pacf diff nags= lag pacf pacf(ts log diff, rlaga=20, method=ola) plt subplot(121) plt axline(y-C, linestyle---, color-gray i plt axline(y-1.96/r.p sqrt(ler (ts log diff):, linestyle---, color-gray) p1t.LiL1e(′Au_ ocorre1aL⊥ on Funct⊥or:.) F⊥ DL FACE p⊥t. ashine(y=C,⊥ instyle=--',co⊥or=gray oIt axline(y---.95/np. scrtilen(ts log diff),linestyle-'--, colcr-'gray'i p⊥t. axline(y=1.96/rp.sqrt(⊥er.(ts⊥o3ditt)!,- instyle=--',co⊥ox='gay') plt title('Part:al Autocorrelation Function ' p⊥t. tight⊥ ayout() https://www.cnblogs.com/bradleon/p/6b32867.html 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 Autocorrelation function Partiel autocorrelation 0 图中,上下两条灰线之间是置信区间,p的值就是ACF第一次穿过上置信区间时的横轴值。q的值就是 PACF第一次穿过上置信区间的横轴值。所以从图中可以得到p=2,q=2 step2:得到参数估计值p,d,q之后,生成模型 ARIMA(p,d,q) 为了突出差别,用三种参数取值的三个模型作为对比 模型1:AR模型( ARIMA(21,0)) From statsmodels tsa arima model import ARIMA mcde⊥= ARIMA(ts⊥og, order=(∠,1,U) esults AR model. fitidisp=-1 plt plct(results AR. fit-edvalues, color='red') plt title('RSS:3.4f8 sum(iresul-s AR fittedvalues-ts log diff! *x2) Rss:1.5023 02 01 0.3 1951 1953 957 图中,蓝线是输入值,红线是模型的拟合值,RSS的累计平方误差。 模型2:MA模型( ARIMA(0,1,2)) (C;1,2)) es:ults MA- model. fitidisp--1 pIt plct(ts loc diff lt plct(results MA. fit-edvalues, color='red) plt title(RSS: 1f 3 sum(iresul-e MA. fitteavalues-ts log diff*x2) https://www.cnblogs.com/bradleon/p/6b32867.html 9/16 2018/12/7 python时序数据分析-以示例说玥-geek精神-博客园 R55:14721 03 02 00 .1 0.2 1951 1953 1955 模型3: ARIMA模型( ARIMAL(212) cde⊥= ARIMA(ts⊥oe, order=(z,1,2)) esults ARIMA - my p⊥t.pLct(ts⊥ oc it plt plct(results ARIMA. fittedvalues, color-red pLt.tite{"RSS:,4土客sum(resu⊥- S ARIMA. ittedvaljes-ts⊥cg_di土t)*x2) Rss:10292 00 0.1 1951 1953 1955 1957 由RSS,可知模型3- ARIMA(2,1,2)的拟合度最好,所以我们确定了最终的预测模型。 step3:将模型代入原数据进行预测 因为上面的模型的拟合偵是对原数据进行稳定化之后的输λ数据的拟合,所以需要刈拟合偵讲行相应处 理的逆操作,使得它回到与原数据一致的尺度。 ARIMA拟合的其实是一阶差分ts-0gcff, predictions AR-Mc:ff[i是第i个月与i-1个月的ts1og的 差值 +由于差分化有一阶滞后,所以第一个月的数据是空的 predictions ARIMA diff pa Series(results ARIMA. fittedvalues, ccp=True) print predictions AFIMA diff head( 累加现有的ff,得到每个值与第一个月的差分(同1og底的情况下) 即 predicions ARIMA diff cumsum[i1是第i个月与第1个月的ts1oc的差值 predictions ARIMA diff cumsum predictions ARIMA dif=.c'amsum( 先t_1。 g diff=>ts_-og=>ts_cg=>ts 完以=s1o的第一个值作为基数,复制给所有值,然后每个时刻的值累加与第一个月对应的差值这样就解决了, 第一个月dE数据为空的问题了) +然后得到了 predictions ARTMA1ag=> predictiors ARTMA predictions ARIMA log pd Series(ta loc. ix[o], index=ts log index) prediction s ARTMa predictions ARIMA log. add (predictions ARIMA diff cumsum, fill value=0 predictions ARTMA np exp(predictions ARTMA T og) plt plct(predictions ARIMA) pIt. title( RMSE:6.4f8I:p sgrt(sun ((predictio 1s ARIMA-ts)**2)/len(ts))) https://www.cnblogs.com/bradleon/p/6b32867.html 10/16
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 时间序列分析
 输入关键字,在本站1000多万海量源码库中尽情搜索: