# -*- 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)
Python programming, with examples in hydraulic engineering and in hydrology.
Showing posts with label idf. Show all posts
Showing posts with label idf. Show all posts
Tuesday, July 10, 2018
Fitting IDF curves with Scipy and Pandas
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, 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
Wednesday, June 7, 2017
Python and Pandas - How to plot Multiple Curves with 5 Lines of Code
In this post I will show how to use pandas to do a minimalist but pretty line chart, with as many curves we want.
In this case I will use a I-D-F precipitation table, with lines corresponding to Return Periods (years) and columns corresponding to durations, in minutes. as shown below:
For the code to work properly, the table must have headers in the columns and lines, and the first cell have to be blank. Select the table you want in your SpreadSheet Editor, and copy it to clipboard.
Then, run the following code:
And Voila!:
In this case I will use a I-D-F precipitation table, with lines corresponding to Return Periods (years) and columns corresponding to durations, in minutes. as shown below:
Then, run the following code:
import pandas as pd table = pd.read_clipboard() tabTr = table.transpose().convert_objects(convert_numeric=True) eixox = tabTr.index.values.astype(float) tabTr.set_index(eixox).plot(grid=True)
And Voila!:
Subscribe to:
Posts (Atom)