def test_for_older_version(): # Fit an ARIMA arima = ARIMA(order=(0, 0, 0), trend='c', suppress_warnings=True) # There are three possibilities here: # 1. The model is serialized/deserialized BEFORE it has been fit. # This means we should not get a warning. # # 2. The model is saved after being fit, but it does not have a # pkg_version_ attribute due to it being an old (very old) version. # We still warn for this # # 3. The model is saved after the fit, and it's version does not match. # We warn for this. for case, do_fit, expect_warning in [(1, False, False), (2, True, True), (3, True, True)]: # Only fit it if we should if do_fit: arima.fit(y) # If it's case 2, we remove the pkg_version_. If 3, we set it low if case == 2: delattr(arima, 'pkg_version_') elif case == 3: arima.pkg_version_ = '0.0.1' # will always be < than current # Pickle it pickle_file = 'model.pkl' try: joblib.dump(arima, pickle_file) # Now unpickle it and show that we get a warning (if expected) with warnings.catch_warnings(record=True) as w: arm = joblib.load(pickle_file) # type: ARIMA if expect_warning: assert len(w) > 0 else: assert not len(w) # we can still produce predictions (only if we fit) if do_fit: arm.predict(n_periods=4) finally: os.unlink(pickle_file)
def test_for_older_version(): # Fit an ARIMA arima = ARIMA(order=(0, 0, 0), trend='c', suppress_warnings=True) # There are three possibilities here: # 1. The model is serialized/deserialized BEFORE it has been fit. # This means we should not get a warning. # # 2. The model is saved after being fit, but it does not have a # pkg_version_ attribute due to it being an old (very old) version. # We still warn for this # # 3. The model is saved after the fit, and it's version does not match. # We warn for this. for case, do_fit, expect_warning in [(1, False, False), (2, True, True), (3, True, True)]: # Only fit it if we should if do_fit: arima.fit(y) # If it's case 2, we remove the pkg_version_. If 3, we set it low if case == 2: delattr(arima, 'pkg_version_') elif case == 3: arima.pkg_version_ = '0.0.1' # will always be < than current with tempfile.TemporaryDirectory() as tdir: pickle_file = os.path.join(tdir, 'model.pkl') joblib.dump(arima, pickle_file) # Now unpickle it and show that we get a warning (if expected) if expect_warning: with pytest.warns(UserWarning): arm = joblib.load(pickle_file) # type: ARIMA else: arm = joblib.load(pickle_file) # type: ARIMA # we can still produce predictions (only if we fit) if do_fit: arm.predict(n_periods=4)