Пример #1
0
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
Пример #2
0
    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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
                   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()
Пример #8
0
"""
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()
Пример #9
0
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()
Пример #10
0
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,