Below is shown some panda commands for retrieving maximum, minimum and average monthly precipitation from daily precipitation data.
The daily precipitation is assumed to be in a pandas DataFrame, with its index in Datetime index format.
1 - Daily to monthly precipitation
df_m=df1.resample('M').sum()
2 - Maximum monthly precipitation
p_max=df_m.groupby(df_m.index.month).max()
3 - Minimum monthly precipitation
p_min=df_m.groupby(df_m.index.month).min()
4 - Average monthly precipitation
p_avg=df_m.groupby(df_m.index.month).mean()
Python programming, with examples in hydraulic engineering and in hydrology.
Showing posts with label precipitation. Show all posts
Showing posts with label precipitation. Show all posts
Tuesday, August 21, 2018
Tuesday, July 10, 2018
Fitting IDF curves with Scipy and Pandas
# -*- coding: utf-8 -*- """ Created on Tue Jul 10 11:19:37 2018 @author: rodrigo.goncalves """ import pandas as pd from scipy.optimize import minimize # This is the IDF function, returning the sum of squared errors (SSE) def func2(par, res): p1 = (par[0] * res.index.values **par[1]) p2 = ((res.columns.values.astype(float)+par[2])**par[3]) f = pd.DataFrame([p/p2 for p in p1],index=res.index,columns=res.columns) erroTotQ=((f-res)**2).sum(axis=1).sum() return erroTotQ # copy your rainfall intensities table from excel # with column headers with rainfall durations # and row names with Return period value in years dfInt=pd.read_clipboard() #initial guess param1 = [5000, 0.1, 10, 0.9] res2 = minimize(func2, param1, args=(dfInt,), method='Nelder-Mead') print(res2) cs=['K=','a=','b=','c='] dfResult=pd.DataFrame(res2.x,index=cs).transpose() print(dfResult) dfResult.to_clipboard(index=None)
Labels:
fitting idf curves,
idf,
minimize,
pandas,
precipitation,
rain,
rainfall,
scipy
Friday, April 13, 2018
IDF table from equation - Pandas
How to fill a table (pandas DataFrame) with rainfall intensity values, extracted from idf equation:
import pandas as pd
durs = [5,10,15,20,30,60,120,180,360,540,720,1440] # rainfall durations
rps=[5,10,25,50,100] # return periods
t1 = pd.DataFrame(index=rps,columns=durs) # initialize DataFrame with rp's and durations
cf = [942.76,.1242,17.0,.650] #example idf equation coefficients
table = t1.apply(lambda x: (cf[0]*x.index**cf[1])/((x.name+cf[2])**cf[3]))
Thursday, February 8, 2018
Daily precipitation data to monthly and yearly
With pandas, we can group datetime values according to datetime units, as months and years.
If we have a pandas dataframe with 2 columns - DATE and VALUE
Certify that the column DATE is recognized as datetime64 format - you can use, for example:
df1['DATE'] = pd.to_datetime(df1['DATE'])
and then you can group and make operations on this group.
Getting the average of total monthly precipitation:
monthly = df1.groupby(df1['DATE'].dt.month).sum() / len(pd.unique(df1['DATE'].dt.year))
(groups by month sum and then divide by the number of years)
Getting the average yearly precipitation:
PAnual = df1.groupby(df1[0].dt.year).sum().mean()
If we have a pandas dataframe with 2 columns - DATE and VALUE
Certify that the column DATE is recognized as datetime64 format - you can use, for example:
df1['DATE'] = pd.to_datetime(df1['DATE'])
and then you can group and make operations on this group.
Getting the average of total monthly precipitation:
monthly = df1.groupby(df1['DATE'].dt.month).sum() / len(pd.unique(df1['DATE'].dt.year))
(groups by month sum and then divide by the number of years)
Getting the average yearly precipitation:
PAnual = df1.groupby(df1[0].dt.year).sum().mean()
Friday, January 26, 2018
Accumulating Precipitation Data
If we have a pandas dataframe named df1 with a column '15min' containing 15 minute precipitation data, we can easily accumulate for other durations, using the rolling method as shown in the example below:
Note that the window=4 parameter means that it will accumulate 4 lines of 15 minute data, resulting in 1 hour precipitation. This parameter can be changed to whatever duration you want.
df1['01 h'] =df1['15min'].rolling(window=4,center=False).sum()
Note that the window=4 parameter means that it will accumulate 4 lines of 15 minute data, resulting in 1 hour precipitation. This parameter can be changed to whatever duration you want.
Wednesday, November 22, 2017
Matplotlib template for Precipitation and Flow over time - Hidrograms and Hyetographs
This code works in python3, to plot a hyetograph - precipitation event (sP), together with a hydrograph (sQ), both in the same time series (t).
#-*-coding:utf-8-*-; import matplotlib.pyplot as plt from matplotlib import gridspec import numpy as np def plotHH(t,sP,sQ): fig = plt.figure() gs = gridspec.GridSpec(2, 1, height_ratios=[1, 2]) # HYDROGRAM CHART ax = plt.subplot(gs[1]) ax.plot(t,sQ) ax.set_ylabel(u'Q(m³/s)', color='b') ax.set_xlabel('Time (min.)') ax.tick_params(axis='y', colors='b') ax.xaxis.grid(b=True, which='major', color='.7', linestyle='-') ax.yaxis.grid(b=True, which='major', color='.7', linestyle='-') ax.set_xlim(min(t), max(t)) ax.set_ylim(0, max(sQ)*1.2) # PRECIPITATION/HYETOGRAPH CHART ax2 = plt.subplot(gs[0]) ax2.bar(t, sP, 1, color='#b0c4de') ax2.xaxis.grid(b=True, which='major', color='.7', linestyle='-') ax2.yaxis.grid(b=True, which='major', color='0.7', linestyle='-') ax2.set_ylabel('P(mm)') ax2.set_xlim(min(t), max(t)) plt.setp(ax2.get_xticklabels(), visible=False) plt.tight_layout() ax2.invert_yaxis() plt.gcf().subplots_adjust(bottom=0.15) plt.show() #plt.savefig(filename,format='pdf') plt.close(fig)
Labels:
bar,
Chart,
flow,
hydrograph,
hyetograph,
Line,
matplotlib,
plt,
precipitation,
python3
Thursday, July 27, 2017
Alternating Block Hyetograph Method with Python
To generate hypothetic storm events, we can use some methods as Alternating block method, Chicago method, Balanced method, SCS Storms among others.
In this post I show a way to generate a hypothetic storm event using the Alternating block method.
This python code uses the numpy library. The altblocks functions uses as input the idf parameters as list, and total duration, delta time and return period as floats.
In this post I show a way to generate a hypothetic storm event using the Alternating block method.
This python code uses the numpy library. The altblocks functions uses as input the idf parameters as list, and total duration, delta time and return period as floats.
import numpy as np def altblocks(idf,dur,dt,RP): aDur = np.arange(dt,dur+dt,dt) # in minutes aInt = (idf[0]*RP**idf[1])/((aDur+idf[2])**idf[3]) # idf equation - in mm/h aDeltaPmm = np.diff(np.append(0,np.multiply(aInt,aDur/60.0))) aOrd=np.append(np.arange(1,len(aDur)+1,2)[::-1],np.arange(2,len(aDur)+1,2)) prec = np.asarray([aDeltaPmm[x-1] for x in aOrd]) aAltBl = np.vstack((aDur,prec)) return aAltBl
Subscribe to:
Posts (Atom)