Benutzerdefinierte Regel registrieren - TranscientDecisionParameter
Fügen Sie den folgenden Code ein und klicken Sie dann auf die Schaltfläche Speichern
Klasse TransientDecisionParameter (Parameter):
„"“ Gibt abhängig vom aktuellen Zeitschritt einen von zwei Werten zurück
Dieser `Parameter` kann verwendet werden, um ein diskretes Entscheidungsereignis zu modellieren
das passiert zu einem bestimmten Zeitpunkt. Vor diesem Datum das `Vorher`
Der Wert wird zurückgegeben, und nach diesem Datum wird der Wert „nach“ zurückgegeben.
Parameter
----------
decision_date: Zeichenfolge oder pandas.TimeStamp
Das Auslösedatum für die Entscheidung.
before_parameter: Parameter
Der Wert, der vor dem Entscheidungsdatum verwendet werden soll.
after_parameter: Parameter
Der Wert, der nach dem Entscheidungsdatum verwendet werden soll.
earliest_date: string oder pandas.TimeStamp oder None
Frühestes Datum, auf das die Variable gesetzt werden kann. Die Standardeinstellung ist `model.timestepper.start`
latest_date: string oder pandas.Timestamp oder None
Spätestes Datum, auf das die Variable gesetzt werden kann. Die Standardeinstellung ist `model.timestepper.end`
decision_freq: Pandas-Frequenzstring (Standard 'AS')
Die Auflösung möglicher Termine. Zum Beispiel würde 'AS' jedes Mal mögliche Termine erstellen
Jahr zwischen `frühestens_datum` und `spätestes_datum`. Die `Pandas`-Funktionen werden verwendet
intern für Delta-Datumsberechnungen.
„“
def __initiieren__(Selbst, Modell, Entscheidung_Datum, vorher_Parameter, nach_Parameter, frühester_Datum=Kein, spätestes_Date=None, Entscheidung_Freq='as', **kwargs):
super (transientDecisionParameter, self).__initiieren__(Modell, **kwargs)
selbst._Entscheidung_Datum = Keines
Selbstentscheidung_Datum = Entscheidung_Datum
wenn nicht isinstance (before_parameter, Parameter):
raise ValueError ('Der `vorher`-Wert sollte eine Parameter-Instanz sein. ')
before_parameter.parents.add (selbst)
selbst.vorher_Parameter = vorher_Einstellung
wenn nicht isinstance (after_parameter, Parameter):
raise ValueError ('Der Wert `nach` sollte eine Parameter-Instanz sein. ')
after_parameter.parents.add (selbst)
selbst.danach_Parameter = nach_Einstellung
# Diese Parameter werden hauptsächlich verwendet, wenn diese Klasse als Variable verwendet wird.
selbst._frühestens_Datum = Keines
selbst.frühestens_Datum = frühestes_Datum
selbst._neueste_Datum = Keines
selbst.latest_Datum = spätestes_Datum
Selbstentscheidung_freq = Entscheidung_Frequenz
selbst._machbar_Termine = Keine
self.integer_size = 1 # Dieser Parameter hat eine einzelne Integer-Variable
def decision_date ():
def fget (selbst):
kehre dich selbst zurück._Entscheidung_Datum
def fset (selbst, Wert):
wenn isinstance (Wert, pd.Timestamp):
selbst._Entscheidung_Datum = Wert
sonst:
selbst._Entscheidung_Datum = pd.to_datetime (Wert)
gib Einheimische zurück ()
Entscheidung_Datum = Eigentum (**Datum der Entscheidung ()
def earliest_date ():
def fget (selbst):
wenn ich selbst._frühestens_Datum ist nicht Keines:
kehre dich selbst zurück._frühestens_Datum
sonst:
gib self.model.timestepper.start zurück
def fset (selbst, Wert):
wenn isinstance (Wert, pd.Timestamp):
selbst._frühestens_Datum = Wert
sonst:
selbst._frühestens_Datum = pd.to_datetime (Wert)
gib Einheimische zurück ()
frühestens_Datum = Eigentum (**frühestes Datum ()
def latest_date ():
def fget (selbst):
wenn ich selbst._neueste_Datum ist nicht Keines:
kehre dich selbst zurück._neueste_Datum
sonst:
gib self.model.timestepper.end zurück
def fset (selbst, Wert):
wenn isinstance (Wert, pd.Timestamp):
selbst._neueste_Datum = Wert
sonst:
selbst._neueste_Datum = pd.to_datetime (Wert)
gib Einheimische zurück ()
neueste_Datum = Eigentum (**neuestes_datum ()
def setup (selbst):
super (transientDecisionParameter, self) .setup ()
# Richten Sie nun die möglichen Daten ein, an denen dieses Objekt als Variable verwendet wird.
selbst._machbar_daten = pd.date_Reichweite (selbst.frühestens)_Datum, self.latest_date,
freq=selbst.entscheidungsfreq)
def-Wert (self, ts, scenario_index):
wenn ts None ist:
v = selbst.before_parameter.get_Wert (scenario_index)
elif ts.datetime => self.decision_date:
v = selbst.danach_parameter.get_Wert (scenario_index)
sonst:
v = selbst.before_parameter.get_Wert (scenario_index)
gib v zurück
auf jeden Fall_Ganzzahl_lower_bounds (selbst):
gib np.array ([0,], dtype=np.int) zurück
auf jeden Fall_Ganzzahl_upper_bounds (selbst):
gib np.array ([len (self) zurück._machbar_Daten) - 1,], dtype=np.int)
definitv gesetzt_Ganzzahl_Variablen (selbst, Werte):
# Aktualisieren Sie das Entscheidungsdatum mit dem entsprechenden möglichen Datum
Selbstentscheidung_Datum = selbst._easible_dates [Werte [0]]
auf jeden Fall_Ganzzahl_Variablen (selbst):
gib np.array ([self._machbar_dates.get_loc (Selbstentscheidung)_Datum),], dtype=np.int)
def dump (selbst):
daten = {
'frühestens_'Datum': selbst.frühestes_date.isoformat (),
'neuestes_'Datum': self.latest_date.isoformat (),
'Entscheidung_'Datum': Selbstentscheidung_date.isoformat (),
'Entscheidung_'Frequenz': Selbstentscheidung_Frequenz
}
Daten zurückgeben
@classmethod
def load (cls, modell, daten):
vor_Parameter = laden_parameter (Modell, data.pop ('before_parameter'))
nach_Parameter = laden_parameter (Modell, data.pop ('after_parameter'))
gibt cls (model) zurück, vorher_parameter=vorher_Parameter, nach_parameter=nach_Parameter, **Daten)
TransientDecisionParameter.register ()
Wenn Sie dieses Netzwerk jetzt in WaterStrategy ausführen, wird ein TranscientDecisionParameter registriert.
Vergewissern Sie sich, dass Ihre benutzerdefinierte Regel nach dem Speichern auf der linken Seite angezeigt wird, in diesem Fall unter Parameter Abschnitt
Verwenden des TranscientDecisionParameters
In diesem Fall verdoppeln wir die maximale Lautstärke von Neues Reservoir storage node beginnt mit 2045-01-01
Gehe zu Neues Reservoir storage node und EditMax. Lautstärke
Wählen Sie in Optionen Registerkarte PYWR_PARAMETER
Fügen Sie den folgenden Code ein und klicken Sie auf Speichern
TranscientDecisionParameter beinhaltet Attribute before_Parameter und danach_Parameter den wir wie folgt erstellen müssen:
Es öffnet sich ein kleines Textfeld, in dem wir den Namen unseres neuen schreiben können VON_PARAMETER, in diesem Fall
__Neues Reservoir__:maximal_Volumen vorher. Klicken Sie Geben Sie ein. \
WaterStrategy öffnet das Parameterfenster, fügen Sie den folgenden Code ein und Speichern
**__Neues Reservoir__:maximal_Volumen vorher: **
{
„Typ“: „Konstanter Parameter“,
„Wert“: 120000
}
Wiederholen Sie den Vorgang, um die maximale Lautstärke nach dem Parameter zu erstellen
**__Neues Reservoir__:maximal_Volumen nach: **
{
„Typ“: „Konstanter Parameter“,
„Wert“: 240000
}
Als letzten Schritt benötigt TranscientDecisionParameterUrsprünglicher Volumenanteil für den storage node als Parameter erben wir die Anfangswerte vom Knoten, in diesem Fall richten wir das so ein 0.99
Ergebnisse
Wie wir im folgenden Bild sehen können, kombinieren wir Pywr-Szenarien unter Verwendung des Klimawandels und erhöhen das Volumen unseres ausgewählten Reservoirs von 120.000 Ml auf 240.__1234567890__□ Ml am 1. Januar __1234567890__□ Ml.