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');
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('');
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');
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');
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');