Mercurial > hg > nsaunier > traffic-intelligence
comparison python/indicators.py @ 998:933670761a57
updated code to python 3 (tests pass and scripts run, but non-executed parts of code are probably still not correct)
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Sun, 27 May 2018 23:22:48 -0400 |
| parents | c6d4ea05a2d0 |
| children |
comparison
equal
deleted
inserted
replaced
| 997:4f3387a242a1 | 998:933670761a57 |
|---|---|
| 4 import moving | 4 import moving |
| 5 #import matplotlib.nxutils as nx | 5 #import matplotlib.nxutils as nx |
| 6 from matplotlib.pyplot import plot, ylim | 6 from matplotlib.pyplot import plot, ylim |
| 7 from matplotlib.pylab import find | 7 from matplotlib.pylab import find |
| 8 from numpy import array, arange, mean, floor, mean | 8 from numpy import array, arange, mean, floor, mean |
| 9 | 9 from scipy import percentile |
| 10 | 10 |
| 11 def multivariateName(indicatorNames): | 11 def multivariateName(indicatorNames): |
| 12 return '_'.join(indicatorNames) | 12 return '_'.join(indicatorNames) |
| 13 | 13 |
| 14 # need for a class representing the indicators, their units, how to print them in graphs... | 14 # need for a class representing the indicators, their units, how to print them in graphs... |
| 33 self.timeInterval = moving.TimeInterval() | 33 self.timeInterval = moving.TimeInterval() |
| 34 else: | 34 else: |
| 35 assert len(values) == timeInterval.length() | 35 assert len(values) == timeInterval.length() |
| 36 self.timeInterval = timeInterval | 36 self.timeInterval = timeInterval |
| 37 self.values = {} | 37 self.values = {} |
| 38 for i in xrange(int(round(self.timeInterval.length()))): | 38 for i in range(int(round(self.timeInterval.length()))): |
| 39 self.values[self.timeInterval[i]] = values[i] | 39 self.values[self.timeInterval[i]] = values[i] |
| 40 self.maxValue = maxValue | 40 self.maxValue = maxValue |
| 41 | 41 |
| 42 def __len__(self): | 42 def __len__(self): |
| 43 return len(self.values) | 43 return len(self.values) |
| 58 | 58 |
| 59 def __iter__(self): | 59 def __iter__(self): |
| 60 self.iterInstantNum = 0 # index in the interval or keys of the dict | 60 self.iterInstantNum = 0 # index in the interval or keys of the dict |
| 61 return self | 61 return self |
| 62 | 62 |
| 63 def next(self): | 63 def __next__(self): |
| 64 if self.iterInstantNum >= len(self.values):#(self.timeInterval and self.iterInstantNum>=self.timeInterval.length())\ | 64 if self.iterInstantNum >= len(self.values):#(self.timeInterval and self.iterInstantNum>=self.timeInterval.length())\ |
| 65 # or (self.iterInstantNum >= self.values) | 65 # or (self.iterInstantNum >= self.values) |
| 66 raise StopIteration | 66 raise StopIteration |
| 67 else: | 67 else: |
| 68 self.iterInstantNum += 1 | 68 self.iterInstantNum += 1 |
| 158 | 158 |
| 159 def __init__(self, name, values, timeInterval=None, mostSevereIsMax=True, maxValue = None): | 159 def __init__(self, name, values, timeInterval=None, mostSevereIsMax=True, maxValue = None): |
| 160 TemporalIndicator.__init__(self, name, values, timeInterval, maxValue) | 160 TemporalIndicator.__init__(self, name, values, timeInterval, maxValue) |
| 161 self.mostSevereIsMax = mostSevereIsMax | 161 self.mostSevereIsMax = mostSevereIsMax |
| 162 | 162 |
| 163 def getMostSevereValue(self, minNInstants=1): # TODO use np.percentile | 163 def getMostSevereValue(self, minNInstants=1, centile=15.): |
| 164 values = array(self.values.values()) | 164 '''if there are more than minNInstants observations, |
| 165 indices = range(len(values)) | 165 returns either the average of these maximum values |
| 166 if len(indices) >= minNInstants: | 166 or if centile is not None the n% centile from the most severe value |
| 167 values = sorted(values[indices], reverse = self.mostSevereIsMax) # inverted if most severe is max -> take the first values | 167 |
| 168 return mean(values[:minNInstants]) | 168 eg for TTC, 15 returns the 15th centile (value such that 15% of observations are lower)''' |
| 169 else: | 169 if self.__len__() < minNInstants: |
| 170 return None | 170 return None |
| 171 else: | |
| 172 values = list(self.values.values()) | |
| 173 if centile is not None: | |
| 174 if self.mostSevereIsMax: | |
| 175 c = 100-centile | |
| 176 else: | |
| 177 c = centile | |
| 178 return percentile(values, c) | |
| 179 else: | |
| 180 values = sorted(values, reverse = self.mostSevereIsMax) # inverted if most severe is max -> take the first values | |
| 181 return mean(values[:minNInstants]) | |
| 171 | 182 |
| 172 def getInstantOfMostSevereValue(self): | 183 def getInstantOfMostSevereValue(self): |
| 173 '''Returns the instant at which the indicator reaches its most severe value''' | 184 '''Returns the instant at which the indicator reaches its most severe value''' |
| 174 if self.mostSevereIsMax: | 185 if self.mostSevereIsMax: |
| 175 return max(self.values, key=self.values.get) | 186 return max(self.values, key=self.values.get) |
| 187 | 198 |
| 188 ex: speeds and trajectory''' | 199 ex: speeds and trajectory''' |
| 189 | 200 |
| 190 assert len(indicatorValues) == trajectory.length() | 201 assert len(indicatorValues) == trajectory.length() |
| 191 indicatorMap = {} | 202 indicatorMap = {} |
| 192 for k in xrange(trajectory.length()): | 203 for k in range(trajectory.length()): |
| 193 p = trajectory[k] | 204 p = trajectory[k] |
| 194 i = floor(p.x/squareSize) | 205 i = floor(p.x/squareSize) |
| 195 j = floor(p.y/squareSize) | 206 j = floor(p.y/squareSize) |
| 196 if indicatorMap.has_key((i,j)): | 207 if (i,j) in indicatorMap: |
| 197 indicatorMap[(i,j)].append(indicatorValues[k]) | 208 indicatorMap[(i,j)].append(indicatorValues[k]) |
| 198 else: | 209 else: |
| 199 indicatorMap[(i,j)] = [indicatorValues[k]] | 210 indicatorMap[(i,j)] = [indicatorValues[k]] |
| 200 for k in indicatorMap.keys(): | 211 for k in indicatorMap: |
| 201 indicatorMap[k] = mean(indicatorMap[k]) | 212 indicatorMap[k] = mean(indicatorMap[k]) |
| 202 return indicatorMap | 213 return indicatorMap |
| 203 | 214 |
| 204 # def indicatorMapFromPolygon(value, polygon, squareSize): | 215 # def indicatorMapFromPolygon(value, polygon, squareSize): |
| 205 # '''Fills an indicator map with the value within the polygon | 216 # '''Fills an indicator map with the value within the polygon |
| 208 # for x in arange(min(polygon[:,0])+squareSize/2, max(polygon[:,0]), squareSize): | 219 # for x in arange(min(polygon[:,0])+squareSize/2, max(polygon[:,0]), squareSize): |
| 209 # for y in arange(min(polygon[:,1])+squareSize/2, max(polygon[:,1]), squareSize): | 220 # for y in arange(min(polygon[:,1])+squareSize/2, max(polygon[:,1]), squareSize): |
| 210 # points.append([x,y]) | 221 # points.append([x,y]) |
| 211 # inside = nx.points_inside_poly(array(points), polygon) | 222 # inside = nx.points_inside_poly(array(points), polygon) |
| 212 # indicatorMap = {} | 223 # indicatorMap = {} |
| 213 # for i in xrange(len(inside)): | 224 # for i in range(len(inside)): |
| 214 # if inside[i]: | 225 # if inside[i]: |
| 215 # indicatorMap[(floor(points[i][0]/squareSize), floor(points[i][1]/squareSize))] = 0 | 226 # indicatorMap[(floor(points[i][0]/squareSize), floor(points[i][1]/squareSize))] = 0 |
| 216 # return indicatorMap | 227 # return indicatorMap |
| 217 | 228 |
| 218 def indicatorMapFromAxis(value, limits, squareSize): | 229 def indicatorMapFromAxis(value, limits, squareSize): |
| 227 '''Puts many indicator maps together | 238 '''Puts many indicator maps together |
| 228 (averaging the values in each cell | 239 (averaging the values in each cell |
| 229 if more than one maps has a value)''' | 240 if more than one maps has a value)''' |
| 230 indicatorMap = {} | 241 indicatorMap = {} |
| 231 for m in maps: | 242 for m in maps: |
| 232 for k,v in m.iteritems(): | 243 for k,v in m.items(): |
| 233 if indicatorMap.has_key(k): | 244 if k in indicatorMap: |
| 234 indicatorMap[k].append(v) | 245 indicatorMap[k].append(v) |
| 235 else: | 246 else: |
| 236 indicatorMap[k] = [v] | 247 indicatorMap[k] = [v] |
| 237 for k in indicatorMap.keys(): | 248 for k in indicatorMap: |
| 238 indicatorMap[k] = combinationFunction(indicatorMap[k]) | 249 indicatorMap[k] = combinationFunction(indicatorMap[k]) |
| 239 return indicatorMap | 250 return indicatorMap |
| 240 | 251 |
| 241 if __name__ == "__main__": | 252 if __name__ == "__main__": |
| 242 import doctest | 253 import doctest |
