ARIMA模型预测餐厅销量

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
from matplotlib.pylab import style                                   # 自定义图表风格
style.use('ggplot')
# 解决中文的显示问题
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf         # 自相关图、偏自相关图
from statsmodels.tsa.stattools import adfuller as ADF                # 平稳性检验
from statsmodels.stats.diagnostic import acorr_ljungbox              # 白噪声检验
import statsmodels.api as sm                                         # D-W检验,一阶自相关检验
from statsmodels.graphics.api import qqplot                          # 画QQ图,检验一组数据是否服从正态分布
from statsmodels.tsa.arima_model import ARIMA

1、导入数据 

sale = pd.read_excel('./arima_data.xls', index_col='日期')
sale.head()

sale.info()
print('-----')
sale.销量 = sale.销量.astype('float')
sale.info()

2、原始序列检验

· 时序图

plt.figure(figsize=(10,5))
sale.plot()
plt.show()
 
#解读:具有单调递增趋势,则是非平稳序列。

· 自相关图

plot_acf(sale, lags=35).show()
 
#解读:自相关系数长期大于零,没有趋向于零,说明序列间具有很强的长期相关性。

· 平稳性检验

#方法:单位根检验
 
print('原始序列的ADF检验结果为:',ADF(sale.销量))
 
#解读:P值大于显著性水平α(0.05),接受原假设(非平稳序列),说明原始序列是非平稳序列。

第一个是adf检验的结果。 第二个是统计量的P值。 第三个是计算过程中用到的延迟阶数。 第四个是用于ADF回归和计算的观测值的个数。 第五个是配合第一个一起看的,是在99%,95%,90%置信区间下的临界的ADF检验的值。

原文链接:adfuller函数返回值的参数说明与记录

3、一阶差分序列检验

d1_sale = sale.diff(periods=1, axis=0).dropna()
 
#时序图
plt.figure(figsize=(10,5))
d1_sale.plot()
plt.show()
#解读:在均值附件比较平稳波动
 
#自相关图
plot_acf(d1_sale, lags=34).show()
#解读:有短期相关性,但趋向于零。
 
#平稳性检验
print('原始序列的ADF检验结果为:',ADF(d1_sale.销量))
 
#解读:P值小于显著性水平α(0.05),拒绝原假设(非平稳序列),说明一阶差分序列是平稳序列。

· 白噪声检验

print('一阶差分序列的白噪声检验结果为:',acorr_ljungbox(d1_sale, lags=1))#返回统计量、P值
 
#解读:p值小于0.05,拒绝原假设(纯随机序列),说明一阶差分序列是非白噪声序列。

4、定阶

· 参数调优:人工判别

d1_sale = sale.diff(periods=1, axis=0).dropna()
 
#自相关图
plot_acf(d1_sale, lags=34).show()
 
#解读:有短期相关性,但趋向于零。
 
#偏自相关图
plot_pacf(d1_sale, lags=10).show()
 
 
#偏自相关图
plot_pacf(d1_sale, lags=17).show()
 
#解读:自相关图,1阶截尾;偏自相关图,拖尾。则ARIMA(p,d,q)=ARIMA(0,1,1)

· 参数调优:BIC

pmax = int(len(d1_sale) / 10) #一般阶数不超过length/10
qmax = int(len(d1_sale) / 10) #一般阶数不超过length/10
pmax
qmax

bic_matrix = []
for p in range(pmax   1):
    tmp = []
    for q in range(qmax   1):
        try:
            tmp.append(ARIMA(tuple(sale), (p, 1, q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix)
bic_matrix

bic_matrix.stack()

p,q=bic_matrix.stack().idxmin() #最小值的索引
print('用BIC方法得到最优的p值是%d,q值是%d'%(p,q))

· 参数调优:AIC

pmax = int(len(d1_sale )/ 10) #一般阶数不超过length/10
qmax = int(len(d1_sale) / 10) #一般阶数不超过length/10
 
aic_matrix = []
for p in range(pmax   1):
    tmp = []
    for q in range(qmax   1):
        try:
            tmp.append(ARIMA(tuple(sale), (p, 1, q)).fit().aic)
        except:
            tmp.append(None)
    aic_matrix.append(tmp)
aic_matrix = pd.DataFrame(aic_matrix)
p,q = aic_matrix.stack().idxmin() #最小值的索引
print('用AIC方法得到最优的p值是%d,q值是%d'%(p,q))

5、建模及预测

· 建模

#创建模型
model = ARIMA(tuple(sale), (0, 1, 1)).fit()
#查看模型报告
model.summary2()

· 残差检验

resid = model.resid
 
#自相关图
plot_acf(resid, lags=35).show()
 
#解读:有短期相关性,但趋向于零。
 
#偏自相关图
plot_pacf(resid, lags=10).show()
 
#偏自相关图
plot_pacf(resid, lags=17).show()

· QQ图

qqplot(resid, line='q', fit=True).show() 
 
#解读:残差服从正态分布,均值为零,方差为常数

· D-W检验

德宾-沃森检验,简称D-W检验,是目前检验自相关性最常用的方法,但它只适用于检验一阶自相关性。 因为自相关系数ρ的值介于-1和1之间,所以 0≤DW≤4。

  • 并且DW=O <=> ρ=1  即存在正自相关性
  • DW=4 <=> ρ=-1 即存在负自相关性
  • DW=2 <=> ρ=0  即不存在(一阶)自相关性

因此,当DW值显著的接近于O或4时,则存在自相关性,而接近于2时,则不存在(一阶)自相关性。

print('D-W检验的结果为:',sm.stats.durbin_watson(resid.values))  
 
#解读:不存在一阶自相关

· Ljung-Box检验

Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。LB检验则是基于一系列滞后阶数,判断序列总体的相关性或者说随机性是否存在。

时间序列中一个最基本的模型就是高斯白噪声序列。而对于ARIMA模型,其残差被假定为高斯白噪声序列,所以当我们用ARIMA模型去拟合数据时,拟合后我们要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么就说明ARIMA模型也许并不是一个适合样本的模型。

检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶),如果检验概率小于给定的显著性水平,比如0.05、0.10等就拒绝原假设,其原假设是相关系数为零。

# 方法一
print('残差序列的白噪声检验结果为:',acorr_ljungbox(resid,lags=1))#返回统计量、P值
 
#解读:残差是白噪声

# 方法二
confint,qstat,pvalues = sm.tsa.acf(resid.values, qstat=True) #qstat is Ljung-Box Q-Statistic. confint is  Confidence intervals for the ACF
data = np.c_[range(1,36), confint[1:], qstat, pvalues]
table = pd.DataFrame(data, columns=['lag', "confint", "qstat", "pvalues(>Q)"])
print(table.set_index('lag'))

· 预测

#预测
print('未来7天的销量预测:')
model.forecast(7) #预测、标准差、置信区间

forecast = pd.Series(model.forecast(7)[0], index=pd.date_range('2015-2-7', periods=7, freq='D'))
forecast

data = pd.concat((sale, forecast), axis=0)
data.columns = ['销量', '未来7天销量']
plt.figure(figsize = (10,5))
data.plot()
plt.show()

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

时间序列分析之ARIMA模型预测餐厅销量的更多相关文章

  1. 使用Swift进行生长时间序列的峰值检测

    有人会有一个很好的算法来测量使用Swift增长时间序列数据的峰值吗?还要注意我已经关闭了负信号,因为OP的目的我们只想要正信号.SWIFT代码:对于样本数据的结果:更新您可以通过对平均值和标准差的滞后使用不同的值来提高算法的性能.例如.:然后使用例如let=Thresholdingalgo可以给出更好的结果:DEMO

  2. 时间序列分析之ARIMA模型预测餐厅销量

    这篇文章主要介绍了时间序列分析之ARIMA模型预测餐厅销量,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. PyTorch搭建LSTM实现时间序列负荷预测

    这篇文章主要为大家介绍了PyTorch搭建LSTM实现时间序列负荷预测,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. pandas时间序列之如何将int转换成datetime格式

    这篇文章主要介绍了pandas时间序列之如何将int转换成datetime格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  5. python目标检测yolo2详解及预测代码复现

    这篇文章主要为大家介绍了python目标检测yolo2详解及其预测代码复现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  6. python目标检测yolo3详解预测及代码复现

    这篇文章主要为大家介绍了python目标检测yolo3详解预测及代码复现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. Python与AI分析时间序列数据

    预测给定输入序列中的下一个是机器学习中的另一个重要概念.本章为您提供有关分析时间序列数据的详细说明,有需要的朋友可以借鉴参考下,希望能够有所帮助

  8. Python中LSTM回归神经网络时间序列预测详情

    这篇文章主要介绍了Python中LSTM回归神经网络时间序列预测详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

  9. Python+SimpleRNN实现股票预测详解

    这篇文章主要为大家详细介绍了如何利用Python和SimpleRNN实现股票预测效果,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下

  10. 在电力智能测量数据应用中的分层时间序列预测正则化Regularization in Hierarchical Time Series Forecasting with Application to

    电力需求数据经常呈现分层结构。在预测合计电量需求问题上有大量的文献。一层中的不同的时间序列可能会以一种变化的复杂的方式互相影响。特殊来说,不同层的时间序列可能包含完全不同的模式。最简单的预测分层数据的方法就是把底层的单独的序列预测加起来。然而在高维误差协方差矩阵中高维的非惩罚回归和预估误差可能导致调整预测的不确定性的增加,从而预测表现变差。

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部