Préparez-vous en clonant le dépôt d’exercices :
git clone https://github.com/Ecohydraulics/Exercise-FloodReturn.git
Figure 1:Inondation sur la rivière Mangfall en Bavière (source: KSS 2020).
Terminologie¶
L’analyse de la fréquence des inondations utilise une série de données sur les rejets (p. ex., à partir d’une station de mesure) et évalue la probabilité d’occurrence d’un rejet particulier. Ainsi, la probabilité d’occurrence définit la fréquence d’un rejet, ce qui est important pour deux raisons :
Sécurité des flots: De nombreux cadres juridiques utilisent un intervalle de répétition (c.-à-d. une période de retour ou une fréquence en unités d’années) pour définir les niveaux de sécurité que les bâtiments et les infrastructures doivent respecter.
Ecohydraulique: Dans les zones arides, en particulier, il est important de savoir combien de temps certains rejets sont inférieurs à certains niveaux, où de nombreux habitats aquatiques peuvent ne pas être assez profonds, trop chauds ou déconnectés du chenal principal. Par conséquent, nous voulons connaître la probabilité de dépassement d’une décharge donnée.
La relation entre la probabilité de dépassement et l’intervalle de récurrence résulte de la définition des deux termes :
La probabilité de dépassement est la probabilité d’un événement d’une certaine ampleur (en m/s ou CFS) ou plus.
L’intervalle récurrence est l’inverse de la probabilité de dépassement et exprime la période de retour moyenne d’un événement d’une certaine ampleur en unités de temps.
Le concept de calcul de la période de rendement fait deux hypothèses élémentaires. Tout d’abord, on suppose que les débits individuels ont un pic stationnaire. Deuxièmement, on suppose l’indépendance statistique des événements individuels. L’hypothèse de l’indépendance statistique signifie qu’une inondation de 100 ans se produit cette année avec la même probabilité que l’année prochaine, peu importe si une inondation de 100 ans s’est effectivement produite cette année. Ainsi, pour une année donnée, la probabilité d’une inondation de 100 ans est de 1/100 (ou 1/50 pour une inondation de 50 ans, etc.).
La probabilité d’une inondation de 100 ans survenant en 100 ans est de 63 %¶
En tant qu’ingénieurs, nous voulons souvent savoir à quel point il est probable qu’une inondation de 100 ans survienne au cours des 2, 5, 10, ... ou 100 prochaines années (c.-à-d. quels sont les coûts probables des dommages causés par une inondation de 100 ans?). La réponse à cette question est “la probabilité inverse qu’aucune inondation de 100 ans ne se produise au cours des 2, 5 ou 10 prochaines années”. Mathématiquement, cela signifie la probabilité d’occurrence annuelle d’un événement avec un intervalle de récurrence ans sur une période d’observation de ans est:
Table 1 montre les solutions à la probabilité fonction pour les périodes d’observation de 2, 5, 10 et 100 ans, ainsi que les intervalles de récurrence de 10, 50 et 100 ans.
Table 1:Solutions to the probability function for selected observation periods .
= 2 | = 5 | = 10 | = 100 | |
|---|---|---|---|---|
= 10 | 19,00% | 40,95 % | 65,13 % | 100.00% |
= 50 | 3,96 % | 9,61% | 18,29 % | 86,74% |
= 100 | 1,99% | 4,90% | 9,56 % | 63,40% |
Visitez l’école USGS de sciences de l’eau pour en savoir plus sur l’intervalle de récurrence des inondations (et des sécheresses).
Obtenir les données de décharge¶
Sources de données de décharge¶
Les données de débit peuvent être récupérées dans les stations de mesure. En Allemagne, le “Gewässerkundliches Jahrbuch” fournit un aperçu complet des données statistiques des stations de mesure. Il est à noter que de nombreuses stations de mesure sont, comme dans beaucoup d’autres pays, également gérées par les autorités de l’État et qu’une faible part des données est disponible auprès des institutions fédérales. Par exemple, les données relatives aux jauges du Bade-Wurtemberg sont disponibles à l’Institut d’État pour l’environnement, l’étude et la conservation de la nature (LUBW) geo portal. La liste suivante fournit davantage de sources de données sur les rejets partout dans le monde.
Le Bundessanstalt für Gewässerkunde BfG gère le Global Runoff Data Centre GRDC pour l’Organisation météorologique mondiale * OMM* afin de fournir des données sur les déversements dans le monde entier. La plate-forme de téléchargement de GRDC est disponible sous la forme d’un Internet interactif-GIS. Pour obtenir les données, allez à leur télécharger interface, sélectionnez la station souhaitée, passez à la vue Table (troisième ligne en haut à gauche de la fenêtre), vérifiez la station, cliquez sur télécharger, et remplissez le formulaire pour envoyer la demande. Vous recevrez un e-mail avec un lien de téléchargement pour les données demandées (attendre quelques minutes avant de cliquer sur le lien - la préparation peut prendre plus de temps que l’e-mail).
Les ensembles de données sur les débits des cours d’eau alpins et moyens sont fournis par l’Office fédéral de l’environnement plate-forme de données hydrologiques (pour les observations à long terme, un formulaire doit également être rempli ici).
Aux États-Unis, la National Oceanic and Atmospheric Administration NOAA fournit des données sur les rejets du passé et des prévisions pour les bassins versants en Amérique du Nord. Par exemple, le California Nevada River Forecast Center fournit des prévisions de débit pour le sud-ouest des États-Unis, et les données historiques peuvent être consultées à partir du California Data Exchange Center CDEC.
Une interface générale US pour le chargement des données de flux et des statistiques est fournie avec la bibliothèque
hydrofunctionsPython fournie par la Commission géologique des États-Unis USGS. Cette bibliothèque permet d’obtenir directement des données et des statistiques basées sur un ID de jauge de flux. Par exempleoutput = hydrofunctions.peaks("01541200")Pour installer
hydrofunctionsdans un environnement conda, tapezconda install -c conda-forge hydrofunctionsà Anaconda Prompt.Exemple d’utilisation :
import hydrofunctions as hf
hf.draw_map()` # only runs in JupyterLabCharger les données avec pandas¶
Créer un nouveau fichier Python (par exemple discharge_analysis.py) et importer pandas comme pd au début. Lisez le fichier de données de flux fourni "daily-flow-series.csv" avec pd.read_csv.
L’en-tête (noms des colonnes) se trouve à la ligne 36, mais nous n’utilisons pas les noms des colonnes du fichier csv et les écraseons avec l’argument names ("Date" et "Q (CMS)" (pour les compteurs cubiques par seconde)). Sinon, nous pourrions utiliser l’argument skiprows pour indiquer où le contenu des données commence dans le fichier.
Avec sep=";", nous indiquons que les colonnes sont séparées par un point-virgule. L’argument usecols=[0, 2] spécifie que nous ne voulons lire que les colonnes 0 (date) et 2 (décharge) parce que le contenu d’information de la colonne 1 (temps) n’est pas pertinent pour la décharge quotidienne. L’argument parse_dates=[0] permet à pandas de savoir que la colonne 0 contient des valeurs formatées par date. Sinon, nous pourrions utiliser un dictionnaire dtype={"Date": ... } pour spécifier les formats de données des colonnes. Cependant, l’utilisation de dtype nécessiterait l’importation de datetime et induirait une complexité inutile. De plus, l’argument index_col définit les indices de colonnes, qui doivent avoir un format de date pour les analyses ultérieures. En outre, utilisez l’argument optionnel encoding="latin1" parce que le fichier de données fourni contient des caractères spéciaux qui ne peuvent pas être reconnus avec le codage standard utf-8.
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")Tout a marché ? Vérifier le chargement data_series avec print(data_series.head())
Si votre fichier CSV a des caractères spéciaux (par exemple 3), vous devrez peut-être utiliser l’argument optionnel du mot-clé encoding="latin1" car certains caractères spéciaux ne peuvent pas être reconnus avec l’encodage standard utf-8.
Tracer les données¶
Les données de localisation ne sont pas au centre de cet exercice et, pour cette raison, il existe une fonction prête à utiliser disponible dans le script plot_discharge.py. Assurez-vous que le plot_discharge.py est dans le même répertoire que le script discharge_analysis.py Python (appelez comment charger Paquets, modules et bibliothèques). Utilisez la fonction plot_discharge dans plot_discharge.py comme suit:
from plot_discharge import plot_discharge
plot_discharge(df.index, df["Q (CMS)"], title="Daily Flows 1826 - 2016")En parallèle, plot_discharge utilise la bibliothèque Matplotlib.
Construisez une série de décharges maximales annuelles¶
Les intervalles de récurrence des événements d’inondation résultent des statistiques du débit maximal annuel. Utilisez donc la fonction pandas’ resample pour trouver les valeurs maximales annuelles. La fonction resample nécessite la définition d’un DateTimeIndex, que nous avons déjà implémenté en utilisant l’argument index_col quand nous avons chargé les données. Le premier argument (et seulement requis) pour la fonction resample est la règle définissant la durée du délai auquel le rééchantillonnage s’applique. Ici, nous utilisons "A" pour les statistiques annuelles. Pour utiliser des périodes semestrielles ou de 5 ans, nous pourrions utiliser la règle "5A". D’autres règles peuvent être trouvées au pandas docs.
En outre, nous utilisons l’argument kind=period, parce que nous ne sommes intéressés que l’année où la décharge a eu lieu. Enfin, nous appliquons .max() pour exécuter des statistiques maximum sur la base de données. Comme la dataframe rééchantillonnée est à nouveau une dataframe, toutes les méthodes de dataframe peuvent également y être appliquées. Autrement dit, au lieu de max(), nous pouvons aussi utiliser min(), sum(), median(), mean() et ainsi de suite (voir pandas dataframe methods).
annual_max_df = df.resample(rule="A", kind="period").max()Parce que nous utilisons kind="period", les indices de ligne de annual_max_df correspondent à des périodes d’années. Par exemple, l’index des lignes 1826 correspond à la période 1826-01-01 via 1826-12-31. Cependant, nous avons besoin d’un nombre entier d’années plutôt que de périodes pour le calcul des périodes de rendement. Pour obtenir des formats entiers d’années, nous transférons l’année de chaque période dans une nouvelle colonne du cadre de données et réinitialisons les indices de lignes. Il n’est pas absolument nécessaire de réinitialiser les indices de ligne aux indices entiers par défaut par (drop=True), mais il sert à la correction physique du cadre de données. L’argument inplace=True remplace les indices à l’intérieur annual_max_df (autrement, nous devions écrire annual_max_df = annual_max_df.reset_index(drop=True)).
annual_max_df["year"] = annual_max_df.index.year
annual_max_df.reset_index(inplace=True, drop=True)
print(annual_max_df.head()En option, tracez les maxima annuels avec:
plot_discharge(annual_max_df["year"], annual_max_df["Q (CMS)"], title="Annual Flows 1826 - 2016")Calculer les probabilités de dépassement et les intervalles de récurrence¶
The exceedance probability of a particular event within the observation period is:
où
est le nombre total d’années d’observation, et
est la rank de l’événement.
Pour classer les événements, nous devons d’abord trier la base de données de décharge annuelle maximale (annual_max_df) par la plus petite à la plus grande valeur de décharge (plutôt que dans le temps):
annual_max_df_sorted = annual_max_df.sort_values(by="Q (CMS)")Ensuite, nous dérivons le nombre d’observations (n = annual_max_df_sorted.shape[0]) et ajoutons une colonne "rank", dans laquelle nous énumérons simplement les lignes en utilisant la méthode range.
n = annual_max_df_sorted.shape[0]
annual_max_df_sorted.insert(0, "rank", range(1, 1 + n)Maintenant, nous avons tous les ingrédients pour calculer la probabilité de chaque événement avec le ci-dessus montré -formula.
annual_max_df_sorted["pr"] = (n - annual_max_df_sorted["rank"] + 1) / (n + 1)Rappel, l’intervalle de récurrence (ici: période de retour en années) est l’inverse de la probabilité de dépassement et nous pouvons l’ajouter à la base de données avec:
annual_max_df_sorted["return-period"] = 1 / annual_max_df_sorted["pr"]Vérifiez la décharge la plus élevée et sa période de retour:
print(annual_max_df_sorted.tail()Tracez les courbes de probabilité et de retour avec les fonctions de tracé fournies dans le script plot_result.py Python :
plot_q_freq(annual_max_df_sorted)
plot_q_return_period(annual_max_df_sorted)En dehors de la boîte¶
La méthode présentée ici n’est qu’une interpolation. Pour extrapoler les périodes de retour au-delà de la durée de la période d’observation (p. ex., pour des événements extrêmes comme une inondation de 1000 ans), un modèle de prédiction est nécessaire (p. ex., Gumbel réparti-extrapolation).
Après tout, il y a déjà un logiciel qui calcule les périodes de retour, librement disponible au U.S. Army Corps of Engineers Hydrological Engineering Center (HEC) U.S. Army Corps of Engineeers, 2016: HEC-SPP. HEC-SPP permet le calcul des fréquences des événements de flux et des périodes de retour selon les normes américaines. Donc, si vous ne travaillez pas aux États-Unis ou pour eux, vous voudrez peut-être encore avoir votre code prêt. De plus, HEC-SPP nécessite le traitement préalable des données de décharge (c’est-à-dire qu’il ne fonctionne qu’avec des maxima annuels).
- 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/