Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Überflutungszeiten

Bereiten Sie sich durch Klonen des Übungs-Repository:

git clone https://github.com/Ecohydraulics/Exercise-FloodReturn.git
floods Mangfall Bad Aibling Hochwasser

Figure 1:Flut am Mangfall River in Bayern (Quelle: KSS 2020).

Terminologie

Die Flutfrequenzanalyse verwendet eine Reihe von Entladungsdaten (z.B. von einer Messstation) und wertet die Auftretenswahrscheinlichkeit einer bestimmten Entladung aus. So definiert die Ereigniswahrscheinlichkeit die Häufigkeit einer Entladung, die aus zwei Gründen wichtig ist:

  1. ** Sicherheit**: Viele Rechtsrahmen verwenden ein -Recurrence-Intervall (d.h. eine Retourendauer oder Häufigkeit in Einheiten von Jahren), um Sicherheitsniveaus zu definieren, die Gebäude und Infrastruktur erfüllen müssen.

  2. *Ecohydraulik: Insbesondere in trockenen Gebieten ist es wichtig zu wissen, wie lange bestimmte Entladungen unter bestimmten Ebenen liegen, wo viele aquatische Lebensräume nicht tief genug, zu heiß oder vom Hauptkanal getrennt sein können. Daher wollen wir die -Exceedance-Wahrscheinlichkeit einer gegebenen Entladung kennen.

Die Beziehung zwischen der Überschreitungswahrscheinlichkeit und dem Wiederauftretensintervall ergibt sich aus der Definition beider Begriffe:

Das Berechnungskonzept der Rückgabeperiode macht zwei elementare Annahmen. Zunächst wird angenommen, dass die einzelnen Strömungsereignisse einen stationären Peak aufweisen. Zweitens wird die statistische Unabhängigkeit einzelner Ereignisse angenommen. Die Annahme der statistischen Unabhängigkeit bedeutet, dass in diesem Jahr eine 100-jährige Flut mit der gleichen Wahrscheinlichkeit wie im nächsten Jahr auftritt, unabhängig davon, ob in diesem Jahr tatsächlich eine 100-jährige Flut aufgetreten ist. So beträgt die Wahrscheinlichkeit einer 100-jährigen Überschwemmung für jedes Jahr 1/100 (oder 1/50 für eine 50-jährige Überschwemmung usw.).

Die Wahrscheinlichkeit einer 100-jährigen Überschwemmung in 100 Jahren beträgt 63 %

Als Ingenieure wollen wir oft wissen, wie wahrscheinlich es ist, dass eine 100-jährige Flut innerhalb der nächsten 2, 5, 10, ... oder 100 Jahre auftreten wird (d.h. was sind die wahrscheinlichen Kosten für Flutschäden im Zusammenhang mit einer 100-jährigen Flut?). Die Antwort auf diese Frage ist “die entgegengesetzte Wahrscheinlichkeit, dass in den nächsten 2, 5 oder 10 Jahren keine 100-jährige Flut auftritt”. Mathematisch bedeutet das die jährliche Eintrittswahrscheinlichkeit PrPr einer Veranstaltung mit einem Wiederauftretensintervall T=100T=100Jahre über einen Beobachtungszeitraum von Δt[2,5,10,100]\Delta t \in [2, 5, 10, 100]Jahre:

Pr(T=100,Δt=2,5,10,100)=(1(11/T)Δt)Pr(T=100, \Delta t=2, 5, 10, 100) = (1 - (1-1/T)^{\Delta t})

Table 1 zeigt Lösungen zur Wahrscheinlichkeit Pr(T,Δt)Pr(T, \Delta t)Funktion für Beobachtungsperioden Δt\Delta t von 2, 5, 10 und 100 Jahren sowie Rekursionsintervalle TT von 10, 50 und 100 Jahren.

Table 1:Solutions to the probability function Pr(T,Δt)Pr(T, \Delta t) for selected observation periods Δt\Delta t.

Pr(T,Δt)Pr(T, \Delta t)

Δt\Delta t = 2

Δt\Delta t = 5

Δt\Delta t = 10

Δt\Delta t = 100

TT = 10

19.00%

40,95%

65.13%

100.00%

TT = 50

3,96%

9.61%

18.29%

86.74 %

TT = 100

1,9 %

4,90%

9.56%

63,40%

Besuchen Sie die USGS Wasserwissenschaftsschule, um mehr über Flut (und Dürre)-Rekurs zu erfahren.

Löschen von Daten

Datenquellen deaktivieren

Durchflussdaten können von Messstationen abgerufen werden. In Deutschland bietet das “Gewässerkundliches Jahrbuch” eine Übersicht über statistische Daten von gauging Stationen. Beachten Sie, dass viele Messstellen, wie auch in vielen anderen Ländern, von staatlichen Behörden verwaltet werden und nur ein kleiner Datenanteil von Bundeseinrichtungen zur Verfügung steht. Zum Beispiel sind Lehrdaten für Baden-Württemberg am Staatlichen Institut für Umwelt, Umwelt und Naturschutz (LUBW) verfügbar geo portal. Die folgende Liste enthält mehr Quellen für die Datenerhebung auf der ganzen Welt.

import hydrofunctions as hf
hf.draw_map()` # only runs in JupyterLab

Daten laden mit pandas

Erstellen Sie eine neue Python-Datei (z.B. discharge_analysis.py) und importieren Sie pandas als pd zu Beginn. Lesen Sie die bereitgestellte Datenreihendatei "daily-flow-series.csv" mit pd.read_csv. Der Header (Spaltennamen) befindet sich in Zeile 36, aber wir verwenden nicht die Spaltennamen aus der csv-Datei und überschreiben sie mit dem namesArgument ("Date" und "Q (CMS)" (für Cubic Meters per Second)). Alternativ könnten wir das Argument skiprows verwenden, um anzuzeigen, wo der Dateninhalt in der Datei beginnt. Mit sep=";" geben wir an, dass Spalten durch ein Semikolon getrennt werden. Das usecols=[0, 2]-Argument gibt an, dass wir nur die Spalten 0 (Datum) und 2 (Entladung) lesen wollen, da der Informationsinhalt der Spalte 1 (Zeit) für die tägliche Entladung nicht relevant ist. Das parse_dates=[0]Argument lässt pandas wissen, dass Spalte 0 datenformatierte Werte enthält. Alternativ können wir ein dtype={"Date": ... } Wörterbuch verwenden, um die Datenformate der Spalten anzugeben. Die Nutzung von dtype erfordert jedoch den Import von datetime und induziert unnötige Komplexität. Darüber hinaus definiert das index_col Argument die Spaltenindizes, die ein Datumsformat für die späteren Analysen haben müssen. Darüber hinaus verwenden Sie das optionale Keyword-Argument encoding="latin1", da die bereitgestellte Datendatei einige Sonderzeichen enthält, die mit der Standard-utf-8 encoding nicht erkannt werden können.

import pandas as pd
df = pd.read_csv("flow-data/daily-flow-series.csv",
                 header=36,
                 sep=";",
                 names=["Date", "Q (CMS)"],
                 usecols=[0, 2],
                 parse_dates=[0],
                 index_col="Date")

Hat alles funktioniert? Überprüfen Sie die geladenen data_series mit print(data_series.head())

Wenn Ihre CSV-Datei besondere Zeichen hat (z.B. 3) müssen Sie das optionale Keyword-Argument encoding="latin1" verwenden, da einige Sonderzeichen nicht mit der Standard utf-8 encoding erkannt werden können.

Geben Sie die Daten

Die Plotting-Daten stehen nicht im Mittelpunkt dieser Übung, weshalb im Skript plot_discharge.py eine gebrauchsfertige Funktion zur Verfügung steht. Stellen Sie sicher, dass die plot_discharge.py im gleichen Verzeichnis wie das oben genannte discharge_analysis.py Python-Skript steht (wie man Pakete, Module und Bibliotheken lädt). Verwenden Sie die plot_discharge-Funktion in plot_discharge.py wie folgt:

from plot_discharge import plot_discharge
plot_discharge(df.index, df["Q (CMS)"], title="Daily Flows 1826 - 2016")

plot_discharge verwendet die Bibliothek Matplotlib.

Baureihe der jährlichen maximalen Entladung

Die Wiederholungsintervalle der Flutereignisse ergeben sich aus Statistiken der jährlichen Höchstentladung. Verwenden Sie daher die Funktion resample](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html), um jährliche Höchstwerte zu finden. Die Resample-Funktion erfordert die Definition einer DateTimeIndex, die wir bereits mit dem index_col Argument implementiert haben, wenn wir die Daten geladen haben. Das erste (und nur erforderliche) Argument für die resample-Funktion ist die Regel, die die Länge des Zeitrahmens definiert, auf den eine erneute Probenahme Anwendung findet. Hier verwenden wir "A" für Jahresstatistiken. Für die Nutzung von zwei- oder 5-Jahres-Zeiträumen können wir die Regel "5A" verwenden. Weitere Regeln finden Sie unter der pandas docs. Darüber hinaus verwenden wir das Argument kind=period, denn wir sind nur an dem Jahr interessiert, in dem die Entlastung stattgefunden hat. Schließlich wenden wir .max() an, um maximum Statistiken über den Datenrahmen auszuführen. Da der wieder abgetastete Datenrahmen wiederum ein Datenrahmen ist, können auch alle Dataframe-Methoden darauf angewendet werden. Das heißt, statt max() können wir auch min(), sum(), median(), mean() und so weiter (siehe pandas dataframe Methoden) verwenden.

annual_max_df = df.resample(rule="A", kind="period").max()

Da wir kind="period" verwenden, entsprechen die Zeilenindizes von annual_max_df den Zeiträumen von Jahren. So entspricht der Zeilenindex 1826 dem Zeitraum 1826-01-01 durch1826-12-31. Wir brauchen jedoch ganzzahlige Zahlen von Jahren und nicht Perioden für die Berechnung von Rückgabeperioden. Um ganzzahlige Formate von Jahren zu erhalten, übertragen wir das Jahr jeder Periode in eine neue Spalte des Datenrahmens und setzen die Zeilenindizes zurück. Das Zurücksetzen der Zeilenindizes auf Standard-Indizes durch (drop=True) ist nicht unbedingt erforderlich, sondern dient der physikalischen Korrektheit des Datenrahmens. Das Argument inplace=True ersetzt die Indizes innerhalb annual_max_df (anders müssen wir annual_max_df = annual_max_df.reset_index(drop=True) schreiben).

annual_max_df["year"] = annual_max_df.index.year
annual_max_df.reset_index(inplace=True, drop=True)
print(annual_max_df.head()

Optional die jährlichen Maxima mit:

plot_discharge(annual_max_df["year"], annual_max_df["Q (CMS)"], title="Annual Flows 1826 - 2016")

Berechnen von Exceedance Probability und Recurrence Intervals

Die Überschreitungswahrscheinlichkeit PrPr eines bestimmten Ereignisses innerhalb des Beobachtungszeitraums ist:

Pr(i)=(Ni+1)/(N+1)Pr(i) = (N - i + 1) / (N + 1)

wenn

Um die Ereignisse zu ordnen, müssen wir zunächst den maximalen jährlichen Entladungsdatenrahmen (annual_max_df) um den kleinsten bis größten Entladewert (anstatt rechtzeitig) sortieren:

annual_max_df_sorted = annual_max_df.sort_values(by="Q (CMS)")

Dann leiten wir die Anzahl der Beobachtungen NN (n = annual_max_df_sorted.shape[0]) ab und fügen eine "rank" Spalte hinzu, in der wir einfach die Zeilen mit der range-Methode auszählen.

n = annual_max_df_sorted.shape[0]
annual_max_df_sorted.insert(0, "rank", range(1, 1 + n)

Jetzt haben wir alle Zutaten, um die Wahrscheinlichkeit jeder Veranstaltung zu berechnen, mit der oben angegebenen Pr(rank=i)Pr(rank=i)-formula.

annual_max_df_sorted["pr"] = (n - annual_max_df_sorted["rank"] + 1) / (n + 1)

Recall, das Wiederholungsintervall (hier: Rückkehrzeit in Jahren) ist das Invers der Überschreitungswahrscheinlichkeit und wir können es in den Datenrahmen mit:

annual_max_df_sorted["return-period"] = 1 / annual_max_df_sorted["pr"]

Prüfen Sie die resultierende höchste Entladung und ihre Rückgabezeit:

print(annual_max_df_sorted.tail()

Geben Sie die resultierende Wahrscheinlichkeit und Rückgabekurven mit den im Skript plot_result.py Python bereitgestellten Plotfunktionen aus:

plot_q_freq(annual_max_df_sorted)
plot_q_return_period(annual_max_df_sorted)

Außerhalb der Box

Das hier dargestellte Verfahren ist nur eine Interpolation. Für die Extrapolation von Rückführungszeiten über die Länge des Beobachtungszeitraums (z.B. für Extremereignisse wie eine 1000-jährige Flut) ist ein Prädiktionsmodell erforderlich (z.B. Gumbel verteilte Extrapolation).

Schließlich gibt es bereits Software, die Rückgabefristen berechnet, frei verfügbar im U.S. Army Corps of Engineers Hydrologic Engineering Center (HEC) U.S. Army Corps of Engineeers, 2016: HEC-SPP. HEC-SPP ermöglicht die Berechnung von Flussereignisfrequenzen und Rücklaufperioden nach US-Standards. Wenn Sie also nicht in oder für die Vereinigten Staaten arbeiten, können Sie immer noch Ihren Code bereit haben. Darüber hinaus erfordert HEC-SPP eine Vorverarbeitung von Entladungsdaten (d.h. es funktioniert nur mit jährlichen Maxima).

References
  1. U.S. Army Corps of Engineeers. (2016). Hydrologic Engineering Centers River Analysis System (HEC-RAS). U.S. Army Corps of Engineeers (USACE). http://www.hec.usace.army.mil/software/hec-ras/