动手实战 | Statsmodels 中经典的11种时间序列预测方法
Posted Python学习与数据挖掘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动手实战 | Statsmodels 中经典的11种时间序列预测方法相关的知识,希望对你有一定的参考价值。
欢迎关注 ,专注Python、数据分析、数据挖掘、好玩工具!
Statsmodels库是Python中一个强大的统计分析库,包含假设检验、回归分析、时间序列分析等功能,能够很好的和Numpy和Pandas等库结合起来,提高工作效率。
本文翻译自Jason Brownlee博士的一篇博文,介绍11种statsmodel中可以进行时间序列预测的方法,包括试用的场景与python代码。需要的朋友收藏。
11 种不同的经典时间序列预测方法包括:
-
Autoregression (AR)
-
Moving Average (MA)
-
Autoregressive Moving Average (ARMA)
-
Autoregressive Integrated Moving Average (ARIMA)
-
Seasonal Autoregressive Integrated Moving-Average (SARIMA)
-
Seasonal Autoregressive Integrated Moving-Average with Exogenous Regressors (SARIMAX)
-
Vector Autoregression (VAR)
-
Vector Autoregression Moving-Average (VARMA)
-
Vector Autoregression Moving-Average with Exogenous Regressors (VARMAX)
-
Simple Exponential Smoothing (SES)
-
Holt Winter’s Exponential Smoothing (HWES)
有关Statsmodel的更多信息,可以参阅官方文档:
https://pypi.org/project/statsmodels/
AutoRegression
自回归方法适用于没有趋势和季节性成分的单变量时间序列。
该方法将序列中的下一步预测结果为先前时间步长观测值的线性函数。
模型的符号:模型 p 的阶数作为 AR 函数的参数,即 AR§。例如,AR(1) 是一阶Autoregression model(自回归模型)。
Python代码如下:
# AR example
from statsmodels.tsa.ar_model import AutoReg
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = AutoReg(data, lags=1)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
Moving Average
滑动平均方法适用于没有趋势和季节性成分的单变量时间序列。
该方法将序列中的下一步预测结果为来自先前时间步骤的平均过程的残差的线性函数。Moving Average模型不同于计算时间序列的移动平均。
模型的符号:将模型 q 的阶指定为 MA 函数的参数,即 MA(q)。例如,MA(1) 是一阶Moving Average模型。
Python代码如下:
# MA example
from statsmodels.tsa.arima.model import ARIMA
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ARIMA(data, order=(0, 0, 1))
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
ARMA
ARMA方法适用于没有趋势和季节性成分的单变量时间序列。
ARMA 方法将序列中的下一步预测结果为先前时间步的观测值和残差的线性函数。它结合了AR 和MA 模型。
模型的符号:AR§ 和 MA(q) 模型的阶数作为 ARMA 函数的参数,例如 ARMA(p, q)。ARIMA 模型可用于开发 AR 或 MA 模型。
Python代码如下:
from statsmodels.tsa.arima.model import ARMA
from random import random
# contrived dataset
data = [random() for x in range(1, 100)]
# fit model
model = ARMA(data, order=(2, 1))
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
ARIMA
ARIMA方法适用于有趋势且无季节性成分的单变量时间序列。
ARIMA方法将序列中的下一步建模为先前时间步长的差分观测值和残差的线性函数。ARIMA结合了AR和MA模型以及序列的差分预处理步骤,使序列平稳。
模型的符号:指定 AR§、I(d) 和 MA(q) 模型的阶数作为 ARIMA 函数的参数,例如 ARIMA(p, d, q)。ARIMA 模型还可用于开发 AR、MA 和 ARMA 模型。
Python代码如下:
# ARIMA example
from statsmodels.tsa.arima.model import ARIMA
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data), typ='levels')
print(yhat)
SARIMA
Seasonal Autoregressive Integrated Moving-Average (SARIMA)方法适用于具有趋势 且/或 季节性成分的单变量时间序列。
SARIMA方法将序列中的下一步预测值为先前时间步长的差异观测值、误差、差异季节性观测值和季节性误差的线性函数。SARIMA将 ARIMA 模型与在季节性水平上执行相同的自回归、差分和移动平均建模的能力相结合。
模型的符号:指定 AR§、I(d) 和 MA(q) 模型的阶数作为 ARIMA 函数和 AR§、I(D)、MA(Q) 和 m 的参数季节级别的参数,例如 SARIMA(p, d, q)(P, D, Q)m 其中“m”是每个季节(季节期间)的时间步长数。SARIMA 模型可用于开发 AR、MA、ARMA 和 ARIMA 模型。
Python代码如下:
# SARIMA example
from statsmodels.tsa.statespace.sarimax import SARIMAX
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = SARIMAX(data, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
SARIMAX
Seasonal Autoregressive Integrated Moving-Average with Exogenous Regressors (SARIMAX)适用于具有趋势 且/或 季节性成分以及外生变量的单变量时间序列。
SARIMAX 模型 是 SARIMA 模型的扩展,其中还包括外生变量的建模。
外生变量也称为协变量,可以被认为是并行输入序列,它们在与原始序列相同的时间步长中进行观察。初级序列可被称为内源数据以将其与外源序列进行对比。外生变量的观测值在每个时间步直接包含在模型中,并且不以与主要内生序列相同的方式建模(例如作为 AR、MA 等过程)。
SARIMAX 方法也可用于对包含外生变量的包含模型进行建模,例如 ARX、MAX、ARMAX 和 ARIMAX。
Python代码如下:
# SARIMAX example
from statsmodels.tsa.statespace.sarimax import SARIMAX
from random import random
# contrived dataset
data1 = [x + random() for x in range(1, 100)]
data2 = [x + random() for x in range(101, 200)]
# fit model
model = SARIMAX(data1, exog=data2, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))
model_fit = model.fit(disp=False)
# make prediction
exog2 = [200 + random()]
yhat = model_fit.predict(len(data1), len(data1), exog=[exog2])
print(yhat)
VAR
Vector Autoregression (VAR) 该方法适用于没有趋势和季节性成分的多元时间序列。
VAR 方法使用 AR 模型对每个时间序列的下一步进行建模。它是 AR 对多个并行时间序列的推广,例如多元时间序列。
模型的符号:指定 AR§ 模型的阶数作为 VAR 函数的参数,例如 VAR§。
Python代码如下:
# VAR example
from statsmodels.tsa.vector_ar.var_model import VAR
from random import random
# contrived dataset with dependency
data = list()
for i in range(100):
v1 = i + random()
v2 = v1 + random()
row = [v1, v2]
data.append(row)
# fit model
model = VAR(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.forecast(model_fit.y, steps=1)
print(yhat)
VARMA
Vector Autoregression Moving-Average (VARMA)该方法适用于没有趋势和季节性成分的多元时间序列。
VARMA 方法使用 ARMA 模型对每个时间序列中的下一步进行建模。它是 ARMA 对多个并行时间序列的推广,例如多元时间序列。
该模型的符号:指定 AR§ 和 MA(q) 模型的阶数作为 VARMA 函数的参数,例如 VARMA(p, q)。VARMA 模型也可用于开发 VAR 或 VMA 模型。
Python代码如下:
from statsmodels.tsa.statespace.varmax import VARMAX
from random import random
# contrived dataset with dependency
data = list()
for i in range(100):
v1 = random()
v2 = v1 + random()
row = [v1, v2]
data.append(row)
# fit model
model = VARMAX(data, order=(1, 1))
model_fit = model.fit(disp=False)
# make prediction
yhat = model_fit.forecast()
print(yhat)
VARMAX
Vector Autoregression Moving-Average with Exogenous Regressors (VARMAX)方法适用于具有外生变量的没有趋势和季节性成分的多元时间序列。
带有外生回归量的向量自回归移动平均 (VARMAX) 是 VARMA 模型的扩展,它还包括外生变量的建模。它是 ARMAX 方法的多元版本。
外生变量也称为协变量,可以被认为是并行输入序列,它们在与原始序列相同的时间步长中进行观察。主要系列被称为内源数据,以将其与外源序列进行对比。外生变量的观测值在每个时间步直接包含在模型中,并且不以与主要内生序列相同的方式建模(例如作为 AR、MA 等过程)。
VARMAX 方法也可用于对包含外生变量的包含模型进行建模,例如 VARX 和 VMAX。
Python代码如下:
# VARMAX example
from statsmodels.tsa.statespace.varmax import VARMAX
from random import random
# contrived dataset with dependency
data = list()
for i in range(100):
v1 = random()
v2 = v1 + random()
row = [v1, v2]
data.append(row)
data_exog = [x + random() for x in range(100)]
# fit model
model = VARMAX(data, exog=data_exog, order=(1, 1))
model_fit = model.fit(disp=False)
# make prediction
data_exog2 = [[100]]
yhat = model_fit.forecast(exog=data_exog2)
print(yhat)
SES
Simple Exponential Smoothing (SES)方法适用于没有趋势和季节性成分的单变量时间序列。
简单指数平滑 (SES) 方法将下一个时间步预测结果为先前时间步观测值的指数加权线性函数。
Python代码如下:
# SES example
from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = SimpleExpSmoothing(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
HWES
Holt Winter’s Exponential Smoothing (HWES)方法适用于具有趋势 且/或 季节性成分的单变量时间序列。
HWES,也称为三重指数平滑法,将下一个时间步预测结果为先前时间步观测值的指数加权线性函数,同时考虑了趋势和季节性。
Python代码如下:
# HWES example
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from random import random
# contrived dataset
data = [x + random() for x in range(1, 100)]
# fit model
model = ExponentialSmoothing(data)
model_fit = model.fit()
# make prediction
yhat = model_fit.predict(len(data), len(data))
print(yhat)
技术交流
欢迎转载、收藏、有所收获点赞支持一下!
目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友
方式①、发送如下图片至微信,长按识别,后台回复:加群;
方式②、添加微信号:pythoner666,备注:来自CSDN
方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群
以上是关于动手实战 | Statsmodels 中经典的11种时间序列预测方法的主要内容,如果未能解决你的问题,请参考以下文章
Spark API综合实战:动手实战和调试Spark文件操作动手实战操作搜狗日志文件搜狗日志文件深入实战
为什么在statsmodels中指数平滑化对一个时间序列预测返回相同的值?