精华内容
下载资源
问答
  • 时序数据分析方法综述,很好的资料! 时序数据分析方法综述,很好的资料!
  • 时序数据分析法综述

    2021-01-20 18:26:19
    时序数据分析法综述
  • 本人时序数据分析学习分享
  • 行业资料-电子功用-基于时序数据分析的电泵井故障实时诊断系统.pdf
  • 根据时序数据的特性不同移动平均法可分为三类: 简单移动平均 直接上例子  移动项数k即为从第一项开始k每隔k项相加,然后相加所得的值除以k就得到了新的时间序列,22=5+7+10得到三项移动的平均值为7.33。有...

    移动平均法

    移动平均法是指上是对变量值进行平均的方法而已,即对原时间序列数据进行修正,从而消除季节变动和个别不规则变动对整体数据的影响。根据时序数据的特性不同移动平均法可分为三类:

    简单移动平均

    直接上例子

     移动项数k即为从第一项开始k每隔k项相加,然后相加所得的值除以k就得到了新的时间序列,22=5+7+10得到三项移动的平均值为7.33。有以上例子可以看出,简单的移动平均可以消除个别例外数值对整个数据的趋势。该移动平均方法首先要确定移动项数k,其实k值越大修匀效果越好,但是对于数据量比较少的时候应该权衡k值与数据总个数之间合理性。

    如果某个数据具有周期性的变化,应该以周期长度作为移动项数,例如季度数据就应该以4为移动项数,以消除不同季度对整体数据的影响,若为星期数据,就应该以7为移动项数。另外为了数据的连续性和完整性,k的选取也有讲究,若原数据总项数为奇数,那么k也应该取奇数,偶数亦然。这样可以保证所形成的的新的平均数据序列每条数据都是k项相加求平均而来。当然若不按照以上方法确定k也不会对数据整体走势有很大的影响,只是在新数列的首尾两项会存在不合理的现象,数据足够多的情况下可以直接删除首位两项。

    简单的移动平均法一般只是使用与具有直线走势的时间数列。

    加权移动平均法

    该中移动平均方法可以理解为在简单移动平均方法基础之上于k项求和时做一个加权求和的操作。

    图中49=5+7*2+10*3,原数列乘以权重后得到三项移动的总和值,再取平均即为8.17。

    那么为什么要这么做呢?原因是,在很多情况下,当前数值 x 受 x_{t} 的影响要大于x_{t-1},x_{t-2}, 而 x_{t-1} 又要大于x_{t-2},所以就形成了以上权值相加的局面。权值大小的定义需要根据应用场景的不同做调整,但是只要涉及到因为时序数据先后关系影响到当前时序数据值时应该考虑到用加权移动平均的方法。如果你只知道权值在近期数据要大一些,远期数据要小一些,并不知道这权值到底如何进行分配,那么请看一下的指数平滑法。

    指数平滑法

    指数平滑法是加权移动平均法的一种特殊情形。只选择一个权数,即最近时期观测值得权数,其它时期数据值的权数可以自动推算出来,观测值离预测时期越远,它的权数就越小。模型如下:

    现有三个时期的数据y1,y2,y3,来说明任意时期的指数平滑法的预测值。同样也是时间数列以前所有时期值得加权平均数。

     个人觉得该种方法必须牢记一点\widehat{Y}_{i+1}=\alpha Y_i+(1-\alpha )\widehat{Y}_i,即当前项的预测值为前一时刻实际值乘以平滑系数,然后加上前一个时刻的预测值乘以阻尼系数。上面我们看到对 \widehat{Y}_4 预测期望值的所有参数之和为1,即\alpha +\alpha (1-\alpha )+(1-\alpha )^2=1

    以下是查阅资料后平滑系数取值与整体数据变化趋势之间大致的一个对应关系,仅供参考。

    1、当时间序列呈现较稳定的水平趋势时,应选较小的α值,一般可在0.05~0.20之间取值;

    2、当时间序列有波动,但长期趋势变化不大时,可选稍大的α值,常在0.1~0.4之间取值;

    3、当时间序列波动很大,长期趋势变化幅度较大,呈现明显且迅速的上升或下降趋势时,宜选择较大的α值,如可在0.6~0.8间选值,以使预测模型灵敏度高些,能迅速跟上数据的变化;

    4、当是上升(或下降)的发展趋势类型,α应取较大的值,在0.6~1之间。

    综上所述,移动平均法比较适用于具有长期趋势数据的分析。所以当遇到长期的、具有周期性或者不规律的数据走向时可以考虑采用移动平均法。

     

    展开全文
  • 行业资料-电子功用-基于时序数据分析的电泵井故障实时诊断系统及方法.pdf
  • python时序数据分析--以示例说明

    千次阅读 2017-05-09 21:46:00
    Python时间序列数据分析--以示例说明 标签(空格分隔): 时间序列数据分析 本文的内容主要来源于博客:本人做了适当的注释和补充。 ... ...

    Python时间序列数据分析--以示例说明

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


    本文的内容主要来源于博客:本人做了适当的注释和补充。
    https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/ 英文不错的读者可以前去阅读原文。

    在阅读本文之前 ,推荐先阅读:http://www.cnblogs.com/bradleon/p/6827109.html

    导读

    本文主要分为四个部分:

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

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

    第一步:导入常用的库

    import pandas as pd
    import numpy as np
    import matplotlib.pylab as plt
    from matplotlib.pylab import rcParams
    #rcParams设定好画布的大小
    rcParams['figure.figsize'] = 15, 6

    第二步:导入时序数据
    数据文件可在github:
    http://github.com/aarshayj/Analytics_Vidhya/tree/master/Articles/Time_Series_Analysis 中下载

    data = pd.read_csv(path+"AirPassengers.csv")
    print data.head()
    print '\n Data types:'
    print data.dtypes

    运行结果如下:数据包括每个月对应的passenger的数目。
    可以看到data已经是一个DataFrame,包含两列Month和#Passengers,其中Month的类型是object,而index是0,1,2...
    filelist

    第三步:处理时序数据
    我们需要将Month的类型变为datetime,同时作为index。

    dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
    #---其中parse_dates 表明选择数据中的哪个column作为date-time信息,
    #---index_col 告诉pandas以哪个column作为 index
    #--- date_parser 使用一个function(本文用lambda表达式代替),使一个string转换为一个datetime变量
    data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'], index_col='Month',date_parser=dateparse)
    print data.head()
    print data.index

    结果如下:可以看到data的index已经变成datetime类型的Month了。
    filelist
    filelist

    2.怎样检查时序数据的稳定性(Stationarity)

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

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

    1. 常量的均值
    2. 常量的方差
    3. 与时间独立的自协方差

    用图像说明如下:

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

    2. python判断时序数据稳定性

    有两种方法:
    1.Rolling statistic-- 即每个时间段内的平均的数据均值和标准差情况。

    1. Dickey-Fuller Test -- 这个比较复杂,大致意思就是在一定置信水平下,对于时序数据假设 Null hypothesis: 非稳定。
      if 通过检验值(statistic)< 临界值(critical value),则拒绝null hypothesis,即数据是稳定的;反之则是非稳定的。
    from statsmodels.tsa.stattools import adfuller
    def test_stationarity(timeseries):
        
        #这里以一年为一个窗口,每一个时间t的值由它前面12个月(包括自己)的均值代替,标准差同理。
        rolmean = pd.rolling_mean(timeseries,window=12)
        rolstd = pd.rolling_std(timeseries, window=12)
        
        #plot rolling statistics:
        fig = plt.figure()
        fig.add_subplot()
        orig = plt.plot(timeseries, color = 'blue',label='Original')
        mean = plt.plot(rolmean , color = 'red',label = 'rolling mean')
        std = plt.plot(rolstd, color = 'black', label= 'Rolling standard deviation')
        
        plt.legend(loc = 'best')
        plt.title('Rolling Mean & Standard Deviation')
        plt.show(block=False)
        
        
        #Dickey-Fuller test:
        
        print 'Results of Dickey-Fuller Test:'
        dftest = adfuller(timeseries,autolag = 'AIC')
        #dftest的输出前一项依次为检测值,p值,滞后数,使用的观测数,各个置信度下的临界值
        dfoutput = pd.Series(dftest[0:4],index = ['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical value (%s)' %key] = value
        
        print dfoutput
        
    ts = data['#Passengers']
    test_stationarity(ts)

    结果如下:
    1037438-20170509173335269-842159812.png

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

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

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

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

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

    ts_log = np.log(ts)
    1. 检测和去除趋势
      通常有三种方法:

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

    本文主要使用平滑方法

    Moving Average--移动平均

    moving_avg = pd.rolling_mean(ts_log,12)
    plt.plot(ts_log ,color = 'blue')
    plt.plot(moving_avg, color='red')

    1037438-20170509195439535-1732532609.png
    可以看出moving_average要比原值平滑许多。

    然后作差:

    ts_log_moving_avg_diff = ts_log-moving_avg
    ts_log_moving_avg_diff.dropna(inplace = True)
    test_stationarity(ts_log_moving_avg_diff)

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

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

    # halflife的值决定了衰减因子alpha:  alpha = 1 - exp(log(0.5) / halflife)
    expweighted_avg = pd.ewma(ts_log,halflife=12)
    ts_log_ewma_diff = ts_log - expweighted_avg
    test_stationarity(ts_log_ewma_diff)

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

    1. 检测和去除季节性
      有两种方法:

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

    Differencing--差分

    ts_log_diff = ts_log - ts_log.shift()
    ts_log_diff.dropna(inplace=True)
    test_stationarity(ts_log_diff)

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

    3.Decomposing-分解

    #分解(decomposing) 可以用来把时序数据中的趋势和周期性数据都分离出来:
    from statsmodels.tsa.seasonal import seasonal_decompose
    def decompose(timeseries):
        
        # 返回包含三个部分 trend(趋势部分) , seasonal(季节性部分) 和residual (残留部分)
        decomposition = seasonal_decompose(timeseries)
        
        trend = decomposition.trend
        seasonal = decomposition.seasonal
        residual = decomposition.resid
        
        plt.subplot(411)
        plt.plot(ts_log, label='Original')
        plt.legend(loc='best')
        plt.subplot(412)
        plt.plot(trend, label='Trend')
        plt.legend(loc='best')
        plt.subplot(413)
        plt.plot(seasonal,label='Seasonality')
        plt.legend(loc='best')
        plt.subplot(414)
        plt.plot(residual, label='Residuals')
        plt.legend(loc='best')
        plt.tight_layout()
        
        return trend , seasonal, residual

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

    #消除了trend 和seasonal之后,只对residual部分作为想要的时序数据进行处理
    trend , seasonal, residual = decompose(ts_log)
    residual.dropna(inplace=True)
    test_stationarity(residual)

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

    4. 对时序数据进行预测

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

    step1: 通过ACF,PACF进行ARIMA(p,d,q)的p,q参数估计

    由前文Differencing部分已知,一阶差分后数据已经稳定,所以d=1。
    所以用一阶差分化的ts_log_diff = ts_log - ts_log.shift() 作为输入。
    等价于\[y_t = Y_t-Y_{t-1}\]作为输入。

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

    #ACF and PACF plots:
    from statsmodels.tsa.stattools import acf, pacf
    lag_acf = acf(ts_log_diff, nlags=20)
    lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')
    #Plot ACF: 
    plt.subplot(121) 
    plt.plot(lag_acf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Autocorrelation Function')
    
    #Plot PACF:
    plt.subplot(122)
    plt.plot(lag_pacf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Partial Autocorrelation Function')
    plt.tight_layout()

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

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

    from statsmodels.tsa.arima_model import ARIMA
    model = ARIMA(ts_log, order=(2, 1, 0))  
    results_AR = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_AR.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_AR.fittedvalues-ts_log_diff)**2))

    1037438-20170509212810316-298413613.png
    图中,蓝线是输入值,红线是模型的拟合值,RSS的累计平方误差。

    模型2:MA模型(ARIMA(0,1,2))

    model = ARIMA(ts_log, order=(0, 1, 2))  
    results_MA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_MA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_MA.fittedvalues-ts_log_diff)**2))

    1037438-20170509212818238-1266198563.png

    模型3:ARIMA模型(ARIMA(2,1,2))

    model = ARIMA(ts_log, order=(2, 1, 2))  
    results_ARIMA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_ARIMA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))

    1037438-20170509213118972-2015134872.png
    由RSS,可知模型3--ARIMA(2,1,2)的拟合度最好,所以我们确定了最终的预测模型。

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

    
    #ARIMA拟合的其实是一阶差分ts_log_diff,predictions_ARIMA_diff[i]是第i个月与i-1个月的ts_log的差值。
    #由于差分化有一阶滞后,所以第一个月的数据是空的,
    predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
    print predictions_ARIMA_diff.head()
    #累加现有的diff,得到每个值与第一个月的差分(同log底的情况下)。
    #即predictions_ARIMA_diff_cumsum[i] 是第i个月与第1个月的ts_log的差值。
    predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum()
    #先ts_log_diff => ts_log=>ts_log => ts 
    #先以ts_log的第一个值作为基数,复制给所有值,然后每个时刻的值累加与第一个月对应的差值(这样就解决了,第一个月diff数据为空的问题了)
    #然后得到了predictions_ARIMA_log => predictions_ARIMA
    predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index)
    predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0)
    predictions_ARIMA = np.exp(predictions_ARIMA_log)
    plt.figure()
    plt.plot(ts)
    plt.plot(predictions_ARIMA)
    plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))

    1037438-20170510203917519-101063322.png

    5.总结

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

    本文结合一个例子,说明python如何解决:
    1.判断一个时序数据是否是稳定。对应步骤(1)

    1. 怎样让时序数据稳定化。对应步骤(2)
    2. 使用ARIMA模型进行时序数据预测。对应步骤(3,4)

    另外对data science感兴趣的同学可以关注这个网站,干货还挺多的。
    https://www.analyticsvidhya.com/blog/

    转载于:https://www.cnblogs.com/bradleon/p/6832867.html

    展开全文
  • 时序数据分析

    千次阅读 2018-12-23 21:20:51
    最近工作中遇到了时序预测问题,查询了部分博客找到部分特征工程的处理过程,感觉还可以分享一下: 参考地址:https://www.cnblogs.com/bradleon/p/6832867.html 原始数据的检测(波动,平稳性,周期,方差等)和...

    最近工作中遇到了时序预测问题,查询了部分博客找到部分特征工程的处理过程,感觉还可以分享一下:

    参考地址:https://www.cnblogs.com/bradleon/p/6832867.html

    原始数据的检测(波动,平稳性,周期,方差等)和时间序列的预测代码参考:https://blog.csdn.net/qq_33472765/article/details/85226361

    时间序列问题的特征工程(四个方向)参考:https://yq.aliyun.com/ziliao/417651


    本文的内容主要来源于博客:本人做了适当的注释和补充。
    https://www.analyticsvidhya.com/blog/2016/02/time-series-forecasting-codes-python/ 英文不错的读者可以前去阅读原文。

    在阅读本文之前 ,推荐先阅读:http://www.cnblogs.com/bradleon/p/6827109.html

    导读

    本文主要分为四个部分:

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

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

    第一步:导入常用的库

    import pandas as pd
    import numpy as np
    import matplotlib.pylab as plt
    from matplotlib.pylab import rcParams
    #rcParams设定好画布的大小
    rcParams['figure.figsize'] = 15, 6

    第二步:导入时序数据
    数据文件可在github:
    http://github.com/aarshayj/Analytics_Vidhya/tree/master/Articles/Time_Series_Analysis 中下载

    data = pd.read_csv(path+"AirPassengers.csv")
    print data.head()
    print '\n Data types:'
    print data.dtypes

    运行结果如下:数据包括每个月对应的passenger的数目。
    可以看到data已经是一个DataFrame,包含两列Month和#Passengers,其中Month的类型是object,而index是0,1,2...
    filelist

    第三步:处理时序数据
    我们需要将Month的类型变为datetime,同时作为index。

    dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
    #---其中parse_dates 表明选择数据中的哪个column作为date-time信息,
    #---index_col 告诉pandas以哪个column作为 index
    #--- date_parser 使用一个function(本文用lambda表达式代替),使一个string转换为一个datetime变量
    data = pd.read_csv('AirPassengers.csv', parse_dates=['Month'], index_col='Month',date_parser=dateparse)
    print data.head()
    print data.index

    结果如下:可以看到data的index已经变成datetime类型的Month了。
    filelist
    filelist

    2.怎样检查时序数据的稳定性(Stationarity)

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

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

    1. 常量的均值
    2. 常量的方差
    3. 与时间独立的自协方差

    用图像说明如下:

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

    2. python判断时序数据稳定性

    有两种方法:
    1.Rolling statistic-- 即每个时间段内的平均的数据均值和标准差情况。

    1. Dickey-Fuller Test -- 这个比较复杂,大致意思就是在一定置信水平下,对于时序数据假设 Null hypothesis: 非稳定。
      if 通过检验值(statistic)< 临界值(critical value),则拒绝null hypothesis,即数据是稳定的;反之则是非稳定的。
    from statsmodels.tsa.stattools import adfuller
    def test_stationarity(timeseries):
        
        #这里以一年为一个窗口,每一个时间t的值由它前面12个月(包括自己)的均值代替,标准差同理。
        rolmean = pd.rolling_mean(timeseries,window=12)
        rolstd = pd.rolling_std(timeseries, window=12)
        
        #plot rolling statistics:
        fig = plt.figure()
        fig.add_subplot()
        orig = plt.plot(timeseries, color = 'blue',label='Original')
        mean = plt.plot(rolmean , color = 'red',label = 'rolling mean')
        std = plt.plot(rolstd, color = 'black', label= 'Rolling standard deviation')
        
        plt.legend(loc = 'best')
        plt.title('Rolling Mean & Standard Deviation')
        plt.show(block=False)
        
        
        #Dickey-Fuller test:
        
        print 'Results of Dickey-Fuller Test:'
        dftest = adfuller(timeseries,autolag = 'AIC')
        #dftest的输出前一项依次为检测值,p值,滞后数,使用的观测数,各个置信度下的临界值
        dfoutput = pd.Series(dftest[0:4],index = ['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical value (%s)' %key] = value
        
        print dfoutput
        
    ts = data['#Passengers']
    test_stationarity(ts)

    结果如下:


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

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

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

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

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

    ts_log = np.log(ts)
    1. 检测和去除趋势
      通常有三种方法:

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

    本文主要使用平滑方法

    Moving Average--移动平均

    moving_avg = pd.rolling_mean(ts_log,12)
    plt.plot(ts_log ,color = 'blue')
    plt.plot(moving_avg, color='red')


    可以看出moving_average要比原值平滑许多。

    然后作差:

    ts_log_moving_avg_diff = ts_log-moving_avg
    ts_log_moving_avg_diff.dropna(inplace = True)
    test_stationarity(ts_log_moving_avg_diff)



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

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

    # halflife的值决定了衰减因子alpha:  alpha = 1 - exp(log(0.5) / halflife)
    expweighted_avg = pd.ewma(ts_log,halflife=12)
    ts_log_ewma_diff = ts_log - expweighted_avg
    test_stationarity(ts_log_ewma_diff)



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

    1. 检测和去除季节性
      有两种方法:

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

    Differencing--差分

    ts_log_diff = ts_log - ts_log.shift()
    ts_log_diff.dropna(inplace=True)
    test_stationarity(ts_log_diff)


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

    3.Decomposing-分解

    #分解(decomposing) 可以用来把时序数据中的趋势和周期性数据都分离出来:
    from statsmodels.tsa.seasonal import seasonal_decompose
    def decompose(timeseries):
        
        # 返回包含三个部分 trend(趋势部分) , seasonal(季节性部分) 和residual (残留部分)
        decomposition = seasonal_decompose(timeseries)
        
        trend = decomposition.trend
        seasonal = decomposition.seasonal
        residual = decomposition.resid
        
        plt.subplot(411)
        plt.plot(ts_log, label='Original')
        plt.legend(loc='best')
        plt.subplot(412)
        plt.plot(trend, label='Trend')
        plt.legend(loc='best')
        plt.subplot(413)
        plt.plot(seasonal,label='Seasonality')
        plt.legend(loc='best')
        plt.subplot(414)
        plt.plot(residual, label='Residuals')
        plt.legend(loc='best')
        plt.tight_layout()
        
        return trend , seasonal, residual


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

    #消除了trend 和seasonal之后,只对residual部分作为想要的时序数据进行处理
    trend , seasonal, residual = decompose(ts_log)
    residual.dropna(inplace=True)
    test_stationarity(residual)



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

    4. 对时序数据进行预测

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

    step1: 通过ACF,PACF进行ARIMA(p,d,q)的p,q参数估计

    由前文Differencing部分已知,一阶差分后数据已经稳定,所以d=1。
    所以用一阶差分化的ts_log_diff = ts_log - ts_log.shift() 作为输入。
    等价于

    yt=Yt−Yt−1

    作为输入。

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

    #ACF and PACF plots:
    from statsmodels.tsa.stattools import acf, pacf
    lag_acf = acf(ts_log_diff, nlags=20)
    lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')
    #Plot ACF: 
    plt.subplot(121) 
    plt.plot(lag_acf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Autocorrelation Function')
    
    #Plot PACF:
    plt.subplot(122)
    plt.plot(lag_pacf)
    plt.axhline(y=0,linestyle='--',color='gray')
    plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
    plt.title('Partial Autocorrelation Function')
    plt.tight_layout()


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

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

    from statsmodels.tsa.arima_model import ARIMA
    model = ARIMA(ts_log, order=(2, 1, 0))  
    results_AR = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_AR.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_AR.fittedvalues-ts_log_diff)**2))


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

    模型2:MA模型(ARIMA(0,1,2))

    model = ARIMA(ts_log, order=(0, 1, 2))  
    results_MA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_MA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_MA.fittedvalues-ts_log_diff)**2))

    模型3:ARIMA模型(ARIMA(2,1,2))

    model = ARIMA(ts_log, order=(2, 1, 2))  
    results_ARIMA = model.fit(disp=-1)  
    plt.plot(ts_log_diff)
    plt.plot(results_ARIMA.fittedvalues, color='red')
    plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))


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

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

    
    #ARIMA拟合的其实是一阶差分ts_log_diff,predictions_ARIMA_diff[i]是第i个月与i-1个月的ts_log的差值。
    #由于差分化有一阶滞后,所以第一个月的数据是空的,
    predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
    print predictions_ARIMA_diff.head()
    #累加现有的diff,得到每个值与第一个月的差分(同log底的情况下)。
    #即predictions_ARIMA_diff_cumsum[i] 是第i个月与第1个月的ts_log的差值。
    predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum()
    #先ts_log_diff => ts_log=>ts_log => ts 
    #先以ts_log的第一个值作为基数,复制给所有值,然后每个时刻的值累加与第一个月对应的差值(这样就解决了,第一个月diff数据为空的问题了)
    #然后得到了predictions_ARIMA_log => predictions_ARIMA
    predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index)
    predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0)
    predictions_ARIMA = np.exp(predictions_ARIMA_log)
    plt.figure()
    plt.plot(ts)
    plt.plot(predictions_ARIMA)
    plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))

    5.总结

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

    本文结合一个例子,说明python如何解决:
    1.判断一个时序数据是否是稳定。对应步骤(1)

    1. 怎样让时序数据稳定化。对应步骤(2)
    2. 使用ARIMA模型进行时序数据预测。对应步骤(3,4)

    另外对data science感兴趣的同学可以关注这个网站,干货还挺多的。
    https://www.analyticsvidhya.com/blog/

    展开全文
  • 数据分析技术-时序模式数据处理与分析
  • python 时序数据分析

    千次阅读 2017-05-16 20:34:04
    时序数据有四种主要的组成方式 1.trend 趋势: 可以是线性的也可以是非线性的,但可以研究其参数 2. seasonality 季度变化:可以是加法型的,也可以是乘法型的 3. noise 噪音:噪音一般都是数据中的一段,所以找到...

    时序数据有四种主要的组成方式

    1.trend 趋势: 可以是线性的也可以是非线性的,但可以研究其参数

    2. seasonality 季度变化:可以是加法型的,也可以是乘法型的

    3. noise 噪音:噪音一般都是数据中的一段,所以找到方法来减小噪音是分析过程的关键

    4. 其他:例如意外值,缺失值等等


    有这四种成分,我们可以得到分析时间序列的方法

    描述:用这四种成分来描述一段数据

    预测:预测未来的数据

    控制:为了得到某个制定的数据,监控一个数据过程


    对于实际数据采集的要求

    1. 数据点需要等时间间隔的采集: 如果采集的点有缺失,或者不是等时间间隔的,则需要改正数据,重新采集

    2. 数据点要超过50:可能一些经济学上的数据大致在12 个这样,但一个系列的数不能只有3,4个

    3.这一系列的数据平稳,没有趋势,季度变化和噪音:有些实际的数据可能要去除趋势和季度变化


    平滑Smooth

    平滑用于去噪声

    去噪的方法有很多,在实验数据采集里可以选择很多的点,来减少噪声,但在很多经济现象中数据量是一定的,所以需要平滑数据

     1.    窗口取平均: Xi点的平滑后的Si  Si=( Xi-k+...+Xi+k)/2K+1

    2.    si=(wi-k *Xi-k+....wi+k*Xi+k)  其中的wi-k+...wi+k=1

    3.    weight 可以用高斯方程来代替

    f(x,a)=exp(-(x/a)^2)/(2*pi*a^2)^1/2 ,其中的a是指方差系数

    python:

    filt=gaussian(31,4)//filt

    filt/=sum(filt)

    padded=concatenate((data[0]*ones(31//2),data,data[n-1]*ones(31//2)))

    smooth =convolve(padded, filt, mode='solid')


    指数平滑法

    单指数平滑:对于没有趋势和季度变化的数据集   Si=aXi+(1-a)Si-1    ,   Xi+h=Si

    双指数平滑:对于有趋势但没有季度变化的数据集     Si=aXi+(1-a)(Si-1 +ti-1)

                                                                                                  ti=B(Si-Si-1)+(1-B)ti-1      Xi+h=Si+hti

    Holt-winter三指数平滑:对于既有趋势也有季度变化的数据集









    展开全文
  • 时序数据处理应用于物联网、车联网、工业互联网领域的过程数据采集、过程控制,并与过程管理建立一个数据链路,属于工业数据治理的新兴领域。从工具维度看,时序数据处理工具与传统时序数据库的差异很...
  • 时序数据库分析

    千次阅读 2017-10-25 09:06:07
    本文会从时序数据库的基本概念、使用场景、解决的问题一一展开,最后会从如何解决时序数据存储这一技术问题入手进行深入分析。 1. 背景 百度无人车在运行时需要监控各种状态,包括坐标,速度,方向,温度,...
  • UCR时序数据

    2019-05-07 23:05:35
    本资源为最新UCR时序数据集,包括128个时序数据时序数据是指时间序列数据。时间序列数据是同一统一指标按时间顺序记录的数据列。在同一数据列中的各个数据必须是同口径的,要求具有可比性。时序数据可以是时期数,...
  • 作者:Chris St. Jeor &...这篇文章将围绕如何构建一个时间序列模型,并将列举三个基本步骤:使数据平稳,选择正确的模型,以及评估模型的准确性。本篇文章所使用的历史页面视图数据示例来源于一家大型汽车营销公司。...
  • 作者:飞浪feilang图片来源于网络1. 准备工作tushare是一个第三方财经数据接口包,需要安装包并完成注册。安装tushare包pipinstalltus...
  • 随着工业物联网的快速发展,工业企业...时序数据管理主要通过对时序数据的采集、存储、查询、处理和分析帮助企业实时监控企业的生产与经营过程。 时序数据在应用上特点也很明显,比如数据往往只保留一定时长,需要做降
  • 基于时序数据挖掘的航班延误预测分析.pdf
  • 以安徽淮南顾桥矿为研究对象,基于2007—2018年Landsat NDVI时间序列数据的分级统计,以及热点分析、聚类与异常值分析和剖面线分析,研究NDVI值的时空变化特征,探讨煤矿开采沉陷对周围植被的扰动效应。研究表明:...
  • 人大版,白皮,时间序列分析-基于R的数据,非常有用。
  • #资源达人分享计划#
  • 时序分析与sas应用

    2014-09-18 08:58:12
    电子书,详细叙述了时序分析与使用sas程序编写
  • 以进行主成分分析,需要将不同时点数据整合未统一的立体时序数据表,而后用经典主成分分析法进行分析,即分两步分析。 第一步:对数据作标准化处理 主要是采用0-1标准化处理方式 目的:去除量纲,减小误差。原理...
  • 借助函数型数据分析的方法和思想,在一个一般性的框架下讨论对猪肉链时序数据的聚类问题,提出了函数型聚类分析在食品追溯时序数据分析上的应用方法:把时序数据看成一个完整的关于时间的函数对象,而非个体观测值的...
  • ARMA 和 ARIMA的全面论述,专业、细致,非常有用
  • 数据挖掘中适用于分类的时序数据特征提取方法.pdf
  • 时序数据分析主要采用________分析建模以便对未来进行预测。 得分/总分 A. 回归 B. 多分类 C. 二分类 D. 聚类 正确答案:A你没选择任何选项 2单选(1分) 语音识别采用一种特殊的________数据处理技术。 得分/总分 A. ...
  • 针对疑似跌倒行为在跌倒监测中经常造成误报的问题,提出了一种基于时间序列分析异常数据的跌倒监测方法。该方法对手机加速度信号进行时间序列分析,通过计算相邻时间窗口之间的相关系数来检测异常数据,利用分类器...
  • 应用深度学习技术方法分析时序数据
  • 在诸多时序数据分类算法中,有一类算法借助时序数据的局部特征对时序数据进行分类,它们取得了不错的分类结果,然而其时间复杂度以及分类精度依旧存在可见的提升空间.本文提出的微局部特征二分类算法,着眼于局部...
  • 提出一种带有同步预测的时序数据融合算法,利用多分辨率分析特性对采集的原始数据进行预处理,挖掘反映人体生理状态的本质特征,进而采用同步预测机制在感知节点和汇聚节点处分别建立轻量级预测模型,消除网内冗余...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,976
精华内容 30,790
关键字:

时序数据分析