Visualisation de la corrélation entre les précipitations, l’étendue des eaux de surface et le débit

Charger des paquets

Importez les packages Python utilisés pour l’analyse.

[1]:
import pandas as pd
import matplotlib.pyplot as plt
from pandas.tseries.frequencies import to_offset

Paramètres d’analyse

[2]:
okavango_rainfall='results/okavango_rainfall_2013-12_to_2021-05-31.csv'
upstream_rainfall='results/upstream_rainfall_2013-12_to_2021-05-31.csv'
upstream_rainfall_1W='results/upstream_rainfall_1W_2013-12_to_2021-05-31.csv'
water_extent='results/water_extent_2013-12_to_2021-05.csv'
discharge = 'data/mohembo_daily_water_discharge_data.csv'

Lire les fichiers

[3]:
df=pd.read_csv(okavango_rainfall, index_col='time', parse_dates=True)[0:-1]
upr=pd.read_csv(upstream_rainfall, index_col='time',parse_dates=True)[0:-1]
upr_1W=pd.read_csv(upstream_rainfall_1W, index_col='time',parse_dates=True)
we=pd.read_csv(water_extent, index_col='time',parse_dates=True)
dis=pd.read_csv(discharge)

Données de décharge du processus

[4]:
dis['date'] = pd.to_datetime(dis['date'], dayfirst=True)
dis = dis.set_index('date')

Tracer les données brutes

Notez que la densité des données de mesures de débit diminue au cours des dernières années.

[5]:
dis.plot(figsize=(25,10),  marker='o', linestyle='dashed')
plt.title('Raw discharge data');
../../../../_images/sandbox_notebooks_Use_cases_Okavango_4_Visualising_rainfall_discharge_water_extent_10_0.png

Tracer le nombre d’observations par an

Comme il s’agit de données quotidiennes, le nombre maximal d’observations par an devrait être de 365. Notez la forte baisse de la densité des données à partir de 2010. Les données de débit sont donc largement peu fiables à partir de 2010

[6]:
dis.groupby(dis.index.year).count().plot.bar(figsize=(17,5))
plt.title('Number of discharge observations per year')
plt.xlabel('');
../../../../_images/sandbox_notebooks_Use_cases_Okavango_4_Visualising_rainfall_discharge_water_extent_12_0.png

Essayez de combler les lacunes dans les données de décharge

Commencez par rééchantillonner l’ensemble de données en fonction des moyennes hebdomadaires pour créer des mesures uniformément espacées, puis effectuez une interpolation linéaire simple entre les points pour combler les lacunes des semaines où il n’y a pas de données de décharge.

[7]:
dis = dis.resample('W').mean().interpolate(limit=2)
[8]:
dis.plot(figsize=(20,7),  marker='o', linestyle='dashed')
plt.title('Gapfilled, weekly mean discharge data');
../../../../_images/sandbox_notebooks_Use_cases_Okavango_4_Visualising_rainfall_discharge_water_extent_15_0.png

Tracez les précipitations hebdomadaires en amont parallèlement au débit hebdomadaire

Cela permettra de déterminer si les données de débit sont fiables. Si les données de débit présentent de grandes lacunes, il se peut que le débit de pointe saisonnier ne soit pas enregistré. Lorsque les précipitations sont importantes mais qu’il n’y a pas de pic de débit correspondant, cela peut indiquer que les données de débit n’ont tout simplement pas enregistré le débit de pointe.

[9]:
fig, ax1 = plt.subplots(1,1, figsize=(16,6))
ax2 = ax1.twinx()
ax1.plot(upr_1W['cumulative 1-week rainfall (mm)'], label='upstream_rainfall', marker='o', linestyle='dashed', c='orange')
ax2.plot(dis[dis.index >= pd.to_datetime('2013-12-01')],label='discharge', marker='o', linestyle='dashed')
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
ax1.set_ylabel('Cumulative weekly rainfall (mm)')
ax2.set_ylabel('Weekly mean discharge')
plt.title('Weekly cumulative upstream rainfall and weekly mean discharge');
../../../../_images/sandbox_notebooks_Use_cases_Okavango_4_Visualising_rainfall_discharge_water_extent_17_0.png

Rééchantillonner l’ensemble de données de débit en fonction des moyennes saisonnières

Cela correspondra aux ensembles de données que nous avons collectés auprès d’ERA5 et de Landsat

[10]:
dis = dis.resample('QS-DEC').mean()
dis.index = dis.index + to_offset("1M")
dis = dis[dis.index >= pd.to_datetime('2013-12-31')]

Fusionner en un seul dataframe

Et expprt les résultats au format csv

[11]:
df['upstream_rain']=upr
df['water_extent']=we
df['discharge']=dis
df = df.rename({'cumulative 3-month rainfall (mm)':'okavango_rain'},axis=1)
df.to_csv('results/okavango_all_datasets.csv')

Représenter graphiquement tous les ensembles de données saisonnières

[12]:
#set figure
fig, ax1 = plt.subplots(figsize=(20,7))
ax2 = ax1.twinx()
#add plots
ax1.plot(df['upstream_rain'], label = 'upstream_rain', linestyle='dashed', marker='o')
ax1.plot(df['okavango_rain'], label = 'okavango_rain', linestyle='dashed', marker='o')
ax1.plot(df['water_extent'], label = 'water_extent', linestyle='dashed', marker='o')
ax2.plot(df['discharge'], label='discharge', linestyle='dashed', marker='o', color='red')
#tidy up figure
ax1.set_ylabel('Open Water Extent (km2) / Cumulative rainfall (mm)')
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')
ax2.set_ylabel('Seasonal Mean Discharge')
plt.title('Correlation of Okavango Water Extent, Rainfall, and Discharge')
plt.savefig(f'results/Rainfall_water_extent_and_discharge.png');
../../../../_images/sandbox_notebooks_Use_cases_Okavango_4_Visualising_rainfall_discharge_water_extent_23_0.png