def _assert_val_error(f, *args, **kwargs): # Legacy, didn't really assert anything. Bad news! # try: # f(*args, **kwargs) # return False # except ValueError: # return True assert_raises(ValueError, f, *args, **kwargs)
def test_more_elaborate(): # show we can fit this with a non-zero order arima = ARIMA(order=(2, 1, 2), suppress_warnings=True).fit(y=hr) _try_get_attrs(arima) # can we fit this same arima with a made-up exogenous array? xreg = rs.rand(hr.shape[0], 4) arima = ARIMA(order=(2, 1, 2), suppress_warnings=True).fit(y=hr, exogenous=xreg) _try_get_attrs(arima) # pickle this for the __get/setattr__ coverage. # since the only time this is tested is in parallel in auto.py, # this doesn't actually get any coverage proof... fl = 'some_temp_file.pkl' with open(fl, 'wb') as p: pickle.dump(arima, p) # show we can predict with this even though it's been pickled new_xreg = rs.rand(5, 4) _preds = arima.predict(n_periods=5, exogenous=new_xreg) # now unpickle with open(fl, 'rb') as p: other = pickle.load(p) # show we can still predict, compare _other_preds = other.predict(n_periods=5, exogenous=new_xreg) assert_array_almost_equal(_preds, _other_preds) # now clear the cache and remove the pickle file arima._clear_cached_state() os.unlink(fl) # now show that since we fit the ARIMA with an exogenous array, # we need to provide one for predictions otherwise it breaks. assert_raises(ValueError, arima.predict, n_periods=5, exogenous=None) # show that if we DO provide an exogenous and it's the wrong dims, we # also break things down. assert_raises(ValueError, arima.predict, n_periods=5, exogenous=rs.rand(4, 4))
def test_with_oob(): # show we can fit with CV (kinda) arima = ARIMA(order=(2, 1, 2), suppress_warnings=True, out_of_sample_size=10).fit(y=hr) assert not np.isnan(arima.oob()) # show this works # show we can fit if ooss < 0 and oob will be nan arima = ARIMA(order=(2, 1, 2), suppress_warnings=True, out_of_sample_size=-1).fit(y=hr) assert np.isnan(arima.oob()) # This will raise since n_steps is not an int assert_raises(TypeError, arima.predict, n_periods="5") # But that we CAN forecast with an int... _ = arima.predict(n_periods=5) # noqa: F841 # Show we fail if cv > n_samples assert_raises(ValueError, ARIMA(order=(2, 1, 2), out_of_sample_size=1000).fit, hr)
def test_corner_cases(): assert_raises(ValueError, auto_arima, wineind, error_action='some-bad-string') # things that produce warnings with warnings.catch_warnings(record=False): warnings.simplefilter('ignore') # show a constant result will result in a quick fit auto_arima(np.ones(10), suppress_warnings=True) # show the same thing with return_all results in the ARIMA in a list fits = auto_arima(np.ones(10), suppress_warnings=True, return_valid_fits=True) assert hasattr(fits, '__iter__') # show we fail for n_iter < 0 assert_raises(ValueError, auto_arima, np.ones(10), random=True, n_fits=-1) # show if max* < start* it breaks: assert_raises(ValueError, auto_arima, np.ones(10), start_p=5, max_p=0)
def test_oob_for_issue_28(): # Continuation of above: can we do one with an exogenous array, too? xreg = rs.rand(hr.shape[0], 4) arima = ARIMA(order=(2, 1, 2), suppress_warnings=True, out_of_sample_size=10).fit(y=hr, exogenous=xreg) oob = arima.oob() assert not np.isnan(oob) # Assert that the endog shapes match. First is equal to the original, # and the second is the differenced array, with original shape - d. assert np.allclose(arima.arima_res_.data.endog, hr, rtol=1e-2) assert arima.arima_res_.model.endog.shape[0] == hr.shape[0] - 1 # Now assert the same for exog assert np.allclose(arima.arima_res_.data.exog, xreg, rtol=1e-2) assert arima.arima_res_.model.exog.shape[0] == xreg.shape[0] - 1 # Compare the OOB score to an equivalent fit on data - 10 obs, but # without any OOB scoring, and we'll show that the OOB scoring in the # first IS in fact only applied to the first (train - n_out_of_bag) # samples arima_no_oob = ARIMA(order=(2, 1, 2), suppress_warnings=True, out_of_sample_size=0).fit(y=hr[:-10], exogenous=xreg[:-10, :]) scoring = get_callable(arima_no_oob.scoring, VALID_SCORING) preds = arima_no_oob.predict(n_periods=10, exogenous=xreg[-10:, :]) assert np.allclose(oob, scoring(hr[-10:], preds), rtol=1e-2) # Show that the model parameters are exactly the same xreg_test = rs.rand(5, 4) assert np.allclose(arima.params(), arima_no_oob.params(), rtol=1e-2) # Now assert on the forecast differences. with_oob_forecasts = arima.predict(n_periods=5, exogenous=xreg_test) no_oob_forecasts = arima_no_oob.predict(n_periods=5, exogenous=xreg_test) assert_raises(AssertionError, assert_array_almost_equal, with_oob_forecasts, no_oob_forecasts) # But after we update the no_oob model with the latest data, we should # be producing the same exact forecasts # First, show we'll fail if we try to add observations with no exogenous assert_raises(ValueError, arima_no_oob.add_new_observations, hr[-10:], None) # Also show we'll fail if we try to add mis-matched shapes of data assert_raises(ValueError, arima_no_oob.add_new_observations, hr[-10:], xreg_test) # Show we fail if we try to add observations with a different dim exog assert_raises(ValueError, arima_no_oob.add_new_observations, hr[-10:], xreg_test[:, :2]) # Actually add them now, and compare the forecasts (should be the same) arima_no_oob.add_new_observations(hr[-10:], xreg[-10:, :]) assert np.allclose(with_oob_forecasts, arima_no_oob.predict(n_periods=5, exogenous=xreg_test), rtol=1e-2)