全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
859 0
2020-12-17
如何在Python中为时间序列预测创建ARIMA模型
ARIMA模型是一种流行且广泛使用的时间序列预测统计方法。指数平滑和ARIMA模型是时间序列预测中使用最广泛的两种方法,并为问题提供了补充方法。指数平滑模型是基于对数据趋势和季节性的描述,而ARIMA模型旨在描述数据中的自相关。
要了解季节性,请参考此博客。
在讨论ARIMA模型之前,让我们先讨论平稳性的概念和微分时间序列的技术。
平稳性
固定时间序列数据是其属性不依赖于时间的数据,这就是为什么具有趋势或季节性的时间序列不是固定的。趋势和季节性将在不同时间影响时间序列的值。另一方面,对于平稳性而言,观察它并不重要,它在任何时间点都应该看起来非常相似。通常,长期而言,平稳的时间序列将没有可预测的模式。
ARIMA是首字母缩写词,代表自动回归综合移动平均线。它是一类模型,可在时间序列数据中捕获一组不同的标准时间结构。
在本教程中,我们将讨论如何为Python中的时间序列预测开发ARIMA模型。
ARIMA模型是用于分析和预测时间序列数据的一类统计模型。使用起来确实很简单,但是此模型非常强大。
ARIMA代表自回归综合移动平均线。
ARIMA模型的参数定义如下:
p:模型中包含的滞后观察次数,也称为滞后阶数。
d:原始观测值相差的次数,也称为相异度。
q:移动平均窗口的大小,也称为移动平均的顺序。
构建包含指定数量和类型的项的线性回归模型,并通过一定程度的差异来准备数据,以使其保持平稳,即消除对回归模型产生负面影响的趋势和季节结构。
脚步
1.可视化时间序列数据
2.确定日期是否固定
3.绘制相关图和自相关图
4.根据数据构建ARIMA模型或季节性ARIMA
开始吧
将numpy导入为np
将熊猫作为pd导入
导入matplotlib.pyplot作为plt
%matplotlib内联
在本教程中,我使用以下数据集。
df = pd.read_csv('time_series_data.csv')
df.head()
#更新标题
df.columns = [“ Month”,“ Sales”]
df.head()
df.describe()
df.set_index('Month',inplace = True)
从pylab导入rcParams
rcParams ['figure.figsize'] = 15,7
df.plot()
有马
如果我们看到上面的图表,那么我们将能够找到一种趋势,即有时候销售很高,反之亦然。这意味着我们可以看到数据遵循季节性。对于ARIMA,我们要做的第一件事就是确定数据是固定的还是非固定的。如果数据不稳定,我们将尝试使其保持平稳,然后我们将进一步处理。
让我们检查给定的数据集是否稳定,为此,我们使用adfuller。
从statsmodels.tsa.stattools导入adfuller
我已经通过运行上面的代码导入了adfuller。
test_result = adfuller(df ['Sales'])
为了确定数据的性质,我们将使用原假设。
H0:零假设:这是一个关于总体的陈述,或者被认为是正确的,或者被用来提出一个论点,除非在合理的怀疑之前可以证明它是不正确的。
H1:另一种假设:关于总体的主张与H 0和我们拒绝H 0时得出的结论矛盾。
#Ho:不平稳
#H1:静止
我们将考虑数据不是平稳的原假设和数据是平稳的替代假设。
def adfuller_test(销售):
    result = adfuller(销售)
    标签= ['ADF测试统计','p值','使用#滞后','观察数']
    对于值,zip中的标签(结果,标签):
        print(label +':'+ str(value))
如果result [1] <= 0.05:
    打印(“强有力的证据反对原假设(Ho),拒绝原假设。数据是固定的”)
其他:
    打印(“针对原假设的弱证据,表明它是非平稳的”)
adfuller_test(df ['Sales'])
运行上面的代码后,我们将获得P值,
ADF测试统计:-1.8335930563276237
p值:0.3639157716602447
#使用的滞后:11
观察数:93
在这里,P值为0.36,大于0.05,这意味着数据正在接受原假设,这意味着数据是不稳定的。
让我们尝试看一下第一眼的差异和季节性的差异:
df ['Sales First Difference'] = df ['Sales']-df ['Sales']。shift(1)
df ['Seasonal First Difference'] = df ['Sales']-df ['Sales']。shift(12)
df.head()
#再次测试数据是否稳定
adfuller_test(df ['Seasonal First Difference']。dropna())
ADF测试统计:-7.626619157213163
p值:2.060579696813685e-11
#使用的延迟:0
观察数:92
这里P值为2.06,这意味着我们将拒绝原假设。因此数据是固定的。
df ['Seasonal First Difference']。plot()
我将创建自相关:
从pandas.plotting导入autocorrelation_plot
autocorrelation_plot(df ['Sales'])
plt.show()
从statsmodels.graphics.tsaplots导入plot_acf,plot_pacf
导入statsmodels.api作为sm
无花果= plt.figure(figsize =(12
ax1 = fig.add_subplot(211)
无花果= sm.graphics.tsa.plot_acf(df ['Seasonal First Difference']。dropna(),lags = 40,ax = ax1)
ax2 = fig.add_subplot(212)
无花果= sm.graphics.tsa.plot_pacf(df ['Seasonal First Difference']。dropna(),lags = 40,ax = ax2)
#用于非季节性数据
#p = 1,d = 1,q = 0或1
从statsmodels.tsa.arima_model导入ARIMA
模型= ARIMA(df ['Sales'],order =(1
model_fit = model.fit()
model_fit.summary()
ARIMA模型结果
部门 变量:D.销售号观察:104
模型:ARIMA(1、1、1)对数似然-951.126
方法:css-mle创新SD2227.262
日期:2020年10月28日星期三AIC1910.251
时间:11:49:08工商银行1920.829
样品:1964年2月1日总部1914.536
– 1972/09/01
ef标准错误?P> | z |[0.0250.975]
const22.784512.4051.8370.066-1.52947.098
L.D.D.销售0.43430.0894.8660.0000.2590.609
MA L1.D.销售-1.00000.026-38.5030.000-1.051-0.949
根源
真实假想模量频率
AR.12.3023+ 0.0000j2.30230.0000
MA.11.0000+ 0.0000j1.00000.0000
df ['forecast'] = model_fit.predict(start = 90,end = 103,dynamic = True)
df [['Sales','forecast']]。plot(figsize =(12
有马
导入statsmodels.api作为sm
模型= sm.tsa.statespace.SARIMAX(df ['Sales'],order =(1,1,1),seasonal_order =(1
结果= model.fit()
df ['forecast'] = results.predict(start = 90,end = 103,dynamic = True)
df [['Sales','forecast']]。plot(figsize =(12
有马
从pandas.tseries.offsets导入DateOffset
future_dates = [df.index [-1] + DateOffset(months = x)for x in range(0
future_datest_df = pd.DataFrame(index = future_dates [1:],columns = df.columns)
future_datest_df.tail()
future_df = pd.concat([df,future_datest_df])
future_df ['forecast'] = results.predict(开始= 104,结束= 120,动态= True)
future_df [['Sales','precast']]。plot(figsize =(12,8))
有马
结论
当我们必须做出未来的决定或进行分析时,时间序列预测确实非常有用,我们可以使用ARIMA快速进行此操作,还有许多其他模型可以进行时间序列预测,但是ARIMA确实很容易理解。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群