comparison trafficintelligence/indicators.py @ 1042:b1ba6d44fcb9

corrected bug in severity indicators
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Wed, 04 Jul 2018 16:21:09 -0400
parents c6cf75a2ed08
children 956a66096e91
comparison
equal deleted inserted replaced
1041:fc7c0f38e8a6 1042:b1ba6d44fcb9
157 157
158 def __init__(self, name, values, timeInterval=None, mostSevereIsMax=True, maxValue = None): 158 def __init__(self, name, values, timeInterval=None, mostSevereIsMax=True, maxValue = None):
159 TemporalIndicator.__init__(self, name, values, timeInterval, maxValue) 159 TemporalIndicator.__init__(self, name, values, timeInterval, maxValue)
160 self.mostSevereIsMax = mostSevereIsMax 160 self.mostSevereIsMax = mostSevereIsMax
161 161
162 def getMostSevereValue(self, minNInstants=1, centile=15.): 162 def getMostSevereValue(self, minNInstants=None, centile=None):
163 '''if there are more than minNInstants observations, 163 '''if there are more than minNInstants observations,
164 returns either the average of these maximum values 164 returns either the average of these maximum values
165 or if centile is not None the n% centile from the most severe value 165 or if centile is not None the n% centile from the most severe value
166 166
167 eg for TTC, 15 returns the 15th centile (value such that 15% of observations are lower)''' 167 eg for TTC, centile = 15 returns the 15th centile (value such that 15% of observations are lower)'''
168 if self.__len__() < minNInstants: 168 values = list(self.values.values())
169 if centile is not None:
170 if self.mostSevereIsMax:
171 c = 100-centile
172 else:
173 c = centile
174 return percentile(values, c)
175 elif minNInstants is not None and minNInstants <= self.__len__():
176 values = sorted(values, reverse = self.mostSevereIsMax) # inverted if most severe is max -> take the first values
177 return mean(values[:minNInstants])
178 else:
169 return None 179 return None
170 else:
171 values = list(self.values.values())
172 if centile is not None:
173 if self.mostSevereIsMax:
174 c = 100-centile
175 else:
176 c = centile
177 return percentile(values, c)
178 else:
179 values = sorted(values, reverse = self.mostSevereIsMax) # inverted if most severe is max -> take the first values
180 return mean(values[:minNInstants])
181 180
182 def getInstantOfMostSevereValue(self): 181 def getInstantOfMostSevereValue(self):
183 '''Returns the instant at which the indicator reaches its most severe value''' 182 '''Returns the instant at which the indicator reaches its most severe value'''
184 if self.mostSevereIsMax: 183 if self.mostSevereIsMax:
185 return max(self.values, key=self.values.get) 184 return max(self.values, key=self.values.get)