HydNAM is a Python implementation of the NedborAfstromnings Model (NAM), a lumped rainfall–runoff model.
This project is based on the NAM_Model created by hckaraman.
pip install hydnam
The dataset must contain the following properties: Date, Temperature, Precipitation, Evapotranspiration, and Discharge.
Date | Temperature | Discharge | Precipitation | Evapotranspiration |
---|---|---|---|---|
10/9/2016 | 15.4 | 0.25694 | 0 | 2.79 |
10/10/2016 | 14.4 | 0.25812 | 0 | 3.46 |
10/11/2016 | 14.9 | 0.30983 | 0 | 3.65 |
10/12/2016 | 16.1 | 0.31422 | 0 | 3.46 |
10/13/2016 | 20.1 | 0.30866 | 0 | 5.64 |
10/14/2016 | 13.9 | 0.30868 | 0 | 3.24 |
10/15/2016 | 11.1 | 0.31299 | 0 | 3.41 |
... | ... | ... | ... | ... |
Ensure that the time intervals between dates are consistent (e.g., 24 hours) for accurate model performance.
from datetime import datetime
from hydnam.dataset import Dataset
from hydnam.hydnam import HydNAM
from hydnam.parameters import Parameters
dataset = Dataset(
timestamp=[
datetime(2016, 10, 9),
datetime(2016, 10, 10),
datetime(2016, 10, 11),
],
temperature=[15.4, 14.4, 14.9],
precipitation=[0.0, 0.0, 0.0],
evapotranspiration=[2.79, 3.46, 3.65],
discharge=[0.25694, 0.25812, 0.30983]
)
params = Parameters(
umax=0.01,
lmax=0.01,
cqof=0.01,
ckif=200.0,
ck12=10.0,
tof=0.0,
tif=0.0,
tg=0.0,
ckbf=500.0,
csnow=0.0,
snowtemp=0.0,
qofmin=0.4,
pmm=10.0,
carea=0.9
)
nam = HydNAM(
dataset=dataset,
parameters=Parameters(),
area=58.8,
interval=24.0,
start=None,
end=None,
spin_off=0.0,
name="NAM"
)
print(f'Parameters: {nam.get_parameters().__dict__}')
print(f'Statistics: {nam.get_statistical_metrics().__dict__}')
print(nam.model_is_broken())
nam.plot_q(only_obs_and_sim=False).show()
nam.get_model_output().to_dataframe().to_csv("result.csv")
for m in ['SLSQP', 'L-BFGS-B']:
nam.optimize(method=m)
print(nam.get_parameters().__dict__)
print(nam.get_statistical_metrics().__dict__)
nam.plot_q(only_obs_and_sim=True).show()
The model will calculate and check which Parameters
are optimal for the model and use it as the main Parameters
for
the model.
nam.update_dataset(dataset, interval=24.0)
nam.update_parameters(Parameters())
nam.update_area(59.0)
nam.update_name("New NAM")
nam.update_spin_off(0.0)
nam.update_time_range(datetime(2016, 10, 9), datetime(2016, 10, 10))
nam.plot_q(only_obs_and_sim=True).show()
When the model performs calculations incorrectly and throws an error, you should reset the properties to more reasonable ones and recalculate.
nam.reload()
This library is released under the MIT License.
If you have any questions or issues, please open an issue on GitHub or email us at [email protected].