@@ -63,17 +63,34 @@ def indicator_all(self, cutoff=-2500, show=False):
63
63
# print ('Percent corretly identified: {} %\n'.format(round(performance, 3)))
64
64
return (performance , count_correct , count_incorrect )
65
65
66
- def make_indicator (self , dtw_inc = 0.01 , hrs_beg = 4000 ):
67
- """ Make an indicator that captures over 90 % of CCAP wetlands """
66
+ def make_indicator (self , dtw_inc = 0.01 , hrs_per = 50 , seasonal = False ):
67
+ """
68
+ Make an indicator by iterating over depth to water and hours at that dtw
69
+ dtw_inc = dtw increment, use 0.01 for increased precision (expensive)
70
+ hrs_per = percent of total hours to begin minimum threshold
71
+ seasonal = search just summer?
72
+ """
73
+ start = time .time ()
68
74
### select wetland from all dtw information
69
75
mat_wet_dtw = self .mat_dtw [~ self .mask_wet ]
70
76
mat_nonwet_dtw = self .mat_dtw [self .mask_wet ]
71
77
mat_dry_dtw = mat_nonwet_dtw [~ np .isnan (mat_nonwet_dtw )].reshape (
72
78
- 1 , mat_nonwet_dtw .shape [1 ])
79
+ names = ['dtw_hrs_wet_dry.npy' , 'dtw_hrs_wet_dry.df' ]
80
+ ## truncate for just summer
81
+ if seasonal :
82
+ summer = pd .date_range ('2012-06-01-00' , '2012-09-01-00' , freq = 'h' )
83
+ df_wet_dtw1 = pd .DataFrame (mat_wet_dtw .T , index = self .ts_yr_hr )
84
+ df_wet_dtw = pd .DataFrame (mat_wet_dtw .T , index = self .ts_yr_hr ).loc [summer , :]
85
+
86
+ df_dry_dtw = pd .DataFrame (mat_dry_dtw .T , index = self .ts_yr_hr ).loc [summer , :]
87
+ mat_wet_dtw = df_wet_dtw .values .T
88
+ mat_dry_dtw = df_dry_dtw .values .T
89
+ names = ['dtw_hrs_wet_dry_summer.npy' , 'dtw_hrs_wet_dry_summer.df' ]
73
90
74
91
print ('Finding optimum criteria; will take a bit' )
75
92
dtw_tests = np .arange (0 , 1 , dtw_inc )
76
- hrs_tests = range (hrs_beg , self .mat_dtw .shape [1 ])
93
+ hrs_tests = range (int ( np . floor ( 1. / hrs_per ) * self . mat_dtw . shape [ 1 ]) , self .mat_dtw .shape [1 ])
77
94
mat_all = np .zeros ([len (dtw_tests ) * len (hrs_tests ), 7 ])
78
95
79
96
for i , dtw_test in enumerate (dtw_tests ):
@@ -87,36 +104,52 @@ def make_indicator(self, dtw_inc=0.01, hrs_beg=4000):
87
104
88
105
mat_good = mat_all [mat_all [:,2 ]> 0 ]
89
106
mat_good [:, 3 ] = mat_good [:,2 ]/ float (mat_wet_dtw .shape [0 ])
90
- mat_best = mat_good [mat_good [:,4 ] >= 0.90 ]
107
+ mat_best = mat_good [mat_good [:,3 ] >= 0.50 ]
91
108
mat_best [:, 5 ] = mat_best [:,4 ] / float (mat_dry_dtw .shape [0 ])
92
109
mat_best [:, 6 ] = mat_best [:,3 ] / (1 - (mat_best [:,5 ]))
93
110
colnames = ['dtw_thresh' , 'hrs_thresh' , 'n_wet' , 'perWet' , 'n_dry' , 'perDry' , 'perRatio' ]
94
111
df_all = pd .DataFrame (mat_best , columns = colnames ).sort_values (by = 'perRatio' , ascending = False )
95
112
96
113
answered = False
114
+ end = time .time ()
97
115
while not answered :
98
116
overwrite = raw_input ('Overwrite pickles? (y/n) ' )
99
117
if overwrite == 'y' :
100
- np .save (op .join (self .path_data , 'dtw_hrs_wet_dry.npy' ), mat_best )
101
- df_all .to_pickle (op .join (self .path_data , 'dtw_hrs_wet_dry.df' ))
118
+ np .save (op .join (self .path_data , names [ 0 ] ), mat_best )
119
+ df_all .to_pickle (op .join (self .path_data , names [ 1 ] ))
102
120
answered = True
103
121
elif overwrite == 'n' :
104
122
print ('Not overwriting pickles' )
105
123
answered = True
106
124
else :
107
125
print ('Choose y or n' )
108
126
109
- return mat_all , df_all
127
+ print ( 'Elapsed time: ~{} min' . format ( round (( end - start ) / 60. ), 4 ))
110
128
111
- def apply_indicator (self ):
129
+ def apply_indicator (self , seasonal = False ):
112
130
""" Analyze the indicator developed using make_indicator """
113
- mat_all = np .load (op .join (self .path_data , 'dtw_hrs_wet_dry.npy' ))
114
- df_all = pd .read_pickle (op .join (self .path_data , 'dtw_hrs_wet_dry.df' ))
115
-
131
+ if seasonal :
132
+ names = ['dtw_hrs_wet_dry_summer.npy' , 'dtw_hrs_wet_dry_summer.df' ]
133
+ perWet_thresh = 0.61
134
+ perDry_thresh = 0.35
135
+ else :
136
+ names = ['dtw_hrs_wet_dry.npy' , 'dtw_hrs_wet_dry.df' ]
137
+ perWet_thresh = 0.645
138
+ perDry_thresh = 0.35
139
+ mat_all = np .load (op .join (self .path_data , names [0 ]))
140
+ df_all = pd .read_pickle (op .join (self .path_data , names [1 ]))
141
+ # print (df_all.head(25))
116
142
## do some cropping
117
- df_new = df_all [df_all .hrs_thresh > 5000 ].sort_values (by = ['n_dry' , 'n_wet' ], ascending = [False , True ])
143
+ df_new = (df_all [((df_all .hrs_thresh > df_all .hrs_thresh .max ()/ 2. ) &
144
+ (df_all .perWet > perWet_thresh ) &
145
+ (df_all .perDry < perDry_thresh ))]
146
+ .sort_values (by = ['perDry' , 'perWet' ],
147
+ ascending = [True , False ]))
118
148
119
- BB .print_all (df_new .head (250 ))
149
+ ### can get about 1/2 the wetlands and 1/4 of the uplands
150
+ ### best for all is ~ 65% wetlands, 35% of drylands
151
+ ### best for summer is ~ 61% wetlands and 34.4% of drylands
152
+ BB .print_all (df_new )
120
153
121
154
def optimize (self , increment = 1 ):
122
155
""" Maximize the percent correctly identiified """
@@ -230,13 +263,9 @@ def dtw_wet_avg_ann(self):
230
263
return df_wets , df_drys
231
264
232
265
233
- start = time .time ()
234
266
PATH_res = op .join (op .expanduser ('~' ), 'Google_Drive' ,
235
267
'WNC' , 'Wetlands_Paper' , 'Results_Default' )
236
268
res = Wetlands (PATH_res )
237
269
# res.optimize(increment=10)
238
- # res.make_indicator(dtw_inc=0.01, hrs_beg=4000)
239
- res .apply_indicator ()
240
- end = time .time ()
241
-
242
- print ('Elapsed time: {} min' .format (round ((end - start )/ 60. ), 4 ))
270
+ # res.make_indicator(dtw_inc=0.01, hrs_per=50, seasonal=True)
271
+ res .apply_indicator (seasonal = True )
0 commit comments