Examples ======== Streamflow simulation --------------------- The configuration file ``config.yml`` and data for this example can be found `here `_. .. code-block:: python from hydroecolstm.model_run import run_config from hydroecolstm.utility.plot import plot from hydroecolstm.data.read_config import read_config from hydroecolstm.model.create_model import create_model from hydroecolstm.interface.utility import write_yml_file from hydroecolstm.utility.evaluation_function import EvaluationFunction from hydroecolstm.data.read_data import read_forecast_data import matplotlib.pyplot as plt from pathlib import Path import torch #-----------------------------------------------------------------------------# # Set up, train, test model # #-----------------------------------------------------------------------------# # Read configuration file, please modify the path to the config.yml file config = read_config("C:/hydroecolstm/examples/1_streamflow_simulation/config.yml") # Create model and train from config model, data, best_config = run_config(config) # Evaluate the model and transform to normal scale data['y_train_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_train_scale"])) data['y_valid_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_valid_scale"])) data['y_test_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_test_scale"])) # Plot train and validation loss with epoch data["loss_epoch"].plot() plt.show() # Want to see all keys in data data.keys() # Objective function values: MAE, NSE, RMSE, MSE objective = EvaluationFunction(config['eval_function'], config['warmup_length']) objective(data['y_train'], data['y_train_simulated']) objective(data['y_valid'], data['y_valid_simulated']) objective(data['y_test'], data['y_test_simulated']) # Visualize valid and test data for object_id in config["object_id"]: for target in config["target_features"]: p = plot(data, object_id=str(object_id), target_feature=target) p.show() # Application of the model for (assumed) ungagued basins forecast_dataset = read_forecast_data(config) x_forecast_scale = data["x_scaler"].transform(forecast_dataset["x_forecast"]) y_forecast_scale = model.evaluate(x_forecast_scale) # Application of the model for (assumed) ungagued basins forecast_dataset = read_forecast_data(config) x_forecast_scale = data["x_scaler"].transform(forecast_dataset["x_forecast"]) y_forecast_scale = model.evaluate(x_forecast_scale) y_forecast_simulated = data["y_scaler"].inverse(y_forecast_scale) # Visualize result: train_test_period = "train" or "test" for object_id in y_forecast_simulated.keys(): plt.plot(forecast_dataset["time_forecast"][object_id], forecast_dataset["y_forecast"][object_id].detach().numpy(), color = 'blue', label = "Observed", alpha=0.9, linewidth=0.75) plt.plot(forecast_dataset["time_forecast"][object_id], y_forecast_simulated[object_id].detach().numpy(), color = 'red', label = "Simulated", alpha=0.9, linewidth=0.75) plt.legend() plt.show() # Objective function for forecast objective(forecast_dataset['y_forecast'], y_forecast_simulated) # Save all data and model state dicts to the output_directory torch.save(data, Path(config["output_directory"][0], "data.pt")) torch.save(model.state_dict(), Path(config["output_directory"][0], "model_state_dict.pt")) write_yml_file(config = config, out_file=Path(config["output_directory"][0], "best_config.yml")) #-----------------------------------------------------------------------------# # Incase you close this file and open again, # # you can load your data, model as follows # #-----------------------------------------------------------------------------# config = read_config("C:/hydroecolstm/examples/1_streamflow_simulation/config.yml") model = create_model(config) model.load_state_dict(torch.load(Path(config["output_directory"][0], "model_state_dict.pt"))) data = torch.load(Path(config["output_directory"][0], "data.pt")) Multiple outputs simulation --------------------------- The configuration file ``config.yml`` and data for this example can be found `here `_. .. code-block:: python from hydroecolstm.model_run import run_config from hydroecolstm.utility.plot import plot from hydroecolstm.data.read_config import read_config from hydroecolstm.model.create_model import create_model from hydroecolstm.interface.utility import write_yml_file from hydroecolstm.utility.evaluation_function import EvaluationFunction import matplotlib.pyplot as plt from pathlib import Path import torch #-----------------------------------------------------------------------------# # Set up, train, test model # #-----------------------------------------------------------------------------# # Read configuration file, please modify the path to the config.yml file config = read_config("C:/hydroecolstm/examples/2_streamflow_isotope_simulation/config.yml") # Create model and train from config model, data, best_config = run_config(config) # Evaluate the model and transform to normal scale data['y_train_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_train_scale"])) data['y_valid_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_valid_scale"])) data['y_test_simulated'] = data["y_scaler"].inverse(model.evaluate(data["x_test_scale"])) # Plot train and validation loss with epoch data["loss_epoch"].plot() plt.show() # Want to see all keys in data data.keys() # Objective function values: MAE, NSE, RMSE, MSE objective = EvaluationFunction(config['eval_function'], config['warmup_length']) objective(data['y_train'], data['y_train_simulated']) objective(data['y_valid'], data['y_valid_simulated']) objective(data['y_test'], data['y_test_simulated']) # Visualize valid and test data for object_id in config["object_id"]: for target in config["target_features"]: p = plot(data, object_id=str(object_id), target_feature=target) p.show() # Save all data and model state dicts to the output_directory torch.save(data, Path(config["output_directory"][0], "data.pt")) torch.save(model.state_dict(), Path(config["output_directory"][0], "model_state_dict.pt")) write_yml_file(config = best_config, out_file=Path(config["output_directory"][0], "best_config.yml")) #-----------------------------------------------------------------------------# # Incase you close this file and open again, # # you can load your data, model as follows # #-----------------------------------------------------------------------------# config = read_config("C:/hydroecolstm/examples/2_streamflow_isotope_simulation/results/best_config.yml") model = create_model(config) model.load_state_dict(torch.load(Path(config["output_directory"][0], "model_state_dict.pt"))) data = torch.load(Path(config["output_directory"][0], "data.pt"))