用ARIMA进行时间序列预测
本文翻译于Kaggle,原文链接时间序列预测教程。中文论坛很少有对整个过程进行描述,所以想转载过来供大家一起学习。数据在原文也有,我也放了云盘天气数据。
英文水平和学术水平都比较低,所以翻译问题和理论问题在所难免,如果不能理解,请查看原文。
我们将使用最常见的方法ARIMA
ARIMA:差分整合移动平均自回归模型。我将在下一部分详细解释。
接下来我们会看到:
什么是时间序列(Time Series)?
时间序列的平稳性(Stationarity )
使一个时间序列平稳?
预测一个时间序列
什么是时间序列?
时间序列是以国定的时间间隔收集的数据点的集合。
它依赖于时间。
大多数的时间序列都有某种形式的季节性趋势。例如,如果我们销售冰淇淋,很可能在夏季会有更高的销售额。因此,该事件序列具有季节性趋势。
再举一个例子,假如我们在一年内每天投掷一次骰子。正如你想的那样,不会出现数字6主要出现在夏季或者数字5出现在1月份这样的情景。因此,该时间序列不具有季节性趋势。
时间序列的平稳性
一个时间序列是平稳序列还是非平稳序列,有三个基本的判断标准。
时间序列的统计特征比如均值、方差应随时间保持恒定,那么我们说这个时间序列是平稳的。
常数平均值(constant mean)
常数方差(constant variance)
不依赖于时间的自协方差。自协方差是指时间序列与滞后时间序列之间的协方差。
# Mean temperature of Bindikuri area
plt.figure(figsize=(22,10))
plt.plot(weather_bin.Date,weather_bin.MeanTemp)
plt.title("Mean Temperature of Bindukuri Area")
plt.xlabel("Date")
plt.ylabel("Mean Temperature")
plt.show()
# lets create time series from weather
timeSeries = weather_bin.loc[:, ["Date","MeanTemp"]]
timeSeries.index = timeSeries.Date
ts = timeSeries.drop("Date",axis=1)
从上面的图中可以看出,我们的时间序列具有季节性变化。每年夏季平均气温较高,冬季平均气温较低。
现在我们来检验一下时间序列的平稳性。我们可以用以下方法检验平稳性:
绘制滚动数据:我们有一个窗口假设窗口大小为6然后通过滚动均值和方差来检验是否平稳。
迪基-福勒检验(Dickey-Fuller Test):测试结果包括一个测试统计量和一些差异置信水平的临界值。如果检验统计量小于临界值,我们可以说时间序列是平稳的。
# adfuller library
from statsmodels.tsa.stattools import adfuller
# check_adfuller
def check_adfuller(ts):
# Dickey-Fuller test
result = adfuller(ts, autolag&#