-
Notifications
You must be signed in to change notification settings - Fork 0
/
temperatureComparisonFxns.py
84 lines (67 loc) · 2.52 KB
/
temperatureComparisonFxns.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import pandas as pd
import numpy as np
import glob
from objectiveFunctions import *
def extractType(fl): return fl.split('_')[-1].split('.')[0]
def extractRegion(fl): return fl.split('/')[-1].split('_')[0].split('r')[-1]
def computeDatetime(df): return '%i-%i-%i'%(df.year,df.month,df.day)
def loadDF(forcingSet=None,region=None,forcingType=None):
# collect data files
files = pd.DataFrame()
files['path'] = glob.glob('./data/forcing_sets/%s/*.cbh'%forcingSet)
files['type'] = files.path.map(extractType)
files['region'] = files.path.map(extractRegion)
fl = files.loc[(files.type==forcingType) & (files.region == region)].path.values[0]
skiprows = 3
na_values = 'NaN'
if forcingSet == 'Livneh':
skiprows = 0
na_values = [-999,'inf']
dat = pd.read_table(fl,skiprows=skiprows,delim_whitespace=True,header=None, names = None,
low_memory=True, na_values=na_values)
if forcingSet == 'Livneh':
del dat['0'] # remove the datetime column
# make column names
n = len(dat.columns)
header = ['year','month','day','hour','minute','second']
for i in range(1,n+1-len(header)):
header.append('HRU_ID_%s'%i)
dat.columns = header
dat['datetime'] = dat.apply(computeDatetime,axis=1)
dat.index = pd.DatetimeIndex(dat.datetime)
for var in ['year','month','day','hour','minute','second', 'datetime']: del dat[var]
return dat
def computeMetrics(df1,df2,label = None, save=False, region = None, forcingType = None):
r2res = []
MAEres = []
RMSEres = []
NSEres = []
pearsonsRres = []
ttestPvals = []
for hru in df1.columns:
x = df1[hru].values
y = df2[hru].values
r2res.append(r2(x,y))
MAEres.append(MAE(x,y))
RMSEres.append(RMSE(x,y))
NSEres.append(NSE(x,y))
pearsonsRres.append(pearsonR(x,y))
ttestPvals.append(pairedTtest(x,y))
results = pd.DataFrame()
results['HRU'] = np.arange(1,len(df1.columns)+1)
results['r2'] = r2res
results['MAE'] = MAEres
results['RMSE'] = RMSEres
results['NSE'] = NSEres
results['R'] = pearsonsRres
results['pVal'] = ttestPvals
if save: results.to_pickle('./data/forcing_sets/r%s_%s_%s.pcl'%(region,forcingType,label))
def findCommomDates(datasets = []):
starts = []
ends = []
for ds in datasets:
starts.append(ds.index.min())
ends.append(ds.index.max())
strt = np.max(starts)
nd = np.min(ends)
return strt,nd