def test_forecast_errors(data): res = ThetaModel(data, period=12).fit() with pytest.raises(ValueError, match="steps must be a positive integer"): res.forecast(-1) with pytest.raises(ValueError, match="theta must be a float"): res.forecast(7, theta=0.99) with pytest.raises(ValueError, match="steps must be a positive integer"): res.forecast_components(0)
def test_alt_index(indexed_data): idx = indexed_data.index date_like = not hasattr(idx, "freq") or getattr(idx, "freq", None) is None period = 12 if date_like else None res = ThetaModel(indexed_data, period=period).fit() if hasattr(idx, "freq") and idx.freq is None: with pytest.warns(UserWarning): res.forecast_components(37) with pytest.warns(UserWarning): res.forecast(23) else: res.forecast_components(37) res.forecast(23)
def test_smoke(data, period, use_mle, deseasonalize, use_test, diff, model): if period is None and isinstance(data, np.ndarray): return res = ThetaModel( data, period=period, deseasonalize=deseasonalize, use_test=use_test, difference=diff, method=model, ).fit(use_mle=use_mle) assert "b0" in str(res.summary()) res.forecast(36) res.forecast_components(47) assert res.model.use_test is (use_test and res.model.deseasonalize) assert res.model.difference is diff
def _theta_forecast(self, series): period = self._analysis['theta_period'] steps = len(series) model = ThetaModel( series, period=period, deseasonalize=True, use_test=False ).fit() forecast = model.forecast(steps=steps, theta=20) return forecast
def _theta_forecast(self, series): period = self._analysis['theta_period'] steps = len(series) # replace last value of series by a mean value # to avoid some extreme cases where the foecast starts at a single # which may happen for very noisy data # series[0] = series[::period].mean() # series[-1] = series[::-period].mean() model = ThetaModel(series, period=period, deseasonalize=True, use_test=False).fit() forecast = model.forecast(steps=steps, theta=20) return forecast
tm = ThetaModel(housing) res = tm.fit() print(res.summary()) # The model is first and foremost a forecasting method. Forecasts are # produced using the `forecast` method from fitted model. Below we produce a # hedgehog plot by forecasting 2-years ahead every 2 years. # # **Note**: the default $\theta$ is 2. forecasts = {"housing": housing} for year in range(1995, 2020, 2): sub = housing[:str(year)] res = ThetaModel(sub).fit() fcast = res.forecast(24) forecasts[str(year)] = fcast forecasts = pd.DataFrame(forecasts) ax = forecasts["1995":].plot(legend=False) children = ax.get_children() children[0].set_linewidth(4) children[0].set_alpha(0.3) children[0].set_color("#000000") ax.set_title("Housing Starts") plt.tight_layout(pad=1.0) # We could alternatively fit the log of the data. Here it makes more # sense to force the deseasonalizing to use the additive method, if needed. # We also fit the model parameters using MLE. This method fits the IMA # # $$ X_t = X_{t-1} + \gamma\epsilon_{t-1} + \epsilon_t $$