时间序列问题比较常见,比如股市,工业生产指标等。
导入必要的包:
from statsmodels.tsa.api import ExponentialSmoothing, \
SimpleExpSmoothing, Holt
import statsmodels.api as sm
y ^ t + 1 = y t \hat{y}_{\mathrm{t}+1}=\mathrm{y}_{\mathrm{t}} y^t+1=yt
使用最后一个时间点的值估测后面一段时间段的值。
dd= np.asarray(train.Count)
y_hat = test.copy()
y_hat['naive'] = dd[len(dd)-1]
y_hat_avg = test.copy()
y_hat_avg['avg_forecast'] = train['Count'].mean()
使用之前一定大小时间段的平均值作为这个时间点的值。
或者使用加权的滑动窗平均:
y_hat_avg = test.copy()
y_hat_avg['moving_avg_forecast'] = train['Count'].rolling(60).mean().iloc[-1]
where 0≤ α ≤1 is the smoothing parameter.
如果时间序列很长,可以看作:
from statsmodels.tsa.api import ExponentialSmoothing, \
SimpleExpSmoothing, Holt
y_hat_avg = test.copy()
fit2 = SimpleExpSmoothing(np.asarray(train['Count'])).fit(
smoothing_level=0.6,optimized=False)
y_hat_avg['SES'] = fit2.forecast(len(test))
主要考虑趋势。
import statsmodels.api as sm
sm.tsa.seasonal_decompose(train.Count).plot()
result = sm.tsa.stattools.adfuller(train.Count)
这种思想比较简单有效,假设数据服从两点,
1.数据是呈递增、递减趋势的;
2.数据服从一个周期变化。
然后,对残差,再进行其他方式的拟合,比如三次样条曲线。
y_hat_avg = test.copy()
fit1 = ExponentialSmoothing(np.asarray(train['Count']) ,
seasonal_periods=7 ,trend='add', seasonal='add',).fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(test))
ARIMA模型(Autoregressive Integrated Moving Average model)整合移动平均自回归模型。
ARIMA(p,d,q)模型:
ARIMA(p, d, q) 由三个部分组成:
AR(p)
模型。MA(q)
模型。y_hat_avg = test.copy()
fit1 = sm.tsa.statespace.SARIMAX(train.Count, order=(2, 1,
4),seasonal_order=(0,1,1,7)).fit()
y_hat_avg['SARIMA'] = fit1.predict(start="2013-11-1",
end="2013-12-31", dynamic=True)
Facebook提出的一种方法,与Holt-winters类似,主要想法是"
时间序列的分解(Decomposition of Time Series),它把时间序列 分成几个部分,分别是季节项 ,趋势项 ,剩余项,与Holt-winters方法类似 。
fbprophet的安装依赖Pystan.
reference: