Source code for water_balance
import pandas as pd
import matplotlib.pyplot as plt
import glob
[docs]class water_balance:
"""Annual water balance information of a PCR-GLOBWB run. Data is retrieved from the log-file of this run.
Arguments:
fo (str): path to log-file
"""
def __init__(self, fo):
"""Initiates water balance object based on PCR-GLOBWB log-file.
"""
self.pcr_log_file = fo
[docs] def get_annual_values(self):
"""Get annual values for a range of water balance components by parsing the log-file.
Returns:
dataframe: dataframe containing annual values of water balance components
"""
varData = {
"year" : [],
"precipitation" : [],
"actualET": [],
"runoff": [],
"totalPotentialGrossDemand": [],
"baseflow": [],
"storage": [],}
varNames = varData.keys()
for fileName in glob.glob(self.pcr_log_file):
try:
f = open(fileName, "r")
lines = f.readlines()
f.close()
except:
lines = ""
for line in lines:
varFields = line.split(" ")
if len(varFields) > 2:
if varFields[2] == "pcrglobwb" and len(varFields) == 9:
try:
year = int(varFields[-1][:4])
except:
if varFields[2] == "pcrglobwb" and len(varFields) == 16:
year = int(varFields[11][:4])
if year not in varData["year"]:
varData["year"].append(year)
if len(varFields) > 15:
if varFields[7] == "days" and varFields[8] == "1" and varFields[9] == "to":
for var in varNames:
if varFields[6] == var:
varData[var].append(float(varFields[14]))
if len(varFields) > 14:
if varFields[6] == "days" and varFields[7] == "1" and varFields[8] == "to":
for var in varNames:
if varFields[5] == var:
varData[var].append(float(varFields[13]))
self.df = pd.DataFrame.from_dict(varData, orient='columns')
return self.df
[docs] def bar_plot(self, **kwargs):
"""Creates a bar plot of water balance components per year. This adds to the regular plotting options with pandas dataframes.
"""
xlabel = kwargs.get('xlabel', "m3")
ylabel = kwargs.get('ylabel', None)
figsize = kwargs.get('figsize', (20,10))
fontsize = kwargs.get('fontsize', 13)
ax = self.df.plot.bar(x='year', figsize=figsize)
ax.set_ylabel(xlabel, fontsize=fontsize)
ax.set_xlabel(ylabel, fontsize=fontsize)
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.07),
fancybox=True, shadow=True, ncol=len(self.df.columns), fontsize=fontsize)