Mercurial Hosting > traffic-intelligence
comparison python/pavement.py @ 447:7ef40014236c
updated weather indicator calculations
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Tue, 04 Feb 2014 15:00:39 -0500 |
parents | a65a14c90834 |
children | 0b15fdeb903e |
comparison
equal
deleted
inserted
replaced
446:a65a14c90834 | 447:7ef40014236c |
---|---|
117 else: | 117 else: |
118 somme_eau, somme_neige, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs, neigeMTQ_sup_seuil = '','','','','','','','','','' | 118 somme_eau, somme_neige, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs, neigeMTQ_sup_seuil = '','','','','','','','','','' |
119 | 119 |
120 return (somme_eau, somme_neige, neigeMTQ_sup_seuil, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs) | 120 return (somme_eau, somme_neige, neigeMTQ_sup_seuil, somme_abrasif, somme_sel, somme_lc, somme_lrg, somme_lrd, premiere_neige, autres_abrasifs) |
121 | 121 |
122 def ecWeatherIndicators(data, startDate, endDate, snowThreshold): | 122 def ecWeatherIndicators(data, startDate, endDate, snowThreshold, minProportionMeasures = 0.): |
123 '''Computes the indicators from Environment Canada files | 123 '''Computes the indicators from Environment Canada files |
124 (loaded as a recarray using csv2rec in data), | 124 (loaded as a recarray using csv2rec in data), |
125 between start and end dates (datetime.datetime objects)''' | 125 between start and end dates (datetime.datetime objects) |
126 | |
127 minProportionMeasures is proportion of measures necessary to consider the indicators''' | |
128 from matplotlib.mlab import find | |
126 nbre_jours_T_negatif,nbre_jours_gel_degel,pluie_tot,neige_tot,ecart_type_T = 0,0,0,0,0 | 129 nbre_jours_T_negatif,nbre_jours_gel_degel,pluie_tot,neige_tot,ecart_type_T = 0,0,0,0,0 |
127 compteur,nbre_jours_gel_consecutifs=0,0 | 130 compteur,nbre_jours_gel_consecutifs=0,0 |
128 tmoys = [] | 131 tmoys = [] |
129 seuils_T = [20,15,10,5] | 132 seuils_T = [20,15,10,5] |
130 deltas_T = [0,0,0,0] | 133 deltas_T = [0,0,0,0] |
131 for i in range(int((endDate - startDate).days)+1): | 134 startIndex = find(data['date'] == startDate) |
135 nDays = (endDate - startDate).days+1 | |
136 for i in range(startIndex, startIndex+int(nDays)): | |
132 if data['tmax'][i] != '' and data['tmax'][i] != None: | 137 if data['tmax'][i] != '' and data['tmax'][i] != None: |
133 tmax = float(data['tmax'][i].replace(',','.')) | 138 tmax = float(data['tmax'][i].replace(',','.')) |
134 else: | 139 else: |
135 tmax = None | 140 tmax = None |
136 if data['tmin'][i] != '' and data['tmin'][i] != None: | 141 if data['tmin'][i] != '' and data['tmin'][i] != None: |
157 nbre_jours_gel_consecutifs = compteur | 162 nbre_jours_gel_consecutifs = compteur |
158 compteur = 0 | 163 compteur = 0 |
159 else: | 164 else: |
160 compteur = 0 | 165 compteur = 0 |
161 nbre_jours_gel_consecutifs = max(nbre_jours_gel_consecutifs,compteur) | 166 nbre_jours_gel_consecutifs = max(nbre_jours_gel_consecutifs,compteur) |
162 ecart_type_T = np.std(tmoys) | 167 if float(len(tmoys))/nDays >= minProportionMeasures: |
163 if neige_tot < snowThreshold: | 168 ecart_type_T = np.std(tmoys) |
164 neigeEC_sup_seuil = 0 | 169 if neige_tot < snowThreshold: |
165 else: | 170 neigeEC_sup_seuil = 0 |
166 neigeEC_sup_seuil = 1 | 171 else: |
167 | 172 neigeEC_sup_seuil = 1 |
168 return (nbre_jours_T_negatif,nbre_jours_gel_degel, deltas_T, nbre_jours_gel_consecutifs, pluie_tot, neige_tot, neigeEC_sup_seuil, ecart_type_T) | 173 return (nbre_jours_T_negatif,nbre_jours_gel_degel, deltas_T, nbre_jours_gel_consecutifs, pluie_tot, neige_tot, neigeEC_sup_seuil, ecart_type_T) |
169 | 174 else: |
175 return [None]*2+[[None]*len(seuils_T)]+[None]*5 | |
170 | 176 |
171 class RTSS: | 177 class RTSS: |
172 'class for data related to a RTSS, including agregating pavement marking measurements' | 178 'class for data related to a RTSS, including agregating pavement marking measurements' |
173 | 179 |
174 def __init__(self, id): | 180 def __init__(self, id): |
189 | 195 |
190 def getSite(self): | 196 def getSite(self): |
191 return int(self.id[:2]) | 197 return int(self.id[:2]) |
192 | 198 |
193 def getTestAttributes(self): | 199 def getTestAttributes(self): |
194 return [self.paintingType, self.color] | 200 return [self.paintingType, self.color, self.paintingDate.year] |
195 | 201 |
196 def plot(self, measure, options = 'o', dayRatio = 1., **kwargs): | 202 def plot(self, measure, options = 'o', dayRatio = 1., **kwargs): |
197 from matplotlib.pyplot import plot | 203 from matplotlib.pyplot import plot |
198 plot(self.data['jours']/float(dayRatio), | 204 plot(self.data['jours']/float(dayRatio), |
199 self.data[measure], options, **kwargs) | 205 self.data[measure], options, **kwargs) |
200 | 206 |
201 def getMarkingMeasures(self, dataLabel): | 207 def getMarkingMeasures(self, dataLabel): |
202 from numpy import isnan | 208 nonZeroIndices = ~np.isnan(self.data[dataLabel]) |
203 nonZeroIndices = ~isnan(self.data[dataLabel]) | |
204 return self.data[nonZeroIndices]['jours'], self.data[nonZeroIndices][dataLabel] | 209 return self.data[nonZeroIndices]['jours'], self.data[nonZeroIndices][dataLabel] |
205 | 210 |
206 def plotMarkingMeasures(self, measure, options = 'o', dayRatio = 1., **kwargs): | 211 def plotMarkingMeasures(self, measure, options = 'o', dayRatio = 1., **kwargs): |
207 for i in range(1,7): | 212 for i in range(1,7): |
208 self.plot('{}_{}'.format(measure, i), options, dayRatio, **kwargs) | 213 self.plot('{}_{}'.format(measure, i), options, dayRatio, **kwargs) |
209 | 214 |
210 def computeMarkingMeasureVariations(self, dataLabel, lanePositions, weatherData, snowThreshold): | 215 def computeMarkingMeasureVariations(self, dataLabel, lanePositions, weatherData, snowThreshold, minProportionMeasures = 0.): |
211 '''Computes for each successive measurement | 216 '''Computes for each successive measurement |
212 lanePositions = None | 217 lanePositions = None |
213 measure variation, initial measure, time duration, weather indicators | 218 measure variation, initial measure, time duration, weather indicators |
214 | 219 |
215 TODO if measurements per lane, add a variable for lane position (position1 to 6) | 220 TODO if measurements per lane, add a variable for lane position (position1 to 6) |
216 lanePositions = list of integers (range(1,7)) | 221 lanePositions = list of integers (range(1,7)) |
217 measure variation, initial measure, time duration, lane position1, weather indicators | 222 measure variation, initial measure, time duration, lane position1, weather indicators |
218 measure variation, initial measure, time duration, lane position2, weather indicators | 223 measure variation, initial measure, time duration, lane position2, weather indicators |
219 ...''' | 224 ...''' |
220 from numpy import isnan | |
221 variationData = [] | 225 variationData = [] |
222 if lanePositions == None: | 226 if lanePositions == None: |
223 nonZeroIndices = ~isnan(self.data[dataLabel]) | 227 nonZeroIndices = ~np.isnan(self.data[dataLabel]) |
224 days = self.data[nonZeroIndices]['jours'] | 228 days = self.data[nonZeroIndices]['jours'] |
225 dates = self.data[nonZeroIndices]['date_mesure'] | 229 dates = self.data[nonZeroIndices]['date_mesure'] |
226 measures = self.data[nonZeroIndices][dataLabel] | 230 measures = self.data[nonZeroIndices][dataLabel] |
227 for i in range(1, len(dates)): | 231 for i in range(1, len(dates)): |
228 nDaysTNegative, nDaysThawFreeze, deltaTemp, nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp = ecWeatherIndicators(weatherData, dates[i-1], dates[i], snowThreshold) | 232 nDaysTNegative, nDaysThawFreeze, deltaTemp, nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp = ecWeatherIndicators(weatherData, dates[i-1], dates[i], snowThreshold, minProportionMeasures) |
229 variationData.append([measures[i-1]-measures[i], measures[i-1], days[i]-days[i-1], nDaysTNegative, nDaysThawFreeze] + deltaTemp + [nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp]) | 233 variationData.append([measures[i-1]-measures[i], measures[i-1], days[i]-days[i-1], days[i-1], nDaysTNegative, nDaysThawFreeze] + deltaTemp + [nConsecutiveFrozenDays, totalRain, totalSnow, snowAboveThreshold, stdevTemp]) |
230 return variationData | 234 return variationData |