澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:MA时间序列建模过程,大

我:个推大数据程序猿李树桓

在霎时,人工智能的浪潮席卷而来。从AlphaGo、无人开车手艺、人脸识别、语音对话,到杂货店推荐系统,金融业的风控,量化运行、用户洞察、集团征信、智能投顾等,人工智能的利用布满渗透到各行各业,也让多少地法学家们难以为继。Python和PAJERO作为机器学习的主流语言,受到了越来越多的关心。数据学习园地的宿将们时一时不知情什么在二者之间做出选用,本文就语言特征与行使景况为大家对待深入分析。

那篇属于补充的内容,前段时间在参加天池口碑的客量预测竞赛,从诸几个人的结果看出,对于时间系列的猜想难题,一般的机器学习算法并未很占优势,奥迪Q5NN类的算法陶冶开支又太高,往往不可取,倒是守旧的时刻类别模型的职能较好,这里对此,实行一定的求学。内容来自互连网。

也总算笔者自身的笔记,都二〇一七年了,ARMA模型感到已经不适合时机了呢,用深度学习来预测的彰显是或不是越来越好,但是反正都商讨了一下了,就做个记录吧。

时光种类解析


运用软件为大切诺基studio,仿照效法CRAN中时间系列剖判剖判函数和package,拿手上的数码练习一下小时连串深入分析。

在霎时,人工智能的风潮席卷而来。从AlphaGo、无人驾乘本领、人脸识别、语音对话,到店铺推荐系统,金融业的风控,量化运维、用户洞察、集团征信、智能投顾等,人工智能的施用布满渗透到各行各业,也让数据科学家们青黄不接。Python和Wrangler作为机器学习的主流语言,受到了更进一步多的关切。数据学习世界的总主管们时不时不清楚怎么在二者之间做出取舍,本文就语言特征与使用状况为大家对待深入分析。

一.Python和福特Explorer的定义与特征

 

1.格外值和缺失值的拍卖

这纯属是数码深入分析时让全数人都头痛的难题。万分和缺点和失误值会损坏数据的分布,并且干扰剖析的结果,怎么管理它们是一门大学问,而我常有还没入门。

1、原始数据印证

慎选总是9天的数额,共2025条,时间间隔为5分钟。具体意况如下:
澳门新浦京娱乐场网站 1

一.Python和奥迪Q5的定义与特色

Python是一种面向对象、解释型免费开源高端语言。它效用强大,有活泼的社区补助和琳琅满指标类库,同一时间具有简洁、易读以及可扩展等优点,在近几年成为高人气的编制程序语言。

一、

(1)异常值

3 ways to remove outliers from your data提供了关于如何对时间系列数据开始展览特别值检验的艺术,小编以为移步中位数的法子最棒,代码如下:

from pandas import rolling_median
threshold = 3 #指的是判定一个点为异常的阈值
df['pandas'] = rolling_median(df['u'], window=3, center=True).fillna(method='bfill').fillna(method='ffill') 
#df['u']是原始数据,df['pandas'] 是求移动中位数后的结果,window指的是移动平均的窗口宽度
difference = np.abs(df['u'] - df['pandas'])
outlier_idx = difference > threshold

rolling_median函数详细表明参见pandas.rolling_median

2、平稳性查验

所谓平稳,是指因变量围绕着多个常数上下波动。更学术一点,便是是说计算性子(mean,variance,correlation等)不会随着岁月窗口的两样而变化。

Python是一种面向对象、解释型无需付费开源高档语言。它功用庞大,有外向的社区帮忙和有滋有味的类库,同期持有简洁、易读以及可扩展等优点,在近几年成为高人气的编制程序语言。

Python的优势:

看名就会猜到其意义,时间系列是光阴距离不改变的情况下搜集的时光点集结。这一个集中被剖判用来打听短时间发展趋势,为了预测现在要么变现分析的任何格局。不过是何等令时间种类与广泛的回归难题的区别?

(2)缺失值

缺点和失误值在DataFrame中显得为nan,它会导致ARMA不可能拟合,因而一定要拓展拍卖。
a.用连串的均值取代,那样的益处是在总计方差时候不会受影响。可是接连多少个nan不畏如此取代也会在差分时候重新成为nan,从而影响拟合回归模型。
b.直接删除。小编在诸多案例上见到那般的做法,可是当三个队列中间的nan太多时,小编一筹莫展鲜明那样的做法是或不是还创立。

2.1 时间体系可视化

因为有个别高阶函数只怕否精确地发出自家想要的图,所以自身这里用的是低阶图形命令手动设置label。首先把plot()函数里的暗中同意坐标轴关掉:xaxt='n',然后经过axis()函数手动增加坐标轴。代码如下:

plot(indata,type = "s",xaxt='n',xlab = "time")
axis(1,c(1,226,451,676,901,1126,1351,1576,1801),c('5:00','5:00','5:00','5:00','5:00','5:00','5:00)

变迁图形如下:
澳门新浦京娱乐场网站 2
由上海教室可见:

  1. 该时间种类存在很强的周期性
  2. 该时间类别是和睦的。
    还足以用xts函数把原有数据转变到时间连串,也正是把给各种数据对应上多个时间点,代码如下

    data_1<-xts(indata_1,seq(ISOdate(0, 0, 0, 5, 0, 0),ISOdate(0, 0, 0, 23, 40, 0),by="5 mins")) plot(data_1)

澳门新浦京娱乐场网站 3
进而绘制每日的箱型图,代码如下:

library(ggplot2)
ggplot(data,aes(x=factor(STATDATE),y=INDATA))   geom_boxplot()

澳门新浦京娱乐场网站 4
由上海体育地方可见:

  1. 周天的可怜点较少,平常的不得了点较多,表达日常设有山上情状。

Python的优势:

1、Python的行使情况诸多,不唯有和RAV4同样能够用来计算分析,更普及应用于系统一编写程、图形管理、文本管理、数据库编制程序、互联网编制程序、Web编制程序、互连网爬虫等,非常适合那贰个想深刻研究数据分析也许利用总结本领的技术员。

 

2.平稳性查证

队列平稳性是开展时间连串深入分析的前提条件,首倘若使用ADF核实。

from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
    dftest = adfuller(timeseries, autolag='AIC')
    return dftest[1]
    #此函数返回的是p值

adfuller函数详细表明参见statsmodels.tsa.stattools.adfuller

2.2 自相关和偏自相关图

除此以外,还足以由此自有关和偏自相关图来推断时期体系是不是平安。平稳的行列的自相关图和偏相关图不是拖尾正是截尾。截尾是指在某阶之后,周到都为 0;拖尾是指有一个衰减的样子,可是不都为0。

ACF形状 模型
不衰减到0 不平稳
固定点上有大于0的值(周期性) 周期性
所有点都是0 完全随机(白噪声)
指数衰减到0(拖尾) AR(p)
正负交替衰减到0(拖尾) AR(p)
前几个大于0,后面都为0(截尾) MA(q)

绘制接纳LAND中acf(indata)函数(暗中同意滞后30阶)的自相关图和偏自相关图如下:
澳门新浦京娱乐场网站 5

澳门新浦京娱乐场网站 6
由上海体育场面可见:

  1. 自相关图渐渐衰减到0,存在拖尾性,偏自相关图在5阶后都为0,存在截尾性。表明该时间连串在短时间内(30阶)是协和时间种类。

虚构到落后阶数为30,而该原始数据的周期性恐怕要到225阶今后才干显示出来。设置自相关图的退化阶数为500,代码如下:

acf(indata,lag=500)
pacf(indata,lag=500)

澳门新浦京娱乐场网站 7
澳门新浦京娱乐场网站 8

1、Python的选用景况非常的多,不只有和奇骏同样能够用于总结分析,更遍布应用于系统一编写程、图形管理、文本管理、数据库编制程序、互联网编制程序、Web编制程序、互联网爬虫等,非常适合这一个想深切研究数据分析只怕应用总计技巧的程序猿。

2、近来主流的大数目和机械学习框架对Python都提供了很好的帮助,比方Hadoop、Spark、Tensorflow;同一时候,Python也不无庞大的社区辅助,特别是最近随着智能AI的起来,更多的开荒者活跃在Python的社区中。

有四个原因:

3.不牢固的处理

(1)对数管理。对数管理能够减小数指标不平静,由此不论第1步核查骑行列是或不是牢固,都最棒取二次对数。关于为啥总结、计量学家都爱好对数的因由,今日头条上也许有切磋:在计算学中为啥要对变量取对数?
(2)差分。一般的话,非纯随机的日子连串经一阶差分恐怕二阶差分之后就能变得安宁。这差分几阶合理吗?笔者的见识是:*在保证ADF检验的p<0.01的场所下,阶数越小越好*,不然会带来样本减弱、还原系列麻烦、预测困难的难题。——那是自己的直觉,还并未有翻动资料证实。基于那样的主张,构造了增选差分阶数的函数:

def best_diff(df, maxdiff = 8):
    p_set = {}
    for i in range(0, maxdiff):
        temp = df.copy() #每次循环前,重置
        if i == 0:
            temp['diff'] = temp[temp.columns[1]]
        else:
            temp['diff'] = temp[temp.columns[1]].diff(i)
            temp = temp.drop(temp.iloc[:i].index) #差分后,前几行的数据会变成nan,所以删掉
        pvalue = test_stationarity(temp['diff'])
        p_set[i] = pvalue
        p_df = pd.DataFrame.from_dict(p_set, orient="index")
        p_df.columns = ['p_value']
    i = 0
    while i < len(p_df):
        if p_df['p_value'][i]<0.01:
            bestdiff = i
            break
        i  = 1
    return bestdiff  

(3)平滑法。利用活动平均的艺术来管理数量,可能能够用来拍卖周期性因素,小编还没实施过。
(4)分解法。将时间体系分解成长时间趋势、季节趋势和任意成分,一样没实践过。
对于(3)(4),参见《python时间体系分析》或者Complete guide to create a Time Series Forecast (with Codes in Python)【翻译版《时刻种类预测全攻略(附带Python代码)》】

2.3 ADF单位根平稳型查验

单位根核实是指核准连串中是或不是存在单位根,因为存在单位根正是非平稳时间连串了。[百度完善]
此处使用tseries包中的adf.test()函数对9天数码开始展览单位根平稳性查证,结果如下:

adf.test(indata)

    Augmented Dickey-Fuller Test

data:  indata
Dickey-Fuller = -7.1486, Lag order = 12, p-value = 0.01
alternative hypothesis: stationary

aternative hypothesis称为备择假如,与原假设相对。这里备择要是是该时间系列平稳。因为p值小于0.05,拒绝原倘诺,接受备择要是,所以表明该时间种类是牢固的。
有意思的是,笔者独自拿一天的数据出来做单位根核算,能够开采该时间种类并不安定。

> adf.test(indata_1)

    Augmented Dickey-Fuller Test

data:  indata_1
Dickey-Fuller = -1.0092, Lag order = 6, p-value = 0.9351
alternative hypothesis: stationary

2、目前主流的大数据和机械学习框架对Python都提供了很好的匡助,譬喻Hadoop、Spark、Tensorflow;同临时候,Python也具有庞大的社区帮衬,非常是近年随着人工智能的勃兴,越多的开采者活跃在Python的社区中。

3、Python作为一种胶水语言,能够和任何语言连结在联名,举例您的总括剖判部分能够用PRADO语言写,然后装进为Python能够调用的扩展类库。

1、时间体系是跟时间关于的。所以基于线性回归模型的假诺:阅览结果是单独的在这种场馆下是不创造的。

4.随机性核算

除非时间连串不是四个白噪声(纯随机连串)的时候,该类别才可做深入分析。(参照他事他说加以调查自:《时光种类A安德拉IMA模型详解:python达成公司15日销售量预测》)

from statsmodels.stats.diagnostic import acorr_ljungbox
def test_stochastic(ts):
    p_value = acorr_ljungbox(ts, lags=1)[1] #lags可自定义
    return p_value

acorr_ljungbox函数详细表明参见statsmodels.stats.diagnostic.acorr_ljungbox

3、时间种类模型采用

3、Python作为一种胶水语言,能够和别的语言连结在联合,举例你的总计深入分析部分可以用大切诺基语言写,然后装进为Python能够调用的扩大类库。

R语言是一种用来进展多少查究、总计剖析和制图的解释型语言,但更像一种数学总结的条件。它模块丰盛,为数学计算提供了颇为有利的编制程序格局,极其是针对性矩阵的测算。

 

5.确定ARMA的阶数

ARMA(p,q)是AXC60(p)和MA(q)模型的组成,关于p和q的抉择,一种方法是观测自相关图ACF和偏相关图PACF, 另一种办法是经过借助AIC、BIC总计量自动分明。由于本人有几千个日子体系须要各自预测,所以采纳自动的不二秘技,而BIC能够使得应对模型的过拟合,由此选定BIC作为判定标准。

from statsmodels.tsa.arima_model import ARMA
def proper_model(data_ts, maxLag): 
    init_bic = float("inf")
    init_p = 0
    init_q = 0
    init_properModel = None
    for p in np.arange(maxLag):
        for q in np.arange(maxLag):
            model = ARMA(data_ts, order=(p, q))
            try:
                results_ARMA = model.fit(disp=-1, method='css')
            except:
                continue
            bic = results_ARMA.bic
            if bic < init_bic:
                init_p = p
                init_q = q
                init_properModel = results_ARMA
                init_bic = bic
    return init_bic, init_p, init_q, init_properModel

那个函数的法规是,依照设定的maxLag,通过循环输入p和q值,选出拟合后BIC最小的p、q值。
然而在statsmodels包里还也可能有更直接的函数:

import statsmodels.tsa.stattools as st
order = st.arma_order_select_ic(timeseries,max_ar=5,max_ma=5,ic=['aic', 'bic', 'hqic'])
order.bic_min_order

timeseries是待输入的时刻连串,是pandas.Series类型,max_armax_mapq值的最大备选值。
order.bic_min_order回来以BIC法规显著的阶数,是一个tuple类型

3.1 常用的大运种类模型

上面简要介绍下常用的小时类别模型:

  1. 活动平均(MA, moving average)
    MA(1): Yt=α0 α1ut−1 ut
MA(q): 
Yt=α0 α1ut−1 ... αqut−q ut
  1. 自回归模型(A中华V, Auto regresstion)
    AR(1):

    Yt=β0 β1Yt−1 ut

AR(p): 

Yt=β0 β1Yt−1 ... βpYt−p ut
  1. 自回归活动平均(ARMA)
    ARMA(p, q):

    Yt=β0 β1Yt−1 ... βpYt−p α1ut−1 ... αqut−q ut

  2. 差分自回归活动平均(A哈弗IMA)
    着眼时间体系是还是不是为平安。若为平稳类别,则用ARMA(p,q)模型;若为非平稳时间类别,则要先举行d阶差分运算后改为平稳时间类别,此处的d即为AEvoqueIMA(p,d,q)模型中的d。

奥迪Q5语言是一种用来拓展多少索求、计算解析和制图的解释型语言,但更像一种数学总括的意况。它模块丰盛,为数学总计提供了颇为便利的编制程序方式,特别是针对性矩阵的测度。

Enclave语言的优势:

2、随着上涨依旧下落的趋势,越多的小时类别出现季节性趋势的格局,如:特定期刻框架的切实变化。即:假如您看来羊毛夹克的出卖上升,你就自然会在冬辰做更加多出售。

6.拟合ARAM

from statsmodels.tsa.arima_model import ARMA
model = ARMA(timeseries, order=order.bic_min_order)
result_arma = model.fit(disp=-1, method='css')

ARMA函数详细表明参见statsmodels.tsa.arima_model.ARMA,.fit参见statsmodels.tsa.arima_model.ARMA.fit
对于差分后的年月类别,运用于ARMA时该模型就被叫作ARMIA,在代码层面改写为model = ARIMA(timeseries, order=(p,d,q)),然则实际,用差分过的系列直接进行ARMA建立模型更有利,之后增加一步还原的操作就可以。

3.2 时间系列模型选拔

自有关和偏自相关检查:
因为平稳的行列的自相关图和偏相关图不是拖尾就是截尾,所以可依照自相关和偏自相关图的截尾和拖尾来选取时间体系模型。

模型 ACF PACF
AR(p) 衰减趋于零(拖尾) p阶后截尾
MA(q) q阶后截尾 衰减趋于零(拖尾)
ARMA(p, q) q阶后衰减趋于零(拖尾) p阶后衰减趋于零(拖尾)

若都拖尾,获得ARMA(p,q)模型,自有关图有多少个在两倍规范差之外就能够鲜明p,偏自相关图优异两倍规范差的规定q。可用AIC和SBC准则推断获得的p和q参数值的上下,那多少个目的越小越好。
所幸,大切诺基语言的forecast包中提供的auto.arima()函数能够自行找到最优的p,q值,代码如下:

> library(forecast)
> auto.arima(indata,trace = T)

 ARIMA(2,0,2) with non-zero mean : 20160.45
 ARIMA(0,0,0) with non-zero mean : 24296.42
 ARIMA(1,0,0) with non-zero mean : 20279.09
 ARIMA(0,0,1) with non-zero mean : 22583.28
 ARIMA(0,0,0) with zero mean     : 26869.16
 ARIMA(1,0,2) with non-zero mean : 20157.5
 ARIMA(1,0,1) with non-zero mean : 20169.87
 ARIMA(1,0,3) with non-zero mean : 20159.35
 ARIMA(2,0,3) with non-zero mean : 20161.85
 ARIMA(1,0,2) with zero mean     : Inf
 ARIMA(0,0,2) with non-zero mean : 21739.44

 Best model: ARIMA(1,0,2) with non-zero mean 

Series: indata 
ARIMA(1,0,2) with non-zero mean 

Coefficients:
         ar1      ma1      ma2      mean
      0.9711  -0.2664  -0.0793  154.5767
s.e.  0.0058   0.0228   0.0208   17.3612

sigma^2 estimated as 1229:  log likelihood=-10075.54
AIC=20161.08   AICc=20161.11   BIC=20189.15
参数 含义
s.e.(SE) 系数的标准差
sigma^2 estimated 估计值方差
log likelihood 对数似然值

仍是能够用summary()函数对拟合结果开展描述统计,计算一些相对误差(Training set error measures:)。

> summary(auto.arima(indata))
Series: indata 
ARIMA(1,0,2) with non-zero mean 

Coefficients:
         ar1      ma1      ma2      mean
      0.9711  -0.2664  -0.0793  154.5767
s.e.  0.0058   0.0228   0.0208   17.3612

sigma^2 estimated as 1229:  log likelihood=-10075.54
AIC=20161.08   AICc=20161.11   BIC=20189.15

Training set error measures: ME     RMSE     MAE  MPE MAPE      MASE          ACF1
Training set:0.03822178 35.02654 25.4774 -Inf  Inf 0.9615727 -2.066828e-05
参数 含义
ME Mean Error
RMSE Root Mean Squared Error
MAE Mean Absolute Error
MPE Mean Percentage Error
MAPE Mean Absolute Percentage
MASE Mean Absolute Scaled Error

从上述结果能够看来,用来拟合那九天最优的模型是A昂CoraIMA(1,0,2) with non-zero mean。with non-zero mean是指常数项不为0,由此大家可以写出该ACR-VIMA模型的公式,如下:

Yt=154.5767 0.9711×Yt−1−0.2664×ut−1−0.0793×ut−2 ut

其中ut

、ut−1

、ut−2

都服从正态分布。

揽胜极光语言的优势:

1、本田CR-V语言具有多数清淡直观的图形,常见的数目可视化的工具包有:

 

7.预测的y值还原

既往亦可,归入模型举行拟合的多寡是透过对数或(和)差分管理的数据,因此拟合获得的前瞻y值要由此差分和对数还原才可与原观测值相比。
暂且写了对数管理过的苏醒:

def predict_recover(ts):
    ts = np.exp(ts)
    return ts

3.3 用模子来预测

在选用好模型后,大家得以行使该模型来做一些估量,例如预测现在一天(2二十五个时段)的多寡,代码如下:

fit<-auto.arima(indata)
forecast <- forecast.Arima(fit,h=225,level=c(99.5))
plot.forecast(forecast)

澳门新浦京娱乐场网站 9
图1 预测未来2贰十七个时段(1天)
澳门新浦京娱乐场网站 10
图2 预测今后7个时段
由图1和图2可见,A奇骏IMA模型仅能适用于长时间的估算(7个时刻),无法利用于深刻的展望(2贰十六个时段)。

1、Tiggo语言拥有众多雅淡直观的图片,常见的数量可视化的工具包有:

·         交互式图表rCharts、Plotly,交互时序图dygraphs,交互树状图TreeMap

常用的时日连串模型有ATiggo模型、MA模型、ARMA模型和ACR-VIMA模型等。

8.决断拟合优度

在本人读书计量管医学的时候,决断贰个模子拟合效果是用三个调动纳瓦拉方的目标,可是仿佛在机械学习世界,回归时常用RMSE(Root Mean Squared Error,均方根相对误差),也许是因为调度Rubicon方衡量的预测值与均值之间的差异,而RMSE衡量的是各个预测值与实际值的距离。《均方根值(RMS) 均方根固有误差(RMSE) 标准差(Standard Deviation)》、《(转)SSE,MSE,RMSE,R-square目的解说》提供了详尽公式。

train_predict = result_arma.predict()
train_predict = predict_recover(train_predict) #还原
RMSE = np.sqrt(((train_predict-timeseries)**2).sum()/timeseries.size)

· 交互式图表rCharts、Plotly,交互时序图dygraphs,交互树状图TreeMap

·     ggplot2-一个基于图形语法的绘图系统

 

9.预测以往的值

statsmodel本条包来进展前瞻,很离奇的是笔者一向没成功过,只好进展下一步(之后一天)的估量,多天的就不或者做到了。这里提供他们的代码,供大家自行试验,成功的话分明要留言教作者啊!跪谢。

predict_ts = result_arma.predict()

predict措施详细表达参见statsmodels.tsa.arima_model.ARMAResults.predict,反正笔者不太懂这些办法怎么使用……

还会有依据How to Create an ARIMA Model for Time Series Forecasting with Python,用来预测的代码是:

for t in range(len(test)):
    model = ARIMA(history, order=(5,1,0))
    model_fit = model.fit(disp=0)
    output = model_fit.forecast()
    yhat = output[0]
    predictions.append(yhat)
    obs = test[t]
    history.append(obs)
    print('predicted=%f, expected=%f' % (yhat, obs))

只是作者真正不懂,按她写forecast主意的方法,每一趟循环预测的都是history样本的下二个值,因此怎么着用这些轮回来预测history样本的未来,举个例子十二个值?纵然不用循环,直接令forecast中的参数steps=为要估量的时间长度,笔者也没成功……
forecast措施详细表达参见statsmodels.tsa.arima_model.ARIMAResults.forecast,
其它,Stackoverflow上的贰个解答:ARMA out-of-sample prediction with statsmodels,又给了壹人作品展望的写法。

· ggplot2-一个基于图形语法的绘图系统

·     lattice-ENCORE语言格子图形

一、时间体系的预管理

10. 更便于的年华连串包:pyflux

好在《AR、MA及ARMA模型》提到了python的另三个包pyflux,它的文书档案在PyFlux 0.4.0 documentation。那些包在macOS上安装在此之前需求设置XCode命令行工具:

xcode-select --install

还要它的图画须求安装一个seaborn的包(若无Anaconda则用pip的方式。《数量可视化(三)- Seaborn简易入门》简单介绍了seaborn,它是“在matplotlib的根基上开始展览了越来越尖端的API封装”。

conda install seaborn

自己用这一个包写了二个简单而完全的A翼虎IMA建立模型:

# -*- coding: utf-8 -*-
"""
Created on Tue Jan 31 14:13:58 2017
@author: 竹间为简
@published in: 简书
"""

import pandas as pd
from statsmodels.tsa.stattools import adfuller
import statsmodels.tsa.stattools as st
import numpy as np
import pyflux as pf


daily_payment = pd.read_csv('xxx.csv',parse_dates=[0], index_col=0)

def test_stationarity(timeseries):
    dftest = adfuller(timeseries, autolag='AIC')
    return dftest[1]


def best_diff(df, maxdiff = 8):
    p_set = {}
    for i in range(0, maxdiff):
        temp = df.copy() #每次循环前,重置
        if i == 0:
            temp['diff'] = temp[temp.columns[1]]
        else:
            temp['diff'] = temp[temp.columns[1]].diff(i)
            temp = temp.drop(temp.iloc[:i].index) #差分后,前几行的数据会变成nan,所以删掉
        pvalue = test_stationarity(temp['diff'])
        p_set[i] = pvalue
        p_df = pd.DataFrame.from_dict(p_set, orient="index")
        p_df.columns = ['p_value']
    i = 0
    while i < len(p_df):
        if p_df['p_value'][i]<0.01:
            bestdiff = i
            break
        i  = 1
    return bestdiff


def produce_diffed_timeseries(df, diffn):
    if diffn != 0:
        df['diff'] = df[df.columns[1]].apply(lambda x:float(x)).diff(diffn)
    else:
        df['diff'] = df[df.columns[1]].apply(lambda x:float(x))
    df.dropna(inplace=True) #差分之后的nan去掉
    return df


def choose_order(ts, maxar, maxma):
    order = st.arma_order_select_ic(ts, maxar, maxma, ic=['aic', 'bic', 'hqic'])
    return order.bic_min_order


def predict_recover(ts, df, diffn):
    if diffn != 0:
        ts.iloc[0] = ts.iloc[0] df['log'][-diffn]
        ts = ts.cumsum()
    ts = np.exp(ts)
#    ts.dropna(inplace=True)
    print('还原完成')
    return ts


def run_aram(df, maxar, maxma, test_size = 14):
    data = df.dropna()
    data['log'] = np.log(data[data.columns[0]])
    #    test_size = int(len(data) * 0.33)
    train_size = len(data)-int(test_size)
    train, test = data[:train_size], data[train_size:]
    if test_stationarity(train[train.columns[1]]) < 0.01:
        print('平稳,不需要差分')
    else:
        diffn = best_diff(train, maxdiff = 8)
        train = produce_diffed_timeseries(train, diffn)
        print('差分阶数为' str(diffn) ',已完成差分')
    print('开始进行ARMA拟合')
    order = choose_order(train[train.columns[2]], maxar, maxma)
    print('模型的阶数为:' str(order))
    _ar = order[0]
    _ma = order[1]
    model = pf.ARIMA(data=train, ar=_ar, ma=_ma, target='diff', family=pf.Normal())
    model.fit("MLE")
    test = test['payment_times']
    test_predict = model.predict(int(test_size))
    test_predict = predict_recover(test_predict, train, diffn)
    RMSE = np.sqrt(((np.array(test_predict)-np.array(test))**2).sum()/test.size)
    print("测试集的RMSE为:" str(RMSE))

pyfluxpredict函数就万分易用,model.predict(h = )就可。详细参见A君越IMA的文档,画图起来也是那个有益于。
Time Series Forecasting using ARIMA in Python也提供了采用pyflux进行建立模型的事例。

· lattice-Highlander语言格子图形

·     rbokeh-针对Bokeh的中华V语言接口

获得三个观望值种类之后,首先要对它的平稳性和纯随机性进行验证,那多少个首要的查证称为种类的预管理。依照核算的结果可以将连串分为差别的品类,对不一样品种的系列我们会动用区别的深入分析方法。

11. 调参

  • 对于ALacrosseIMA来说,可调参的地点也挺多:
  • 差分阶数。
  • pq的阶数。
  • 模型拟合的点子:MLE、OLS等,参见Bayesian Inference和Classical Inference。
  • 推断的周期、滚动预测的周期。

· rbokeh-针对Bokeh的宝马7系语言接口

·     RGL-使用了OpenGL的3D可视化

 

12. 重组卡尔曼滤波

在时间类别中存在的噪声,会震惊种类中各样点的骚动,给预测产生难度,所以大家就想出三个方式来过滤这几个噪声,三个盛名的章程叫”Carl曼滤波“
本条东西作者还没研讨……给出参照他事他说加以考查资料:

  • 《Carl曼滤波》
  • 《时刻系列分析补充----结合ARMA的Carl曼滤波算法》
  • 《python起步之Carl曼滤波》
  • A First Look at the Kalman Filter

· RGL-使用了OpenGL的3D可视化

·     Shiny-用于创造交互式应用和可视化的框架

先说下怎么是牢固,平稳正是环绕着叁个常数上下波动且波动范围有限,即有常数均值和常数方差。借使有醒目标取向或周期性,那它平时不是和谐系列。类别平稳不安静,一般选用两种办法查证:

别的仿照效法读物:

在针对A大切诺基IMA以及时光类别深入分析话题搜寻资料时,还接触了以下资料:

  • 《时间系列模型的八个根本概念》:自相关、白噪声、平稳性。
  • 《光阴系列解析之一:数据预管理》,讲了对数据开展稳固、正态、独立、周期、趋势项检查,以及提了一句对丰裕值的管理。
  • 有如何好的模型能够做高精度的光阴类别预测呢?提供了一些有关预测模型接纳的思想。
  • 时间连串建立模型难点,怎么着准确的创造即间体系模型?评论了建马上间体系模型的流水生产线。
  • Machine Learning Strategies for Time Series Prediction
  • Data transformations and forecasting models: what to use and when,从名称想到所包蕴的意义,列举了预测模型的适用范围。
  • Autoregressive moving average model Wikipedia
  • 《要求预测小编欢跃用ARubiconIMA模型》,通俗、形象。
  • 《财政和经济时间种类入门(二)----MA & ARMA & A福睿斯IMA》
  • 《python时间系列深入分析之AHavalIMA》的进献在于讲到了对模型的核算,不过没说清楚做检查的用处,真要领会还得去看计量农学书籍。
  • Seasonal ARIMA with Python,奉献在于讲到了seasonal difference的格局,但也没讲什么样鲜明二个类别应该采用这种差分方法。
  • How to Use and Remove Trend Information from Time Series Data in Python,若是贰个小时连串带有趋势的风味,怎样作答的主意。
  • How to Make Predictions for Time Series Forecasting with Python,进献在于讲了怎么保存拟合好的模子,以及有新的数目参加的时候,更新预测模型。
  • Jason Brownlee以此人多年来写了N篇关于TimeSeries的稿子……

· Shiny-用于创建交互式应用和可视化的框架

·     visNetwork-交互式互连网可视化

 

题外话:

<Evaluating Machine Learning Models>讲明了对各类模型使用的评说指标、调参的方式以及AB测量检验的圈套,它的未成功翻译版见《机械学习模型评价(Evaluating Machine Learning Models)-主要概念与陷阱》

· visNetwork-交互式网络可视化

散点图

(1)时序图查证

结语:

新闻过载是今天时代的病痛,搜一个大旨得以获得浩如烟海的资料,以及种类的相关大旨资料……他们中间恐怕互相抄的,所以的确累死了。

澳门新浦京娱乐场网站 11

时序图

澳门新浦京娱乐场网站 12  

散点图

词云图

探访下面这些图,很鲜明的增长趋势,不安静。

澳门新浦京娱乐场网站 13

2、具有大批量刻意面向总结人士的实用功用和增长的数学工具包。自带base一CR-V的底子模块、mle一壮大似然预计模块、ts一周岁月体系解析模块、mva一多元总结深入分析模块、survival毕生活剖判模块等,同不经常间用户能够灵活使用数组和矩阵的操作运算符,及一多级连贯而又完全的数码分析中间工具。

 

时序图

3、语言凝练上心灵,无需分明定义变量类型。举例下边简简单单三行代码,就能够定义一元线性回归,是否很炫丽:

(2)自相关全面和偏相关周密

澳门新浦京娱乐场网站 14

x <- 1:10

还以上面包车型客车行列为例:用SPSS获得自相关和偏相关图。

词云图

y <- x rnorm(10, 0, 1)

澳门新浦京娱乐场网站 15

2、具备大批量特意面向计算职员的实用成效和丰硕的数学工具包。自带base一Sportage的根基模块、mle一特大似然推断模块、ts一年华种类剖判模块、mva一多元计算深入分析模块、survival平生存分析模块等,同一时候用户能够灵活使用数组和矩阵的操作运算符,及一雨后苦笋连贯而又完全的数量剖判中间工具。

fit <- lm(y ~ x)

 

3、语言简洁上心灵,无需鲜明定义变量类型。比如下边简轻便单三行代码,就能够定义一元线性回归,是还是不是很绚烂:

而且,ENVISION语言对向量化的支撑程度高,通过向量化运算,数据在计算进度中左右不借助于,是一种高度并行总结的达成,也幸免了重重循环结构的运用。

分析:左侧第多少个为自有关图(Autocorrelation),第3个偏相关图(Partial Correlation)。

x <- 1:10
y <- x rnorm(10, 0, 1)
fit <- lm(y ~ x)

本来了,相比较于Python它也设有着有些劣势。比如内部存款和储蓄器管理难点,在大样本的回归中,如使用不当就能够现出内部存款和储蓄器不足的境况,但眼下spark也提供了对奔驰M级的支持,开辟者能够利用sparkTiggo举办大额的计量管理。

 

并且,酷威语言对向量化的帮衬程度高,通过向量化运算,数据在测算进度中上下不借助,是一种中度并行计算的落到实处,也制止了广大循环往复结构的施用。

二.Python和Tiggo在文书消息开采和时序深入分析方面的区分

稳定的行列的自相关图和偏相关图要么拖尾,要么是截尾。截尾正是在某阶之后,周密都为 0 ,怎么理解啊,看上边偏相关的图,当阶数为 1 的时候,周密值依然十分大, 0.914. 二阶长的时候突然就改成了 0.050. 前面包车型客车值都极小,以为是趋于 0 ,这种场合便是截尾。什么是拖尾,拖尾就是有二个舒缓衰减的动向,但是不都为 0 。

理当如此了,比较于Python它也设有着有些逆风局。比方内部存款和储蓄器管理难题,在大样本的回归中,如使用不当就能冒出内存不足的地方,但眼前spark也提供了对Odyssey的帮忙,开拓者能够动用sparkEvoque进行大数据的乘除管理。

Python和昂Cora都有充足有力的代码库,Python有PyPi,途锐有CRAN。但两方方向区别,Python使用的限定进一步普及,涉及到整个;普拉多更专注总计方面,但在数据量大时运行速度极慢。上面笔者本着数据深入分析中的三种选拔情况来相比Python和牧马人:

 

二.Python和大切诺基在文件音讯发现和时序深入分析方面包车型地铁界别

1.文本音讯开采:

自相关图既不是拖尾也不是截尾。以上的图的自有关是三个三角形对称的花样,这种动向是单调趋势的独立图形,表达这些队列不是平安体系。

Python和Sportage都有足够有力的代码库,Python有PyPi,中华V有CRAN。但双方方向差别,Python使用的限制尤其分布,涉及到全部;卡宴更在意总计方面,但在数据量大时运营速度非常的慢。上面作者本着数据剖判中的三种选用处境来比较Python和宝马X5:

文件消息发现的选拔特别常见,举例依照网购评价、社交网址的推文恐怕音讯拓展心理极性解析等。这里大家用例子分析比较一下。

 

1. 文本音信发掘:

Python有特出的先后包帮忙大家开始展览深入分析。比如NLTK,以及特别针对粤语的SnowNLP,包罗了国文分词、词性标明、心思解析,文本分类、TextRank、TF-IDF等模块。

(3)单位根核查

文本消息发现的利用非常广泛,举例根据网购评价、社交网址的推文或然信息拓展情绪极性剖析等。这里我们用例子剖析比较一下。

在用Python做情绪极性深入分析时,首先需求将句子分解为单词,这里大家能够利用Python中jieba分词,使用起来也极其轻松:

单位根核实是指核算系列中是还是不是留存单位根,假如存在单位根就是非平稳时间体系。

Python有美妙的顺序包支持我们进行深入分析。比方NLTK,以及特意针对中文的SnowNLP,包蕴了中文分词、词性申明、心思深入分析,文本分类、TextRank、TF-IDF等模块。

word=jieba.cut(m,cut_all=False)

 

在用Python做激情极性深入分析时,首先要求将句子分解为单词,这里我们能够运用Python中jieba分词,使用起来也特别简单:

下一场操作特征提取,能够利用NLTK中的stopwords先去除停用词。假使有亟待,能够对文本进行向计量化验管理,这里大家能够运用Bag of Words,选取TF-IDF进行基于权重的向量转化,也得以动用Word2Vec举行基于相似度的中间转播。接下来,使用sklearn包中的pca举行降维:

不平稳,怎么办?

答案是差分,转换为稳定系列。什么是差分?一阶差分指原连串值相距一期的五个体系值之间的减法运算;k阶差分正是离开k期的五个连串值之间相减。如若一个时日连串经过差分运算后具有平稳性,则该体系为差分平稳类别,能够应用A途睿欧IMA模型举办剖判。

 

要么地点十二分类别,二种格局都证实她是不可相信的,不安宁的。明确不平稳后,依次展开1阶、2阶、3阶...差分,直到平稳甘休。先来个一阶差分,上海图书馆:

 

 澳门新浦京娱乐场网站 16

 从图上看,一阶差分的作用不错,望着是平稳的。

 

平稳性核实过后,下一步是纯随机性查验。

对此纯随机连串,又称白噪声类别,体系的各样数值之间未有别的相关涉嫌,种类在开展完全严节的人身自由波动,能够告一段落对该种类的解析。白噪声类别是未曾音信可领到的平安种类。

 

对于平安非白噪声种类,它的均值和方差是常数。平常是确立二个线性模型来拟合该连串的上扬,借此提取该体系的有用消息。ARMA模型是最常用的安土重迁类别拟合模型。

 

二、平稳时间种类建立模型

某些时刻类别经过预管理,被判断为平安非白噪声体系,就能够开始展览时间类别建立模型。

 

建立模型步骤:

(1)总计出该类别的自相关周详(ACF)和偏相关全面(PACF);

(2)模型识别,也称模型定阶。依据周详意况从A君越(p)模型、MA(q)模型、ARMA(p,q)模型、AENCOREIMA(p,d,q)模型中选拔十一分模型,当中p为自回归项,d为差分阶数,q为移动平均项数。

 

上面是平静连串的模型选择:

自相关系数(ACF)

偏相关系数(PACF)

选择模型

拖尾

p阶截尾

AR(p)

q阶截尾

拖尾

MA(q)

p阶拖尾

q阶拖尾

ARMA(p,q)

 

 A宝马7系IMA 是 ARMA 算法的扩充版,用法类似 。

 

(3)估算模型中的未知参数的值并对参数实行稽查;

(4)模型核算;

(5)模型优化;

(6)模型应用:举办长期预测。

 

三、python实例操作

以下为某公司二〇一六/1/1~2016/2/6的行销数目,以此建立模型预测2014/2/7~二〇一四/2/11的出售数量。

 

澳门新浦京娱乐场网站 17澳门新浦京娱乐场网站:MA时间序列建模过程,大数据初学者该怎样选。  

 

#-- coding: utf-8 -*-
#arima时序模型

*import pandas as pd

#参数初步化 discfile = 'E:/destop/text/arima_data.xls'
forecastnum = 5

#读取数据,钦定日期列为目的,Pandas自动将“日期”列识别为Datetime格式 data = pd.read_excel(discfile, index_col = u'日期')

#时序图 import matplotlib.pyplot as plt

#用来平常显示普通话标签

plt.rcParams['font.sans-serif'] = ['SimHei'] 

#用来平日呈现负号

plt.rcParams['axes.unicode_minus'] = False data.plot()
plt.show()

 澳门新浦京娱乐场网站 18

 

#自相关图 from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()

 

澳门新浦京娱乐场网站 19

* *

#平稳性检查评定 from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始系列的ADF查证结果为:', ADF(data[u'销量']))

#再次回到值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

原本体系的单位根(adf)查验

adf

cValue

p值

1%

5%

10%

1.81

-3.7112

-2.9812

-2.6301

0.9984

 

Pdf值大于四个等级次序值,p值显明高于0.05,该连串为非平稳体系。

 

 

#差分后的结果 D_data = data.diff().dropna()
D_data.columns = [u'销量差分']

 

#时序图

D_data.plot() plt.show()

 

澳门新浦京娱乐场网站 20

#自有关图

plot_acf(D_data).show()

plt.show()

澳门新浦京娱乐场网站 21

 

 

from statsmodels.graphics.tsaplots import plot_pacf

 

#偏自有关图

plot_pacf(D_data).show()

澳门新浦京娱乐场网站 22
*

 

#平稳性质量评定

print(u'差分体系的ADF查验结果为:', ADF(D_data[u'销量差分']))

* *

一阶差分后连串的单位根(adf)核查

adf

cValue

p值

1%

5%

10%

-3.15

-3.6327

-2.9485

-2.6130

0.0227

* *

Pdf值小于五个水平值,p值分明低于0.05,一阶差分后体系为平稳连串。

* *

*
#白噪声核查
*from statsmodels.stats.diagnostic import acorr_ljungbox

 

#回去总计量和p值

print(u'差分种类的白噪声查证结果为:', acorr_ljungbox(D_data, lags=1))

  • *

* *

一阶差分后系列的白噪声核查

stat

P值

11.304

澳门新浦京娱乐场网站:MA时间序列建模过程,大数据初学者该怎样选。0.007734 

* *

P值小于0.05,所以一阶差分后的队列为稳固非白噪声体系。

* *

*
from statsmodels.tsa.arima_model import ARIMA #定阶*

#相似阶数不当先length/10

pmax = int(len(D_data)/10) 

 

#一般阶数不超越length/10

qmax = int(len(D_data)/10) 

 

#bic矩阵

bic_matrix = [] for p in range(pmax 1):
  tmp = []
  for q in range(qmax 1):

 

#存在一些报错,所以用try来跳过报错。

    try:       tmp.append(ARIMA(data, (p,1,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

#从中能够找寻最小值

bic_matrix = pd.DataFrame(bic_matrix) *

*#先用stack展平,然后用idxmin寻找最小值地点。**

p,q = bic_matrix.stack().idxmin() 

print(u'BIC最小的p值和q值为:%s、%s' %(p,q))

 

取BIC消息量达到最小的模型阶数,结果p为0,q为1,定阶完结。

 

 #建立ARIMA(0, 1, 1)模型

model = ARIMA(data, (p,1,q)).fit() 

#交付一份模型报告

model.summary2() 

 

#用作期5天的展望,再次回到预测结果、标准基值误差、置信区间。

model.forecast(5)

 

最后模型预测值如下:

 

2015/2/7

2015/2/8

2015/2/9

2015/2/10

2015/2/11

4874.0

4923.9

4973.9

5023.8

5073.8

 

采取模型向前预测的时光越长,预测的标称误差将会越大,那是时间揣测的非凡特征。

 

参数查验如下:

 

Coef.

Std.Err.

t

P值

const

49.956

20.139

2.4806

0.0182

ma.L1.D.销量

0.671

0.1648

4.0712

0.0003

 

从核算结果p值来看,建设构造的模型效果不错。

 

 

二、

如何是时间连串

      时间类别简单来说便是各时间点上产生的数值类别,时间类别深入分析正是通过旁观历史数据展望今后的值。在此间供给重申一点的是,时间系列解析并不是有关时间的回归,它根本是切磋本身的变化规律的(这里不思索含外生变量的日子体系)。

为啥用python

  用三个字计算“情怀”,爱屋及乌,个人相比欣赏python,就用python撸了。能做时间类别的软件大多,SAS、路虎极光、SPSS、Eviews以至matlab等等,实际职业中利用得相比较多的相应依然SAS和GL450,前面二个推荐王燕写的《应用时间类别深入分析》,前面一个推荐“听大人说Wrangler语言的年月连串建立模型完整教程”这篇博文(翻译版)。python作为科学计算的利器,当然也可能有连带剖析的包:statsmodels中tsa模块,当然这些包和SAS、PRADO是比不断,可是python有另二个神器:pandas!pandas在时刻系列上的应用,能简化我们好多的行事。

条件安顿

  python推荐直接装Anaconda,它集成了广大无庸置疑总结包,有一部分包协和手动去装照旧挺辛劳的。statsmodels需求和谐去安装,这里自身推荐使用0.6的牢固版,0.7及其以上的本子能在github上找到,该版本在设置时会用C编写翻译好,所以修改底层的一些代码将不会起成效。

时刻体系深入分析

1.基本模型

  自回归活动平均模型(ARMA(p,q))是时刻系列中最好根本的模型之一,它最首要由两片段组成: ALacrosse代表p阶自回归进度,MA代表q阶移动平均进度,其公式如下:

     澳门新浦京娱乐场网站 23

  澳门新浦京娱乐场网站 24

                    依赖模型的样式、性格及自有关和偏自相关函数的特点,计算如下:   

  澳门新浦京娱乐场网站 25

在时刻系列中,ACRUISERIMA模型是在ARMA模型的基本功上多了差分的操作。

2.pandas岁月类别操作

大猛氏兽真的很摄人心魄,这里差不离介绍一下它在时刻系列上的可喜之处。和多数光阴类别分析同样,本文同样接纳航航空乘务客数量(AirPassengers.csv)作为样例。

多少读取:

澳门新浦京娱乐场网站 26

# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pylab as plt

# 读取数据,pd.read_csv默认生成DataFrame对象,需将其转换成Series对象
df = pd.read_csv('AirPassengers.csv', encoding='utf-8', index_col='date')
df.index = pd.to_datetime(df.index)  # 将字符串索引转换成时间索引
ts = df['x']  # 生成pd.Series对象
# 查看数据格式
ts.head()
ts.head().index 

澳门新浦京娱乐场网站 27

   澳门新浦京娱乐场网站 28

查阅某日的值不只能够行使字符串作为目录,又有什么不可直接使用时间对象作为目录

ts['1949-01-01']
ts[datetime(1949,1,1)]

双方的重临值都以首先个体系值:112

假诺要查阅某一年的数据,pandas也能特别有利的兑现

ts['1949']

    澳门新浦京娱乐场网站 29

切开操作:

ts['1949-1' : '1949-6']

    澳门新浦京娱乐场网站 30

留心时间索引的切成片操作起源和尾巴都以含有的,那点与数值索引有所分歧

pandas还也有多数便于的时辰体系函数,在后头的莫过于行使中在张开认证。

  1. 平稳性核实

大家知道类别平稳性是打开时间连串剖析的前提条件,很几人都会有疑问,为啥要满足平稳性的渴求啊?在时局定理和宗旨定理中供给样本同布满(这里同布满等价于时间种类中的平稳性),而大家的建模进程中有大多都以树立在命局定理和基本极限定理的前提条件下的,若是它不知足,获得的多多结论都以离谱的。以虚假回归为例,当响应变量和输入变量都平静时,我们用t计算量核实标准周全的显明性。而当响应变量和输入变量不平静时,其条件周密不在满意t遍布,这时再用t核查来实行分明性分析,导致拒绝原假诺的可能率扩张,即轻松犯第一类错误,从而得出错误的下结论。

安静时间种类有二种概念:严平稳和宽平稳

严平稳一孔之见,是一种标准极度苛刻的平稳性,它须要连串随着年华的推移,其总计性质量保证持不改变。对于随便的τ,其伙同可能率密度函数满意:

     澳门新浦京娱乐场网站 31

严平稳的规范只是论战上的存在,现实中用得比较多的是宽平稳的基准。

宽平稳也叫弱平稳大概二阶平稳(均值和方差平稳),它应满意:

  • 常数均值
  • 常数方差
  • 常数自行车运动协会方差

平稳性核实:观望法和单位根核算法

基于此,小编写了叁个名称为test_stationarity的总括性核查模块,以便将或多或少总括查验结果越来越直观的表现出来。

澳门新浦京娱乐场网站 32

# -*- coding:utf-8 -*-
from statsmodels.tsa.stattools import adfuller
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

# 移动平均图
def draw_trend(timeSeries, size):
    f = plt.figure(facecolor='white')
    # 对size个数据进行移动平均
    rol_mean = timeSeries.rolling(window=size).mean()
    # 对size个数据进行加权移动平均
    rol_weighted_mean = pd.ewma(timeSeries, span=size)

    timeSeries.plot(color='blue', label='Original')
    rolmean.plot(color='red', label='Rolling Mean')
    rol_weighted_mean.plot(color='black', label='Weighted Rolling Mean')
    plt.legend(loc='best')
    plt.title('Rolling Mean')
    plt.show()

def draw_ts(timeSeries):
    f = plt.figure(facecolor='white')
    timeSeries.plot(color='blue')
    plt.show()

'''
  Unit Root Test
   The null hypothesis of the Augmented Dickey-Fuller is that there is a unit
   root, with the alternative that there is no unit root. That is to say the
   bigger the p-value the more reason we assert that there is a unit root
'''
def testStationarity(ts):
    dftest = adfuller(ts)
    # 对上述函数求得的值进行语义描述
    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
    return dfoutput

# 自相关和偏相关图,默认阶数为31阶
def draw_acf_pacf(ts, lags=31):
    f = plt.figure(facecolor='white')
    ax1 = f.add_subplot(211)
    plot_acf(ts, lags=31, ax=ax1)
    ax2 = f.add_subplot(212)
    plot_pacf(ts, lags=31, ax=ax2)
    plt.show()

澳门新浦京娱乐场网站 33

 

观察法,通俗的说正是通过观望连串的趋向图与相关图是或不是随着时间的变动显示出某种规律。所谓的规律正是时刻类别平日涉及的周期性因素,现实中相见得比较多的是线性周期成分,那类周期成分能够使用差分恐怕移动平均来消除,而对此非线性周期成分的管理相对相比较复杂,须求选用有些分解的不二诀窍。下图为航空数据的线性图,能够无庸赘述标看到它具备年周期成分和短期趋势成分。平稳类别的自相关周全会急忙衰减,下边包车型客车自有关图并不能够体现出该特征,所以大家有理由相信该类别是不稳固的。

     澳门新浦京娱乐场网站 34         

     澳门新浦京娱乐场网站 35

 

单位根查验:ADF是一种常用的单位根核算方法,他的原若是为类别具备单位根,即非平稳,对于二个安居的时序数据,就须要在加以的置信水平上料定,拒绝原假诺。ADF只是单位根核查的章程之一,假如想行使别的验证方法,能够设置第三方包arch,里面提供了更为周全的单位根查证方法,个人也许比较青睐ADF核准。以下为核算结果,其p值大于0.99,表达并不可能拒绝原借使。

      澳门新浦京娱乐场网站 36

  1. 平稳性管理

由前边的解析可见,该类别是不安宁的,然则平稳性是岁月体系分析的前提条件,故大家需求对动荡的行列进行拍卖将其转变到平稳的队列。

a. 对数转换

对数转变首若是为了收缩数据的振荡幅度,使其线性规律尤其分明(作者是那般清楚的小时体系模型超过一半都以线性的,为了尽量下降非线性的要素,须求对其进展预管理,也许小编精通的难堪)。对数转变也就是扩充了八个处以机制,数据越大其处置越大,数据越小惩罚越小。这里重申一下,转换的系列须求满足大于0,小于0的多少不存在对数转换。

ts_log = np.log(ts)
test_stationarity.draw_ts(ts_log)

    澳门新浦京娱乐场网站 37

b. 平滑法

听闻平滑技能的不一样,平滑法具体分为移动平均法和指数平均法。

挪动平均即选取自然时间距离内的平均值作为某一期的测度值,而指数平均则是用变权的措施来总结均值

test_stationarity.draw_trend(ts_log, 12)

    澳门新浦京娱乐场网站 38

从上海体育地方能够窥见窗口为12的活动平均能较好的剔除年周期性因素,而指数平均法是对周期内的数码开始展览了加权,能在自然水准上减谢节周期因素,但并不可能完全除去,如要完全除去可以越发进展差分操作。

c.  差分

时光类别最常用来剔除周期性因素的点子当属差分了,它首借使对等周时期隔的数量开始展览线性求减。后面我们说过,A昂科威IMA模型相对ARMA模型,仅多了差分操作,A冠道IMA模型差十分少是兼具时间系列软件都扶助的,差分的达成与还原都卓殊实惠。而statsmodel中,对差分的支撑不是很好,它不协助高阶和多阶差分,为何不帮助,这里引用小编的布道:

      澳门新浦京娱乐场网站 39

作者大概的乐趣是说预测方法中并未缓慢解决高于2阶的差分,有未有以为很牵强,但是没什么,大家有pandas。大家得以先用pandas将类别差分好,然后在对差分好的行列举办A索罗德IMA拟合,只也就如从前面会多了一步人工复苏的做事。

diff_12 = ts_log.diff(12)
diff_12.dropna(inplace=True)
diff_12_1 = diff_12.diff(1)
diff_12_1.dropna(inplace=True)
test_stationarity.testStationarity(diff_12_1)

    澳门新浦京娱乐场网站 40

从地点的总结查验结果能够看出,经过12阶差分和1阶差分后,该连串满意平稳性的渴求了。

d. 分解

所谓分解就是将时序数据分离成分歧的成分。statsmodels使用的X-11分解进程,它根本将时序数据分离成长期趋势、季节趋势和自由成分。与任何总计软件同样,statsmodels也支撑两类分解模型,加法模型和乘法模型,这里自个儿只兑现加法,乘法只需将model的参数设置为"multiplicative"就可以。

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log, model="additive")

trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

    澳门新浦京娱乐场网站 41

赢得不一致的解释成分后,就可以利用时间种类模型对各类成分举办拟合,当然也足以挑选别的预测方法。作者早已用过小波对时序数据开始展览过解释,然后分别选取时间种类拟合,效果尚可。由于作者对小波的知道不是很好,只好简单的调用接口,如若有哪个人对小波、傅里叶、Carl曼精晓得相比较透,能够将时序数据开始展览更进一步可信的批注,由于分解后的时序数据幸免了她们在建立模型时的断断续续影响,所以本身信任它将力促预测正确性的加强。

  1. 模型识别

在前面包车型地铁深入分析可见,该系列具备无可争论的年周期与长期成分。对于年周期成分大家使用窗口为12的运动平实行管理,对于短期趋势成分我们应用1阶差分来打开始拍片卖。

rol_mean = ts_log.rolling(window=12).mean()
rol_mean.dropna(inplace=True)
ts_diff_1 = rol_mean.diff(1)
ts_diff_1.dropna(inplace=True)
test_stationarity.testStationarity(ts_diff_1)

     澳门新浦京娱乐场网站 42

观测其总结量开掘该系列在置信水平为95%的间距下并不显眼,大家对其开始展览重复一阶差分。再一次差分后的行列其自有关具备快速衰减的表征,t总结量在99%的置信水平下是路人皆知的,这里小编不再做详细表达。

ts_diff_2 = ts_diff_1.diff(1)
ts_diff_2.dropna(inplace=True)

      澳门新浦京娱乐场网站 43

数据平稳后,须要对模型定阶,即鲜明p、q的阶数。阅览上图,发掘自有关和偏相全面都留存拖尾的特点,并且他们都有着显然的一阶相关性,所以大家设定p=1, q=1。上边就能够运用ARMA模型进行多少拟合了。这里我不采用AENVISIONIMA(ts_diff_1, order=(1, 1, 1))举办拟合,是因为含有差分操作时,预测结果还原老出难点,现今还没弄领会。 

from statsmodels.tsa.arima_model import ARMA
model = ARMA(ts_diff_2, order=(1, 1)) 
result_arma = model.fit( disp=-1, method='css')
  1. 样本拟合

 模型拟合完后,大家就能够对其开始展览预测了。由于ARMA拟合的是因此有关预处理后的多寡,故其预测值要求通过相关逆调换举办还原。

澳门新浦京娱乐场网站 44

predict_ts = result_arma.predict()
# 一阶差分还原
diff_shift_ts = ts_diff_1.shift(1)
diff_recover_1 = predict_ts.add(diff_shift_ts)
# 再次一阶差分还原
rol_shift_ts = rol_mean.shift(1)
diff_recover = diff_recover_1.add(rol_shift_ts)
# 移动平均还原
rol_sum = ts_log.rolling(window=11).sum()
rol_recover = diff_recover*12 - rol_sum.shift(1)
# 对数还原
log_recover = np.exp(rol_recover)
log_recover.dropna(inplace=True)

澳门新浦京娱乐场网站 45

大家使用均方根基值误差(RMSE)来评估模型样本内拟合的三六九等。利用该法规举办识别时,要求剔除“非预测”数据的影响。

澳门新浦京娱乐场网站 46

ts = ts[log_recover.index]  # 过滤没有预测的记录
plt.figure(facecolor='white')
log_recover.plot(color='blue', label='Predict')
ts.plot(color='red', label='Original')
plt.legend(loc='best')
plt.title('RMSE: %.4f'% np.sqrt(sum((log_recover-ts)**2)/ts.size))
plt.show()

澳门新浦京娱乐场网站 47

  澳门新浦京娱乐场网站 48

调查上海体育场所的拟合效果,均方根相对误差为11.8828,感觉还过得去。

6. 完善ARIMA模型

近年来提到statsmodels里面的A途乐IMA模块不协理高阶差分,大家的做法是将差分分离出来,但是这么会多了一步人工恢复生机的操作。基于上述难点,笔者将差分进程进展了打包,使连串能依据钦定的差分列表依次进行差分,并相应的构造了几个恢复生机的艺术,达成差分系列的电动恢复生机。

澳门新浦京娱乐场网站 49

# 差分操作
def diff_ts(ts, d):
    global shift_ts_list
    #  动态预测第二日的值时所需要的差分序列
    global last_data_shift_list
    shift_ts_list = []
    last_data_shift_list = []
    tmp_ts = ts
    for i in d:
        last_data_shift_list.append(tmp_ts[-i])
        print last_data_shift_list
        shift_ts = tmp_ts.shift(i)
        shift_ts_list.append(shift_ts)
        tmp_ts = tmp_ts - shift_ts
    tmp_ts.dropna(inplace=True)
    return tmp_ts

# 还原操作
def predict_diff_recover(predict_value, d):
    if isinstance(predict_value, float):
        tmp_data = predict_value
        for i in range(len(d)):
            tmp_data = tmp_data   last_data_shift_list[-i-1]
    elif isinstance(predict_value, np.ndarray):
        tmp_data = predict_value[0]
        for i in range(len(d)):
            tmp_data = tmp_data   last_data_shift_list[-i-1]
    else:
        tmp_data = predict_value
        for i in range(len(d)):
            try:
                tmp_data = tmp_data.add(shift_ts_list[-i-1])
            except:
                raise ValueError('What you input is not pd.Series type!')
        tmp_data.dropna(inplace=True)
    return tmp_data

澳门新浦京娱乐场网站 50

前段时间我们一向动用差分的办法开始展览数据管理,并以一样的经过举办数量展望与回复。

diffed_ts = diff_ts(ts_log, d=[12, 1])
model = arima_model(diffed_ts)
model.certain_model(1, 1)
predict_ts = model.properModel.predict()
diff_recover_ts = predict_diff_recover(predict_ts, d=[12, 1])
log_recover = np.exp(diff_recover_ts)

    澳门新浦京娱乐场网站 51

是或不是意识此处的展望结果和上一篇的行使12阶移动平均的前瞻结果一模二样。这是因为12阶移动平均增进一阶差分与直接12阶差分是等价的关联,前者是前边贰个数值的12倍,那一个理应轻便推导。

对于个数十分的少的时序数据,我们得以通过观看自相关图和偏相关图来开始展览模型识别,假设大家要剖析的时序数据量较多,比如要估摸每只股票的升势,我们就不容许每一个去调参了。那时大家得以依附BIC准绳识别模型的p, q值,常常以为BIC值越小的模子相对更优。这里笔者归纳介绍一下BIC章法,它综合思考了残差大小和自变量的个数,残差越小BIC值越小,自变量个数越来越多BIC值越大。个人认为BIC准绳正是对模型过拟合设定了三个行业内部(过拟合那东西应该以辩证的观点对待)。

澳门新浦京娱乐场网站 52

def proper_model(data_ts, maxLag):
    init_bic = sys.maxint
    init_p = 0
    init_q = 0
    init_properModel = None
    for p in np.arange(maxLag):
        for q in np.arange(maxLag):
            model = ARMA(data_ts, order=(p, q))
            try:
                results_ARMA = model.fit(disp=-1, method='css')
            except:
                continue
            bic = results_ARMA.bic
            if bic < init_bic:
                init_p = p
                init_q = q
                init_properModel = results_ARMA
                init_bic = bic
    return init_bic, init_p, init_q, init_properModel

澳门新浦京娱乐场网站 53

相对最优参数识别结果:BIC: -1090.44209358 p: 0 q: 1 , RMSE:11.8817一九八四31。大家发掘模型自动识别的参数要比作者手动选项的参数更优。

7.滚动预测

所谓滚动预测是指通过增添最新的数额展望第二天的值。对于二个平稳的预测模型,不须求每一日都去拟合,大家得以给他设定三个阀值,譬如每一周拟合壹回,该时期只需经过丰盛最新的数量完成滚动预测就能够。基于此小编编写了二个名叫arima_model的类,主要包括模型自动识别方法,滚动预测的效果,详细代码能够查阅附录。数据的动态拉长:

澳门新浦京娱乐场网站 54

from dateutil.relativedelta import relativedelta
def _add_new_data(ts, dat, type='day'):

if type == 'day':
        new_index = ts.index[-1]   relativedelta(days=1)
    elif type == 'month':
        new_index = ts.index[-1]   relativedelta(months=1)
    ts[new_index] = dat

def add_today_data(model, ts,  data, d, type='day'):
    _add_new_data(ts, data, type)  # 为原始序列添加数据
    # 为滞后序列添加新值
    d_ts = diff_ts(ts, d)
    model.add_today_data(d_ts[-1], type)

def forecast_next_day_data(model, type='day'):
    if model == None:
        raise ValueError('No model fit before')
    fc = model.forecast_next_day_value(type)
    return predict_diff_recover(fc, [12, 1])

澳门新浦京娱乐场网站 55

现今大家就足以选拔滚动预测的法子向外预测了,取1960年从前的数据作为教练多少,其后的数量作为测量检验,并设定模型每第一周就能够再次拟合二回。这里的diffed_ts对象会趁着add_today_data方法自动抬高数据,那是由于它与add_today_data方法中的d_ts指向的一致对象,该指标会动态的丰盛数据。

澳门新浦京娱乐场网站 56

ts_train = ts_log[:'1956-12']
ts_test = ts_log['1957-1':]

diffed_ts = diff_ts(ts_train, [12, 1])
forecast_list = []

for i, dta in enumerate(ts_test):
    if i%7 == 0:
        model = arima_model(diffed_ts)
        model.certain_model(1, 1)
    forecast_data = forecast_next_day_data(model, type='month')
    forecast_list.append(forecast_data)
    add_today_data(model, ts_train, dta, [12, 1], type='month')

predict_ts = pd.Series(data=forecast_list, index=ts['1957-1':].index)
log_recover = np.exp(predict_ts)
original_ts = ts['1957-1':]

澳门新浦京娱乐场网站 57

    澳门新浦京娱乐场网站 58

动态预测的均方根相对误差为:14.6479,与后面样本内拟合的均方根引用误差相差非常小,表明模型并不曾过拟合,并且完全预测效果都较好。

  1. 模型种类化

在进展动态预测时,我们不指望将一切模型一向在内部存款和储蓄器中运营,而是希望有新的多少来不常才起步该模型。那时我们就应该把一切模型从内部存款和储蓄器导出到硬盘中,而系列化正好能知足该须要。体系化最常用的便是使用json模块了,可是它是时刻对象帮忙得不是很好,有人对json模块举办了开始展览以使得支持时间对象,这里我们不应用该形式,我们应用pickle模块,它和json的接口基本一样,有乐趣的能够去查看一下。小编在实质上选择中是采纳的面向对象的编制程序,它的系列化首假若将类的品质连串化就能够,而在面向进度的编制程序中,模型系列化要求将必要种类化的对象公有化,那样会使得对前方函数的参数改动十分的大,作者不在详细演讲该进度。

总结

与任何总计语言比较,python在总括分析那块还展现不那么“专门的学问”。随着numpy、pandas、scipy、sklearn、gensim、statsmodels等包的有助于,笔者深信不疑也祝愿python在数额剖析那块越来越好。与SAS和哈弗相比较,python的时日类别模块还不是很干练,作者这里仅起到投砾引珠的效用,希望各位能人志士能进献本人的技能,使其更为健全。实际利用中自己全部是面向进度来编排的,为了演说方便,笔者用面向进度重新罗列了三回,实在觉得很不低价。原来策画分三篇来写的,还会有部分其实使用的局地,不策画再写了,还请大家原谅。实际利用首要是现实性难题具体深入分析,那中档首先步正是要询问难点,那步花的时日反复会相比较多,然后再是缓慢解决难点。以小编如今项目境遇的主题素材为例,当时遇到了以下多少个特出的标题:1.周期长度不牢固的周期元素,比方每月的1号具有周期性,但每月1号与1号之间的小运间隔是不对等的;2.暗含缺失值以及包涵记录为0的情况不可能进展对数调换;3.节休假的影响等等。

代码:

# -*-coding:utf-8-*-
import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARMA
import sys
from dateutil.relativedelta import relativedelta
from copy import deepcopy
import matplotlib.pyplot as plt

class arima_model:

    def __init__(self, ts, maxLag=9):
        self.data_ts = ts
        self.resid_ts = None
        self.predict_ts = None
        self.maxLag = maxLag
        self.p = maxLag
        self.q = maxLag
        self.properModel = None
        self.bic = sys.maxint

    # 计算最优ARIMA模型,将相关结果赋给相应属性
    def get_proper_model(self):
        self._proper_model()
        self.predict_ts = deepcopy(self.properModel.predict())
        self.resid_ts = deepcopy(self.properModel.resid)

    # 对于给定范围内的p,q计算拟合得最好的arima模型,这里是对差分好的数据进行拟合,故差分恒为0
    def _proper_model(self):
        for p in np.arange(self.maxLag):
            for q in np.arange(self.maxLag):
                # print p,q,self.bic
                model = ARMA(self.data_ts, order=(p, q))
                try:
                    results_ARMA = model.fit(disp=-1, method='css')
                except:
                    continue
                bic = results_ARMA.bic
                # print 'bic:',bic,'self.bic:',self.bic
                if bic < self.bic:
                    self.p = p
                    self.q = q
                    self.properModel = results_ARMA
                    self.bic = bic
                    self.resid_ts = deepcopy(self.properModel.resid)
                    self.predict_ts = self.properModel.predict()

    # 参数确定模型
    def certain_model(self, p, q):
            model = ARMA(self.data_ts, order=(p, q))
            try:
                self.properModel = model.fit( disp=-1, method='css')
                self.p = p
                self.q = q
                self.bic = self.properModel.bic
                self.predict_ts = self.properModel.predict()
                self.resid_ts = deepcopy(self.properModel.resid)
            except:
                print 'You can not fit the model with this parameter p,q, ' 
                      'please use the get_proper_model method to get the best model'

    # 预测第二日的值
    def forecast_next_day_value(self, type='day'):
        # 我修改了statsmodels包中arima_model的源代码,添加了constant属性,需要先运行forecast方法,为constant赋值
        self.properModel.forecast()
        if self.data_ts.index[-1] != self.resid_ts.index[-1]:
            raise ValueError('''The index is different in data_ts and resid_ts, please add new data to data_ts.
            If you just want to forecast the next day data without add the real next day data to data_ts,
            please run the predict method which arima_model included itself''')
        if not self.properModel:
            raise ValueError('The arima model have not computed, please run the proper_model method before')
        para = self.properModel.params

        # print self.properModel.params
        if self.p == 0:   # It will get all the value series with setting self.data_ts[-self.p:] when p is zero
            ma_value = self.resid_ts[-self.q:]
            values = ma_value.reindex(index=ma_value.index[::-1])
        elif self.q == 0:
            ar_value = self.data_ts[-self.p:]
            values = ar_value.reindex(index=ar_value.index[::-1])
        else:
            ar_value = self.data_ts[-self.p:]
            ar_value = ar_value.reindex(index=ar_value.index[::-1])
            ma_value = self.resid_ts[-self.q:]
            ma_value = ma_value.reindex(index=ma_value.index[::-1])
            values = ar_value.append(ma_value)

        predict_value = np.dot(para[1:], values)   self.properModel.constant[0]
        self._add_new_data(self.predict_ts, predict_value, type)
        return predict_value

    # 动态添加数据函数,针对索引是月份和日分别进行处理
    def _add_new_data(self, ts, dat, type='day'):
        if type == 'day':
            new_index = ts.index[-1]   relativedelta(days=1)
        elif type == 'month':
            new_index = ts.index[-1]   relativedelta(months=1)
        ts[new_index] = dat

    def add_today_data(self, dat, type='day'):
        self._add_new_data(self.data_ts, dat, type)
        if self.data_ts.index[-1] != self.predict_ts.index[-1]:
            raise ValueError('You must use the forecast_next_day_value method forecast the value of today before')
        self._add_new_data(self.resid_ts, self.data_ts[-1] - self.predict_ts[-1], type)

if __name__ == '__main__':
    df = pd.read_csv('AirPassengers.csv', encoding='utf-8', index_col='date')
    df.index = pd.to_datetime(df.index)
    ts = df['x']

    # 数据预处理
    ts_log = np.log(ts)
    rol_mean = ts_log.rolling(window=12).mean()
    rol_mean.dropna(inplace=True)
    ts_diff_1 = rol_mean.diff(1)
    ts_diff_1.dropna(inplace=True)
    ts_diff_2 = ts_diff_1.diff(1)
    ts_diff_2.dropna(inplace=True)

    # 模型拟合
    model = arima_model(ts_diff_2)
    #  这里使用模型参数自动识别
    model.get_proper_model()
    print 'bic:', model.bic, 'p:', model.p, 'q:', model.q
    print model.properModel.forecast()[0]
    print model.forecast_next_day_value(type='month')

    # 预测结果还原
    predict_ts = model.properModel.predict()
    diff_shift_ts = ts_diff_1.shift(1)
    diff_recover_1 = predict_ts.add(diff_shift_ts)
    rol_shift_ts = rol_mean.shift(1)
    diff_recover = diff_recover_1.add(rol_shift_ts)
    rol_sum = ts_log.rolling(window=11).sum()
    rol_recover = diff_recover*12 - rol_sum.shift(1)
    log_recover = np.exp(rol_recover)
    log_recover.dropna(inplace=True)

    # 预测结果作图
    ts = ts[log_recover.index]
    plt.figure(facecolor='white')
    log_recover.plot(color='blue', label='Predict')
    ts.plot(color='red', label='Original')
    plt.legend(loc='best')
    plt.title('RMSE: %.4f'% np.sqrt(sum((log_recover-ts)**2)/ts.size))
    plt.show()

 

 三、LSTM

有关本事理论部分,能够参考这两篇小说(RNN、LSTM),本文首要从数量、代码角度,利用LSTM举办时间类别预测。

style="font-size: medium">时间系列(或称动态数列)是指将同一计算指标的数值按其发生的大运先后顺序排列而成的数列。时间种类剖判的主要指标是依照已部分历史数据对前景拓展展望。

时刻种类构成因素:长时间趋势,季节变动,循环变动,不准绳变动

  • 长期趋势( T )现象在较长时代内受某种根天性因素功用而变成的总的变动趋势
  • 时令变动( S )现象在一年内随着季节的变通而发生的有规律的周期性别变化动
  • 巡回变动( C )现象以多少年为周期所展现出的浪花起伏形态的有规律的更动
  • 非符合规律变动(I )是一种无规律可循的变动,包涵严苛的率性变动和畸形的神迹影响比非常的大的转移二种档案的次序

(1)原始时间连串数据(只列出了18行)

1455.219971
1399.420044
1402.109985
1403.449951
1441.469971
1457.599976
1438.560059
1432.25
1449.680054
1465.150024
1455.140015
1455.900024
1445.569946
1441.359985
1401.530029
1410.030029
1404.089966
1398.560059

(2)处理数据使之符合LSTM的供给

为了进一步直观的刺探多少格式,代码中加入了部分打字与印刷(print),并且前边加了讲明,正是输出值

def load_data(filename, seq_len):
    f = open(filename, 'rb').read()
    data = f.split('n')

    print('data len:',len(data))       #4172
    print('sequence len:',seq_len)     #50

    sequence_length = seq_len   1
    result = []
    for index in range(len(data) - sequence_length):
        result.append(data[index: index   sequence_length])  #得到长度为seq_len 1的向量,最后一个作为label

    print('result len:',len(result))   #4121
    print('result shape:',np.array(result).shape)  #(4121,51)

    result = np.array(result)

    #划分train、test
    row = round(0.9 * result.shape[0])
    train = result[:row, :]
    np.random.shuffle(train)
    x_train = train[:, :-1]
    y_train = train[:, -1]
    x_test = result[row:, :-1]
    y_test = result[row:, -1]

    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
    x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))  

    print('X_train shape:',X_train.shape)  #(3709L, 50L, 1L)
    print('y_train shape:',y_train.shape)  #(3709L,)
    print('X_test shape:',X_test.shape)    #(412L, 50L, 1L)
    print('y_test shape:',y_test.shape)    #(412L,)

    return [x_train, y_train, x_test, y_test]

(3)LSTM模型

正文使用的是keras纵深学习框架,读者恐怕用的是别的的,诸如theano、tensorflow等,大同小异。

Keras LSTM官方文档

LSTM的结构能够和睦定制,Stack LSTM or Bidirectional LSTM

def build_model(layers):  #layers [1,50,100,1]
    model = Sequential()

    #Stack LSTM
    model.add(LSTM(input_dim=layers[0],output_dim=layers[1],return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(layers[2],return_sequences=False))
    model.add(Dropout(0.2))

    model.add(Dense(output_dim=layers[3]))
    model.add(Activation("linear"))

    start = time.time()
    model.compile(loss="mse", optimizer="rmsprop")
    print("Compilation Time : ", time.time() - start)
    return model

(4)LSTM锻炼预测

1.直接预测

def predict_point_by_point(model, data):
    predicted = model.predict(data)
    print('predicted shape:',np.array(predicted).shape)  #(412L,1L)
    predicted = np.reshape(predicted, (predicted.size,))
    return predicted

2.滚动预测

def predict_sequence_full(model, data, window_size):  #data X_test
    curr_frame = data[0]  #(50L,1L)
    predicted = []
    for i in xrange(len(data)):
        #x = np.array([[[1],[2],[3]], [[4],[5],[6]]])  x.shape (2, 3, 1) x[0,0] = array([1])  x[:,np.newaxis,:,:].shape  (2, 1, 3, 1)
        predicted.append(model.predict(curr_frame[newaxis,:,:])[0,0])  #np.array(curr_frame[newaxis,:,:]).shape (1L,50L,1L)
        curr_frame = curr_frame[1:]
        curr_frame = np.insert(curr_frame, [window_size-1], predicted[-1], axis=0)   #numpy.insert(arr, obj, values, axis=None)
    return predicted

2.滑行窗口 滚动预测

def predict_sequences_multiple(model, data, window_size, prediction_len):  #window_size = seq_len
    prediction_seqs = []
    for i in xrange(len(data)/prediction_len):
        curr_frame = data[i*prediction_len]
        predicted = []
        for j in xrange(prediction_len):
            predicted.append(model.predict(curr_frame[newaxis,:,:])[0,0])
            curr_frame = curr_frame[1:]
            curr_frame = np.insert(curr_frame, [window_size-1], predicted[-1], axis=0)
        prediction_seqs.append(predicted)
    return prediction_seqs


完整代码:

# -*- coding: utf-8 -*-

from __future__ import print_function

import time
import warnings
import numpy as np
import time
import matplotlib.pyplot as plt
from numpy import newaxis
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential

warnings.filterwarnings("ignore")

def load_data(filename, seq_len, normalise_window):
    f = open(filename, 'rb').read()
    data = f.split('n')

    print('data len:',len(data))
    print('sequence len:',seq_len)

    sequence_length = seq_len   1
    result = []
    for index in range(len(data) - sequence_length):
        result.append(data[index: index   sequence_length])  #得到长度为seq_len 1的向量,最后一个作为label

    print('result len:',len(result))
    print('result shape:',np.array(result).shape)
    print(result[:1])

    if normalise_window:
        result = normalise_windows(result)

    print(result[:1])
    print('normalise_windows result shape:',np.array(result).shape)

    result = np.array(result)

    #划分train、test
    row = round(0.9 * result.shape[0])
    train = result[:row, :]
    np.random.shuffle(train)
    x_train = train[:, :-1]
    y_train = train[:, -1]
    x_test = result[row:, :-1]
    y_test = result[row:, -1]

    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
    x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))  

    return [x_train, y_train, x_test, y_test]

def normalise_windows(window_data):
    normalised_data = []
    for window in window_data:   #window shape (sequence_length L ,)  即(51L,)
        normalised_window = [((float(p) / float(window[0])) - 1) for p in window]
        normalised_data.append(normalised_window)
    return normalised_data

def build_model(layers):  #layers [1,50,100,1]
    model = Sequential()

    model.add(LSTM(input_dim=layers[0],output_dim=layers[1],return_sequences=True))
    model.add(Dropout(0.2))

    model.add(LSTM(layers[2],return_sequences=False))
    model.add(Dropout(0.2))

    model.add(Dense(output_dim=layers[3]))
    model.add(Activation("linear"))

    start = time.time()
    model.compile(loss="mse", optimizer="rmsprop")
    print("Compilation Time : ", time.time() - start)
    return model

#直接全部预测
def predict_point_by_point(model, data):
    predicted = model.predict(data)
    print('predicted shape:',np.array(predicted).shape)  #(412L,1L)
    predicted = np.reshape(predicted, (predicted.size,))
    return predicted

#滚动预测
def predict_sequence_full(model, data, window_size):  #data X_test
    curr_frame = data[0]  #(50L,1L)
    predicted = []
    for i in xrange(len(data)):
        #x = np.array([[[1],[2],[3]], [[4],[5],[6]]])  x.shape (2, 3, 1) x[0,0] = array([1])  x[:,np.newaxis,:,:].shape  (2, 1, 3, 1)
        predicted.append(model.predict(curr_frame[newaxis,:,:])[0,0])  #np.array(curr_frame[newaxis,:,:]).shape (1L,50L,1L)
        curr_frame = curr_frame[1:]
        curr_frame = np.insert(curr_frame, [window_size-1], predicted[-1], axis=0)   #numpy.insert(arr, obj, values, axis=None)
    return predicted

def predict_sequences_multiple(model, data, window_size, prediction_len):  #window_size = seq_len
    prediction_seqs = []
    for i in xrange(len(data)/prediction_len):
        curr_frame = data[i*prediction_len]
        predicted = []
        for j in xrange(prediction_len):
            predicted.append(model.predict(curr_frame[newaxis,:,:])[0,0])
            curr_frame = curr_frame[1:]
            curr_frame = np.insert(curr_frame, [window_size-1], predicted[-1], axis=0)
        prediction_seqs.append(predicted)
    return prediction_seqs

def plot_results(predicted_data, true_data, filename):
    fig = plt.figure(facecolor='white')
    ax = fig.add_subplot(111)
    ax.plot(true_data, label='True Data')
    plt.plot(predicted_data, label='Prediction')
    plt.legend()
    plt.show()
    plt.savefig(filename '.png')

def plot_results_multiple(predicted_data, true_data, prediction_len):
    fig = plt.figure(facecolor='white')
    ax = fig.add_subplot(111)
    ax.plot(true_data, label='True Data')
    #Pad the list of predictions to shift it in the graph to it's correct start
    for i, data in enumerate(predicted_data):
        padding = [None for p in xrange(i * prediction_len)]
        plt.plot(padding   data, label='Prediction')
        plt.legend()
    plt.show()
    plt.savefig('plot_results_multiple.png')

if __name__=='__main__':
    global_start_time = time.time()
    epochs  = 1
    seq_len = 50

    print('> Loading data... ')

    X_train, y_train, X_test, y_test = lstm.load_data('sp500.csv', seq_len, True)

    print('X_train shape:',X_train.shape)  #(3709L, 50L, 1L)
    print('y_train shape:',y_train.shape)  #(3709L,)
    print('X_test shape:',X_test.shape)    #(412L, 50L, 1L)
    print('y_test shape:',y_test.shape)    #(412L,)

    print('> Data Loaded. Compiling...')

    model = lstm.build_model([1, 50, 100, 1])

    model.fit(X_train,y_train,batch_size=512,nb_epoch=epochs,validation_split=0.05)

    multiple_predictions = lstm.predict_sequences_multiple(model, X_test, seq_len, prediction_len=50)
    print('multiple_predictions shape:',np.array(multiple_predictions).shape)   #(8L,50L)

    full_predictions = lstm.predict_sequence_full(model, X_test, seq_len)
    print('full_predictions shape:',np.array(full_predictions).shape)    #(412L,)

    point_by_point_predictions = lstm.predict_point_by_point(model, X_test)
    print('point_by_point_predictions shape:',np.array(point_by_point_predictions).shape)  #(412L)

    print('Training duration (s) : ', time.time() - global_start_time)

    plot_results_multiple(multiple_predictions, y_test, 50)
    plot_results(full_predictions,y_test,'full_predictions')
    plot_results(point_by_point_predictions,y_test,'point_by_point_predictions')

 

有关博客:

word=jieba.cut(m,cut_all=False)

pca=PCA(n_components=1)

然后操作特征提取,能够利用NLTK中的stopwords先去除停用词。假如有亟待,能够对文本实行向计量化验处理,这里大家能够运用Bag of Words,选用TF-IDF进行基于权重的向量转化,也能够行使Word2Vec实行基于相似度的转账。接下来,使用sklearn包中的pca实行降维:

newData=pca.fit_transform(data)

pca=PCA(n_components=1)

除开pca,还足以挑选采用互消息依然消息熵等其余办法。

newData=pca.fit_transform(data)

日后,大家开始展览分拣算法模型演练和模型评估,能够使用节约财富贝叶斯(NaiveBayes),决策树(Decision Tree)等NLTK 自带的机械学习方法。

除了这一个之外pca,还足以选取选取互消息照旧消息熵等其它办法。

使用宝马X3实生势感极性剖析

之后,大家实行归类算法模型陶冶和模型评估,能够行使节约能源贝叶斯(NaiveBayes),决策树(Decision Tree)等NLTK 自带的机器学习方法。

率先要求对数据举行预处理,安装ENVISIONwordseg/rJava(在那之中有好些个坑)三个包;

使用Tiguan实市场价格感极性分析

拓展数据清理清除掉没用的暗记后,举办分词:驭胜wordseg中的segmentCN方法能够对中文实行分词。当然,也得以选取jiebaEvoque;

第一供给对数码举行预管理,安装帕杰罗wordseg/rJava(当中有好多坑)五个包;

接下去构建单词-文书档案-标签数据集,去除停用词;

开展数量清理清除掉没用的标识后,实行分词:中华Vwordseg中的segmentCN方法能够对汉语进行分词。当然,也能够使用jiebaPAJERO;

创设文书档案-词项矩阵,能够挑选TermDocumentMatrix,使用weightTfIdf方法猎取tf-idf矩阵;

接下去构建单词-文书档案-标签数据集,去除停用词;

最后用e1071包中的贝叶斯方法开始展览文本分类,恐怕能够用RTextTools包中的其余机器学习算法来完结分类,个中蕴含九种算法:BAGGING(ipred:bagging):bagging集成分类

开创文书档案-词项矩阵,能够选择TermDocumentMatrix,使用weightTfIdf方法得到tf-idf矩阵;

BOOSTING (caTools:LogitBoost):Logit Boosting 集成分类

最后用e1071包中的贝叶斯方法开始展览文本分类,大概能够用RTextTools包中的其余机器学习算法来产生分类,当中包蕴九种算法:BAGGING(ipred:bagging):bagging集成分类

GLMNET(glmnet:glmnet):基于最大似然的广义线性回归

BOOSTING (caTools:LogitBoost):Logit Boosting 集成分类

MAXENT(maxent:maxent):最大熵模型

GLMNET(glmnet:glmnet):基于最大似然的广义线性回归

NNET(nnet:nnet) :神经网络

MAXENT(maxent:maxent):最大熵模型

陆风X8F(randomForest:randomForest):随机森林

NNET(nnet:nnet) :神经网络

SLDA(ipred:slda):scaled 线性判定深入分析

EnclaveF(randomForest:randomForest):随机森林

SVM(e1071:svm) :支持向量机

SLDA(ipred:slda):scaled 线性剖断深入分析

TREE (tree:tree):递归分类树

SVM(e1071:svm) :补助向量机

2.时序剖判:

TREE (tree:tree):递归分类树

光阴系列解析是依靠系统观看获得的小时系列数据,通过曲线拟合和参数臆想来创设数学模型的辩白和方法,经常用于金融领域、气象预测、市镇深入分析领域等。大切诺基语言具有众多先后包可用以拍卖准绳和窘迫时间种类,由此更有优势。

2.时序深入分析:

Python张开时序深入分析的经常用ALacrosseIMA(p,d,q)模型,个中d指的是差分项,p和q分别代表自回归项和运动平均项。营造AOdysseyIMA模型使用最多的就是statsmodels模块,该模块能够用来开展时间种类的差分,建立模型和模型的核准。这里例举叁个周期性预测的例证:

时光类别深入分析是依附系统观望得到的时刻种类数据,通过曲线拟合和参数揣测来创建数学模型的驳斥和方法,常常用于金融领域、气象预测、市肆剖析领域等。奥迪Q5语言拥有众多先后包可用于拍卖准则和难堪时间连串,由此更有优势。

上边是一组数据,代表U.S.A.某公共交通集团发表的五十年知命之年年的司乘人士相关数据(比如一九五〇-三千):

Python实行时序剖判的常常用A揽胜极光IMA(p,d,q)模型,在那之中d指的是差分项,p和q分别代表自回归项和移动平均项。构建A安德拉IMA模型使用最多的便是statsmodels模块,该模块能够用来实行时间体系的差分,建立模型和模型的检查。这里例举三个周期性预测的事例:

data = [9930, 9318, 9595, 9972, 6706, 5756, 8092, 9551, 8722, 9913, 10151, 7186, 5422, 5337, 10649, 10652, 9310, 11043, 6937, 5476, 8662, 8570, 8981, 8331, 8449, 5773, 5304, 8355, 9477, 9148, 9395, 10261, 7713, 6299, 9424,9795, 10069, 10602, 10427, 8095, 6707, 9767, 11136, 11812, 11006, 11528, 9329, 6818, 10719, 10683]

上边是一组数据,代表花旗国某公共交通集团表露的五十年中每年的游客相关数据(举例1946-3000):

1).首先,使用pandas举办拍卖和仓库储存数据:

data = [9930, 9318, 9595, 9972, 6706, 5756, 8092, 9551, 8722, 9913, 10151, 7186, 5422, 5337, 10649, 10652, 9310, 11043, 6937, 5476, 8662, 8570, 8981, 8331, 8449, 5773, 5304, 8355, 9477, 9148, 9395, 10261, 7713, 6299, 9424,9795, 10069, 10602, 10427, 8095, 6707, 9767, 11136, 11812, 11006, 11528, 9329, 6818, 10719, 10683]

data=pd.Series(data)

1).首先,使用pandas进行管理和仓库储存数据:

2).然后须要对数据开始展览平稳性查证,一般采取单位根核算,常用的措施有ADF、DFGLS、PP等等:

data=pd.Series(data)

Python中一贯用ADF(data), DFGLS(data)就可以得出pvalue的结果

2).然后须求对数码进行平稳性核实,一般选取单位根核算,常用的法门有ADF、DFGLS、PP等等:

3).体系平稳性是开始展览时间体系分析的前提条件,借使上一个步骤显示结果不平稳,就须求对时间种类做平稳性管理,一般用差分法最多:

Python中平素用ADF(data), DFGLS(data)就能够得出pvalue的结果

diff1 = data.diff(2)

3).系列平稳性是张开时间类别深入分析的前提条件,假诺上贰个手续显示结果不安宁,就须要对时间体系做平稳性处理,一般用差分法最多:

其间diff(object)表示差分的阶数,这里大家接纳2阶,当然你也得以用1阶、3阶、4阶等等

diff1 = data.diff(2)

4).进行白噪声核实:

其间diff(object)表示差分的阶数,这里大家运用2阶,当然你也得以用1阶、3阶、4阶等等

value=acorr_ljungbox(data,lags=1)

4).实行白噪声核实:

5).将来,大家的AQX56IMA(p,d,q)中的d=2,接下去大家进行模型选取。第一步是计量出p和q,首先检查平稳时间种类的自相关图和偏自相关图,通过sm.graphics.tsa.plot_acf (data)和sm.graphics.tsa.plot_pacf(data),然后经过周到意况开始展览模型采取,可供采用的有ARubicon,MA,ARMA,ALX570IMA。

value=acorr_ljungbox(data,lags=1)

6).模型陶冶:model=sm.tsa.ARMA(data,(p,d,q)).fit(),此处用ARMA模型测算出p和q,从而练习出模型。

5).未来,大家的A本田CR-VIMA(p,d,q)中的d=2,接下去我们开始展览模型选用。第一步是测算出p和q,首先检查平稳时间连串的自相关图和偏自相关图,通过sm.graphics.tsa.plot_acf (data)和sm.graphics.tsa.plot_pacf(data),然后通过周到情况开始展览模型选用,可供采纳的有ALX570,MA,ARMA,A奥迪Q5IMA。

用大切诺基来营造时间体系模型

6).模型操练:model=sm.tsa.ARMA(data,(p,d,q)).fit(),此处用ARMA模型测算出p和q,从而演练出模型。

Koleos针对时间连串有五花八门的工具包,比方:

澳门新浦京娱乐场网站,用奥迪Q5来创设时间种类模型

library(xts),library(timeSeires),library(zoo)—时间基础包

Sportage针对时间体系有五光十色的工具包,举例:

library(urca)--举办单位根查证

library(xts),library(timeSeires),library(zoo)—时间基础包

library(tseries)--arma模型

library(urca)--进行单位根核查

library(fUnitRoots)--进行单位根核算

library(tseries)--arma模型

library(FinTS)--调用在这之中的自回归核算函数

library(fUnitRoots)--进行单位根核实

library(fGarch)--GARCH模型

library(FinTS)--调用个中的自回归核查函数

library(nlme)--调用个中的gls函数

library(fGarch)--GARCH模型

library(fArma)--实行拟合和核算

library(nlme)--调用在那之中的gls函数

library(forecast)—arima建模

library(fArma)--实行拟合和检查

上边小编介绍一下Sportage语言中forecast工具包里面五个很有力的工具:ets和auto.arima。用户什么都无需做,那多少个函数会活动选取三个最适度的算法去剖析数据。比如用ets来拍卖:

library(forecast)—arima建模

fit<-ets(train)

下边笔者介绍一下ENVISION语言中forecast工具包里面四个很有力的工具:ets和auto.arima。用户什么都无需做,那七个函数会活动选取四个最贴切的算法去分析数据。譬喻用ets来拍卖:

accuracy(predict(fit,12),test)

fit<-ets(train)

或者用auto.arima处理:

accuracy(predict(fit,12),test)

fit<-auto.arima(train)

或者用auto.arima处理:

accuracy(forecast(fit,h=12),test)

fit<-auto.arima(train)

除外,forecast包中有指向抓实恐怕下跌趋势并且设有季节性波动的日子系列算法霍尔特-温特s。霍尔特-温特s的观念是把多少分解成八个成分:平均水平(level),趋势(trend),周期性(seasonality)。ENVISION里面四个总结的函数stl就能够把原本数据开始展览分解。

accuracy(forecast(fit,h=12),test)

正文首要从各自优势及具体育赛事例中剖判了Python与PAJERO二种编程语言。简单看出,二者在“综合实力”上难分伯仲,具体采用哪个种类深深学习,依然需求记挂本人实际期望化解的难点、应用的领域等等方面。最后款待我们就大数目编制程序语言相关难点与自家交换交流~

除了,forecast包中有针对性抓好或然降低趋势并且存在季节性波动的时光类别算法霍尔特-温特s。霍尔特-温特s的思念是把多少分解成八个成分:平均水平(level),趋势(trend),周期性(seasonality)。Enclave里面贰个轻便易行的函数stl就能够把本来数据实行分解。

本文主要从各自优势及具体育赛事例中剖判了Python与大切诺基二种编程语言。简单看出,二者在“综合实力”上难分伯仲,具体选取哪一类深深学习,依然须要思索本人实在期望化解的难点、应用的小圈子等等方面。最后款待大家就大数量编制程序语言相关难点与自家调换调换~

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:MA时间序列建模过程,大