python时间序列分析模块,用python实现ARIMA时间序列预测实例
如果某个观测序列通过序列预处理可以判断为平稳非白噪声序列,那么可以用ARMA模型对该序列进行建模。建模的基本步骤如下:
(1)求该观测序列的样本自相关系数(ACF)和样本偏自相关系数(PACF)的值。
(2)根据样本的自相关系数和偏自相关系数的性质,选择合适的ARMA(p,Q)模型进行拟合。
(3)估计模型中位置参数的值。
(4)检查模型的有效性。如果模型未能通过测试,转到步骤(2)并重新选择模型进行拟合。
(5)模型优化。如果拟合模型通过测试,它仍会转向(2)。充分考虑各种情况,建立多个试衣模型,从所有通过测试的试衣模型中选择最佳模型。
(6)利用拟合模型,预测序列的未来趋势。
二、代码实现
1.画出序列图,检查数据的大概分布。
trainSeting.head()
Out[36]:
日期
2017-10-01 126.4
2017-10-02 82.4
2017-10-03 78.1
2017-10-04 51.1
2017-10-05 90.9
名称:销售,数据类型:float64
plt.plot(训练设置)
2.稳定性试验
用于ADF验证
adf_test的返回值
测试统计:它代表测试统计。
p值:代表p值检验的概率。
滞后:使用滞后k,autolag=AIC将自动选择滞后。
使用的观察次数:样本数
临界值(5%):显著性水平为临界值5%。
(1)假设有单位根,即不稳定;
(2)显著性水平,1%:严格拒绝原假设;5%:拒绝原假设,10%以此类推。
(3)看P值和显著性水平A,如果P值小于显著性水平,则拒绝原假设,认为序列稳定;如果大于,就不能拒绝,就认为不稳定。
(4)看检验统计和临界值。如果检验统计量小于临界值,拒绝原假设,认为序列是稳定的;如果大于,就不能拒绝,就认为不稳定。
#滚动统计
定义滚动_统计(时间序列):
#确定滚动统计数据
rol mean=PD . rolling _ mean(time series,window=12)
rol STD=PD . rolling _ STD(time series,window=12)
#绘图滚动统计:
orig=plt.plot(时间序列,颜色=蓝色,标签=原始)
mean=plt.plot(rolmean,color=red ,label=滚动平均值)
std=plt.plot(rolstd,color=black ,label=Rolling Std )
plt.legend(loc=best )
plt.title(滚动平均标准偏差)
plt.show(block=False)
##ADF测试
从statsmodels.tsa.stattools导入adfuller
def adf_test(时间序列):
滚动_统计(时间序列)#绘图
打印(增强迪基-富勒试验的结果:)
dftest=adfuller(时间序列,自动标记=AIC )
df输出=pd。Series(dftest[0:4],index=[测试统计, p值, #Lags Used , Number of Observations Used])
对于键,值在dftest[4]中。项目():
output[ critical value(% s) % key]=value #增加以下重要级别的临界值。
打印(df输出)
Adf _ test (train setting) #从结果可以看出p值为0.10970.1,所以不能排斥H0,认为这个序列不是平稳序列。
返回的结果如下
增强迪基-富勒试验的结果:
测试统计?-5.718539e 00
p值?7.028398e-07
#使用的滞后?0.000000e 00
使用的观察次数6.200000e 01
临界值(1%)?-3.540523e 00
临界值(5%)?-2.909427e 00
临界值(10%)?-2.592314e 00
数据类型:float64
从上面可以看出,p值小于0.05,可以认为是平稳时间序列。
3.白噪声测试
acorr _ ljungbox (x,lags=none,boxpierce=false)函数测试没有自相关。
Lag是延迟周期的数量。如果是整数,则是包含的延迟周期数。如果是列表或数组,所有的时滞都包含在列表中最大的时滞中。
当boxpierce为True时,意味着除了返回LB统计信息外,还将返回Box和pierce的Q统计信息。
返回值:
Lbvalue:测试的统计数据。
P值:基于卡方分布的P统计量
bpvalue:((optionsal),float或array)-Box-Pierce测试的测试统计
bppvalue:((可选),float或array)-基于卡方分布的盒-皮尔斯测试的p值
从statsmodels.stats.diagnostic导入acorr_ljungbox
定义测试_随机(ts,滞后):
p_value=acorr_ljungbox(ts,lags=lag) #lags可自定义
返回p值
随机测试(训练,[6,12])
出[62]:(数组([13.28395274,14.89281684]),数组([0.03874194,0.24735042])
从上面的分析结果中可以看到,延迟6阶的p值为0.030.05,因此可以拒绝原假设,认为该序列不是白噪声序列。
4、确定ARMA的阶数
(1)利用自相关图和偏自相关图
####自相关图高级通信功能高级通信功能和偏相关图聚氯化铝铁
将statsmodels.api作为钐导入
def acf_pacf_plot(ts_log_diff):
sm。图形。运输安全管理局。plot _ ACF(ts _ log _ diff,lags=40)# ARIMA q
sm。图形。运输安全管理局。plot _ pacf(ts _ log _ diff,lags=40) #ARIMA
acf_pacf_plot(训练设置)#查看数据的自相关图和偏自相关图
(2)借助AIC、BIC统计量自动确定
##借助AIC、BIC统计量自动确定
从statsmodels.tsa.arima_model导入ARMA
def proper_model(data_ts,maxLag):
init_bic=float(inf )
init_p=0
init_q=0
init_properModel=无
对于np.arange(maxLag)中的p:
对于np.arange(maxLag)中的问:
model=ARMA(data_ts,order=(p,q))
尝试:
results_ARMA=model.fit(disp=-1,method=css )
除了:
继续
bic=结果_ARMA.bic
if bic init_bic:
init_p=p
init_q=q
init_properModel=results_ARMA
初始化bic=bic
返回初始化bic,初始化p,初始化q,初始化正确模型
固有_模型(训练设置,40)
#在统计模型包里还有更直接的函数:
将statsmodels.tsa.stattools导入为标准时间
order=ST . ARMA _ order _ select _ IC(ts _ log _ diff 2,max_ar=5,max_ma=5,ic=[aic , bic , hqic])
订单。bic _最小订单
我们常用的是美国化学师学会(美国化学家协会)准则,AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(过度拟合)的情况。所以优先考虑的模型应是美国化学师学会(美国化学家协会)值最小的那一个模型。
为了控制计算量,我们限制阿肯色州最大阶不超过5、马最大阶不超过5。但是这样带来的坏处是可能为局部最优。
时间序列是待输入的时间序列,是熊猫。系列类型,最大值ar、最大值妈是p、q值的最大备选值。
订单。bic _最小订单返回以比克准则确定的阶数,是一个元组类型
返回值如下:
订单。bic _最小订单
Out[13]: (1,0)
5、建模
从上述结果中可以看到,可以选择AR(1)模型
################################模型######################################
# AR模型,q=0
#RSS是残差平方和
#显示为-1代表不输出收敛过程的信息,真的代表输出
从statsmodels.tsa.arima_model导入阿里马
模型=ARIMA(训练设置,顺序=(1,0,0)) #第二个参数代表使用了二阶差分
results_AR=model.fit(disp=-1)
plt.plot(训练设置)
PLT。绘图(results _ ar。拟合值,color=red) #红色线代表预测值
PLT。标题( RSS:%。4f % sum((results _ ar。安装值-列车设置)* * 2))#残差平方和
6、预测未来走势
############################预测未来走势##########################################
#预测方法会自动进行差分还原,当然仅限于支持的一阶和2阶差分
forecast_n=12 #预测未来12个天走势
预测_AR=结果_AR.forecast(forecast_n)
预测_AR=预测_AR[0]
打印(预测_AR)
打印(预测_ ARIMA _日志)
[90.49452199 84.05407353 81.92752342 81.22536496 80.99352161 80.91697003
80.89169372 80.88334782 80.88059211 80.87968222 80.87938178 80.87928258]
##将预测的数据和原来的数据绘制在一起,为了实现这一目的,我们需要增加数据索引,使用开源库箭头:
导入箭头
定义获取日期范围(开始,限制,级别=天,格式=YYYY-MM-DD ):
start=arrow.get(开始,格式)
result=(list(map(lambda dt:dt。格式(格式),箭头.箭头.范围(级别,开始,限制=限制))))
日期解析2=lambda日期:PD。日期时间。strptime(日期, %Y-%m-%d )
返回映射(日期解析2,结果)
# 预测从2017-12-03开始,也就是我们训练数据最后一个数据的后一个日期
new _ index=get _ date _ range( 2017-12-03 ,forecast_n)
预测_ ARIMA _日志=pd .系列(forecast_AR,copy=True,index=new_index)
打印(forecast_ARIMA_log.head())
##绘图如下
plt.plot(训练设置,标签=原始,颜色=蓝色)
plt.plot(预测阿里马日志,标签=预测,颜色=红色)
plt.legend(loc=best )
计划标题(“预测”)
以上利用python实现稳定时间序列的建模方法就是边肖分享的全部内容。希望能给你一个参考和支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。