def test_update_ts_settings(request, pstore): pstore.set_check_model_series_values(False) o = pstore.get_oseries("oseries2") ml = ps.Model(o.loc[:"2013"], name="ml_oseries2") pnam = pstore.get_nearest_stresses("oseries2", kind="prec").iloc[0] p = pstore.get_stresses(pnam) enam = pstore.get_nearest_stresses("oseries2", kind="evap").iloc[0] e = pstore.get_stresses(enam) rm = ps.RechargeModel(p.loc[:"2013"], e.loc[:"2013"]) ml.add_stressmodel(rm) tmax = p.index.intersection(e.index).max() p2 = pstore.get_stresses("prec1") sm = ps.StressModel(p2.loc[:"2013"], ps.Exponential, "prec") ml.add_stressmodel(sm) pstore.add_model(ml) ml2 = pstore.get_models(ml.name, update_ts_settings=True) try: assert ml2.oseries.settings["tmax"] == o.index[-1] assert ml2.stressmodels["recharge"].prec.settings["tmax"] == tmax assert ml2.stressmodels["recharge"].evap.settings["tmax"] == tmax assert ml2.stressmodels["prec"].stress[0].settings["tmax"] == \ p2.index[-1] except AssertionError: pstore.del_models("ml_oseries2") pstore.set_check_model_series_values(True) raise return
def add_recharge(self, ml: ps.Model, rfunc=ps.Gamma, recharge=ps.rch.Linear(), recharge_name: str = "recharge") -> None: """Add recharge to a pastas model. Uses closest precipitation and evaporation timeseries in database. These are assumed to be labeled with kind = 'prec' or 'evap'. Parameters ---------- ml : pastas.Model pastas.Model object rfunc : pastas.rfunc, optional response function to use for recharge in model, by default ps.Gamma (for different response functions, see pastas documentation) recharge : ps.RechargeModel recharge model to use, default is ps.rch.Linear() recharge_name : str name of the RechargeModel """ # get nearest prec and evap stns names = [] for var in ("prec", "evap"): try: name = self.get_nearest_stresses(ml.oseries.name, kind=var).iloc[0, 0] except AttributeError: msg = "No precipitation or evaporation timeseries found!" raise Exception(msg) if isinstance(name, float): if np.isnan(name): raise ValueError(f"Unable to find nearest '{var}' stress! " "Check X and Y coordinates.") else: names.append(name) if len(names) == 0: msg = "No precipitation or evaporation timeseries found!" raise Exception(msg) # get data tsdict = self.conn.get_stresses(names) stresses = [] for (k, s), setting in zip(tsdict.items(), ("prec", "evap")): metadata = self.conn.get_metadata("stresses", k, as_frame=False) stresses.append( ps.TimeSeries(s, name=k, settings=setting, metadata=metadata)) # add recharge to model rch = ps.RechargeModel(stresses[0], stresses[1], rfunc, name=recharge_name, recharge=recharge, settings=("prec", "evap"), metadata=[i.metadata for i in stresses]) ml.add_stressmodel(rch)
def test_linear(): index = pd.date_range("2000-01-01", "2000-01-10") prec = pd.Series([1, 2] * 5, index=index) evap = prec / 2 rm = ps.RechargeModel(prec=prec, evap=evap, rfunc=ps.Exponential, recharge="Linear", name="recharge") return rm
def create_model(): obs = read_csv("tests/data/obs.csv", index_col=0, parse_dates=True, squeeze=True) rain = read_csv("tests/data/rain.csv", index_col=0, parse_dates=True, squeeze=True) evap = read_csv("tests/data/evap.csv", index_col=0, parse_dates=True, squeeze=True) ml = ps.Model(obs, name="Test_Model") sm = ps.RechargeModel(prec=rain, evap=evap, rfunc=ps.Exponential, name='recharge') ml.add_stressmodel(sm) return ml
def test_create_rechargemodel(): rain = read_csv("tests/data/rain.csv", index_col=0, parse_dates=True, squeeze=True) evap = read_csv("tests/data/evap.csv", index_col=0, parse_dates=True, squeeze=True) rm = ps.RechargeModel(prec=rain, evap=evap, name='recharge', recharge="Linear") return rm
fname = 'data/MenyanthesTest.men' meny = ps.read.MenyData(fname) # Create the time series model H = meny.H['Obsevation well'] ml = ps.Model(H['values']) # Add precipitation IN = meny.IN['Precipitation']['values'] IN.index = IN.index.round("D") IN.name = 'Precipitation' IN2 = meny.IN['Evaporation']['values'] IN2.index = IN2.index.round("D") IN2.name = 'Evaporation' sm = ps.RechargeModel(IN, IN2, ps.Gamma, 'Recharge') ml.add_stressmodel(sm) # Add well extraction 2 IN = meny.IN['Extraction 2'] well = ps.TimeSeries(IN["values"], settings="well") # extraction amount counts for the previous month sm1 = ps.StressModel(well, ps.Hantush, 'Extraction_2', up=False) # Add well extraction 3 IN = meny.IN['Extraction 3'] well = ps.TimeSeries(IN["values"], settings="well") # extraction amount counts for the previous month sm2 = ps.StressModel(well, ps.Hantush, 'Extraction_3', up=False) # add_stressmodels also allows addings multiple stressmodels at once
index_col="Date", parse_dates=True) # Create the time series model ml = ps.Model(head, name="head") # read weather data rain = pd.read_csv("notebooks/data_notebook_5/prec_wellex.csv", index_col="Date", parse_dates=True) evap = pd.read_csv("notebooks/data_notebook_5/evap_wellex.csv", index_col="Date", parse_dates=True) # Create stress rm = ps.RechargeModel(prec=rain, evap=evap, rfunc=ps.Exponential, name='recharge') ml.add_stressmodel(rm) well = pd.read_csv("notebooks/data_notebook_5/well_wellex.csv", index_col="Date", parse_dates=True) / 1e6 sm = ps.StressModel(well, rfunc=ps.Exponential, name="well", up=False) ml.add_stressmodel(sm) # Solve ml.solve(noise=True) ml.plots.results()
""" import pandas as pd import pastas as ps ps.set_log_level("ERROR") # read observations and create the time series model and make meters obs = pd.read_csv("data/B32C0639001.csv", parse_dates=['date'], index_col='date', squeeze=True) # Create the time series model ml = ps.Model(obs, name="head") # read weather data and make mm/d ! evap = ps.read_knmi("data/etmgeg_260.txt", variables="EV24").series * 1e3 rain = ps.read_knmi("data/etmgeg_260.txt", variables="RH").series * 1e3 # Initialize recharge model and create stressmodel rch = ps.rch.FlexModel() # rch = ps.rch.Berendrecht() # rch = ps.rch.Linear() sm = ps.RechargeModel(prec=rain, evap=evap, rfunc=ps.Gamma, recharge=rch) ml.add_stressmodel(sm) ml.solve(noise=True, tmin="1990") ml.plots.results()
test the functioning of Pastas recharge module during development. Author: R.A. Collenteur, University of Graz. """ import pastas as ps # read observations obs = ps.read_dino('data/B58C0698001_1.csv') # Create the time series model ml = ps.Model(obs, name="groundwater head") # read weather data rain = ps.read_knmi('data/neerslaggeg_HEIBLOEM-L_967-2.txt', variables='RD') rain.multiply(1000) evap = ps.read_knmi('data/etmgeg_380.txt', variables='EV24') evap.multiply(1000) # Create stress sm = ps.RechargeModel(prec=rain, evap=evap, rfunc=ps.Exponential, recharge="Linear", name='recharge') ml.add_stressmodel(sm) ## Solve ml.solve() ml.plot()
def test_add_stressmodel(): ml = test_create_model() sm = ps.RechargeModel(prec=rain, evap=evap, rfunc=ps.Gamma, name='rch') ml.add_stressmodel(sm) return ml
# identify min groundwater level gw_min = hydrodata["LWPH4b"].min() # normalize groundwater levels to min value lwph4b = (hydrodata["LWPH4b"] - gw_min).asfreq("D") # Create a model object by passing it the observed series ml_lwph4b = ps.Model(lwph4b, name="LWPH4b") ## build stress models: # recharge precSurplus_mm = metdata["prcp_mm"] - metdata["ETo_mm"] #sm_rech = ps.RechargeModel(metdata["prcp_mm"], metdata["ETo_mm"], rfunc=ps.Gamma, name="recharge") sm_rech = ps.RechargeModel(metdata["prcp_mm"], metdata["ETo_mm"], rfunc=ps.Exponential, recharge=ps.rch.FlexModel(), name="recharge") # pumping wuse = ps.StressModel(wusedata, rfunc=ps.Hantush, name="well", settings="well", up=False) # river stage river = (hydrodata["stage_masl"] - hydrodata["stage_masl"].min()).asfreq("D").fillna(0) sm_river = ps.StressModel(river, rfunc=ps.One,