def test_predict(self, tmp_path, use_pred_months): x, _, _ = _make_dataset(size=(5, 5), const=True) y = x.isel(time=[-1]) train_features = tmp_path / 'features/one_month_forecast/train/hello' train_features.mkdir(parents=True) test_features = tmp_path / 'features/one_month_forecast/test/hello' test_features.mkdir(parents=True) norm_dict = {'VHI': {'mean': 0.0, 'std': 1.0}} with (tmp_path / 'features/one_month_forecast/normalizing_dict.pkl' ).open('wb') as f: pickle.dump(norm_dict, f) x.to_netcdf(test_features / 'x.nc') y.to_netcdf(test_features / 'y.nc') x.to_netcdf(train_features / 'x.nc') y.to_netcdf(train_features / 'y.nc') # static x_static, _, _ = _make_dataset(size=(5, 5), add_times=False) static_features = tmp_path / f'features/static' static_features.mkdir(parents=True) x_static.to_netcdf(static_features / 'data.nc') static_norm_dict = {'VHI': {'mean': 0.0, 'std': 1.0}} with (tmp_path / f'features/static/normalizing_dict.pkl').open('wb') as f: pickle.dump(static_norm_dict, f) dense_features = [10] hidden_size = 128 rnn_dropout = 0.25 model = EARecurrentNetwork(hidden_size=hidden_size, dense_features=dense_features, rnn_dropout=rnn_dropout, data_folder=tmp_path) model.train() test_arrays_dict, pred_dict = model.predict() # the foldername "hello" is the only one which should be in the dictionaries assert ('hello' in test_arrays_dict.keys()) and (len(test_arrays_dict) == 1) assert ('hello' in pred_dict.keys()) and (len(pred_dict) == 1) # _make_dataset with const=True returns all ones assert (test_arrays_dict['hello']['y'] == 1).all()
def test_predict_and_explain(self, tmp_path, use_pred_months, predict_delta): x, _, _ = _make_dataset(size=(5, 5), const=True) y = x.isel(time=[-1]) train_features = tmp_path / "features/one_month_forecast/train/1980_1" train_features.mkdir(parents=True) test_features = tmp_path / "features/one_month_forecast/test/1980_1" test_features.mkdir(parents=True) norm_dict = {"VHI": {"mean": 0.0, "std": 1.0}} with (tmp_path / "features/one_month_forecast/normalizing_dict.pkl" ).open("wb") as f: pickle.dump(norm_dict, f) x.to_netcdf(test_features / "x.nc") y.to_netcdf(test_features / "y.nc") x.to_netcdf(train_features / "x.nc") y.to_netcdf(train_features / "y.nc") # static x_static, _, _ = _make_dataset(size=(5, 5), add_times=False) static_features = tmp_path / f"features/static" static_features.mkdir(parents=True) x_static.to_netcdf(static_features / "data.nc") static_norm_dict = {"VHI": {"mean": 0.0, "std": 1.0}} with (tmp_path / f"features/static/normalizing_dict.pkl").open("wb") as f: pickle.dump(static_norm_dict, f) dense_features = [10] hidden_size = 128 rnn_dropout = 0.25 model = EARecurrentNetwork( hidden_size=hidden_size, dense_features=dense_features, rnn_dropout=rnn_dropout, data_folder=tmp_path, predict_delta=predict_delta, normalize_y=True, ) model.train() test_arrays_dict, pred_dict = model.predict() # the foldername "1980_1" is the only one which should be in the dictionaries assert ("1980_1" in test_arrays_dict.keys()) and (len(test_arrays_dict) == 1) assert ("1980_1" in pred_dict.keys()) and (len(pred_dict) == 1) if not predict_delta: # _make_dataset with const=True returns all ones assert (test_arrays_dict["1980_1"]["y"] == 1).all() else: # _make_dataset with const=True & predict_delta # returns a change of 0 assert (test_arrays_dict["1980_1"]["y"] == 0).all() # test the Morris explanation works test_dl = next( iter( model.get_dataloader(mode="test", to_tensor=True, shuffle_data=False))) for key, val in test_dl.items(): output_m = model.explain(val.x, save_explanations=True, method="morris") assert type(output_m) is TrainData assert (model.model_dir / "analysis/morris_value_historical.npy").exists()
data_folder=data_dir, batch_size=1000, hidden_size=128, experiment='one_timestep_forecast', dynamic=True, seq_length=365, dynamic_ignore_vars=dynamic_ignore_vars, static_ignore_vars=static_ignore_vars, target_var='discharge_spec', test_years=np.arange(2011, 2017), ) # test the training functionality ealstm.train() # test the prediction functionality ealstm.predict() # captured = capsys.readouterr() expected_stdout = "`include_yearly_aggs` does not yet work for dynamic dataloder. Setting to False" assert ( captured.out == expected_stdout ), f"Expected stdout to be {expected_stdout}, got {captured.out}" # test getting the dataloader dl = ealstm.get_dataloader(mode='train') X, y = dl.__iter__().__next__() # the dataloader loaded is the dynamic ? test_years = np.arange(2011, 2017) assert isinstance(dl, DynamicDataLoader)