Examples
Streamflow simulation
The configuration file config.yml and data for this example can be found here.
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.
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"))