Ejemplo n.º 1
0
def run_arima(dept_id, store_id):
    # create timeseries for fbprophet
    ts = CreateTimeSeries(dept_id, store_id)

    # ARIMA
    fitted1 = SARIMAX(ts['y'].values + 1, order=(3, 1, 5), trend='c').fit()
    fitted2 = SARIMAX(ts['y'].values + 1, order=(2, 1, 2), trend='c').fit()
    y_pred = 0.5 * fitted1.forecast(28) + 0.5 * fitted2.forecast(28)
    return np.append(np.array([dept_id, store_id]), y_pred - 1)
bike_plot.legend(['Bike Rentals', 'SARIMA Model Fit'])

# Plotting SARIMA model residuals and QQ-plot
fig, axes = plt.subplots(1, 2, figsize=(10, 4))

fig = sm.qqplot(fit_sarima.resid.iloc[12:], line='45', fit=True, ax=axes[0])
fig = fit_sarima.resid.iloc[12:].plot(title="H-W Method Residual Plot",
                                      ax=axes[1])

# SARIMA forecast
# Getting prediction interval boundaries
pred_int = fit_sarima.get_forecast(12).conf_int()

bike_plot = bike['num_rides'].plot(figsize=(10, 6),
                                   title="Seasonal ARIMA Model Forecast")
fit_sarima.forecast(12).plot(ax=bike_plot, style='--', color='DarkOrange')
bike_plot.fill_between(fit_sarima.forecast(12).index,
                       pred_int.iloc[:, 0],
                       pred_int.iloc[:, 1],
                       alpha=0.15)
bike_plot.legend(['Bike Rentals', 'SARIMA Forecast'], loc='upper left')

# Plotting the SARIMA and H-W forecasts together. We see that the H-W model forecasts greater
# values on average in comparison to the SARIMA
fig, ax = plt.subplots(figsize=(15, 6))
fig = bike['num_rides'].plot(ax=ax,
                             title="Holt-Winters' Method Bike Share Forecast")
fig.set_ylabel("Number of Bike rentals")
fig.set_xlabel("Year")
fit_hw.forecast(12).plot(ax=ax, style='--', color='DarkRed')
fit_sarima.forecast(12).plot(ax=ax, style='--', color='DarkOrange')