def vitesse(c, d, params): """ Calcule la vitesse d'un déplacement. @param c tuple ("file", "collect_date", "name", "lat", "lng", +1 ou -1) @param d tuple ("file", "collect_date", "name", "lat", "lng", +1 ou -1) @param params ParemetreCoutTrajet @return vitesse, cout La fonction retourne une valeur aberrante si le temps entre les deux événements est négatifs. C'est une configuration impossible : on ne peut reposer un vélo avant de l'avoir retiré. La valeur aberrante est ``1e8``. Il reste un cas pour lequel, je ne sais pas encore quelle valeur donner : il s'agit des demi-appariements : un vélo rétiré mais jamais reposé et réciproquement. """ if c[0] is None or d[0] is None: # cas des vélos perdus if c[0] is None: if d[0] is None: return None else: return 0.0, 0.0 # je ne sais pas trop quoi mettre else: return 0.0, 0.0 # je ne sais pas trop quoi mettre else: lat1, lng1 = c[3], c[4] lat2, lng2 = d[3], d[4] dh = DataVelibCollect.distance_haversine(lat1, lng1, lat2, lng2) dt = d[1] - c[1] if dt.total_seconds() <= 0: return 1e8, 1e8 # infini v = dh / (dt.total_seconds() / 3600) cost = params.cost(dh, dt, v) return v, cost
def vitesse(c, d, params): """ Calcule la vitesse d'un déplacement. @param c tuple ("file", "collect_date", "name", "lat", "lng", +1 ou -1) @param d tuple ("file", "collect_date", "name", "lat", "lng", +1 ou -1) @param params ParemetreCoutTrajet @return vitesse, cout La fonction retourne une valeur aberrante si le temps entre les deux événements est négatifs. C'est une configuration impossible : on ne peut reposer un vélo avant de l'avoir retiré. La valeur aberrante est ``1e8``. Il reste un cas pour lequel, je ne sais pas encore quelle valeur donner : il s'agit des demi-appariements : un vélo rétiré mais jamais reposé et réciproquement. """ if c[0] == None or d[0] == None: # cas des vélos perdus if c[0] == None: if d[0] == None: return None else: return 0.0, 0.0 # je ne sais pas trop quoi mettre else: return 0.0, 0.0 # je ne sais pas trop quoi mettre else: lat1, lng1 = c[3], c[4] lat2, lng2 = d[3], d[4] dh = DataVelibCollect.distance_haversine(lat1, lng1, lat2, lng2) dt = d[1] - c[1] if dt.total_seconds() <= 0: return 1e8, 1e8 #infini v = dh / (dt.total_seconds() / 3600) cost = params.cost(dh, dt, v) return v, cost
def distance_path(dfp): """ calcule la vitesse moyenne lorsque le chemin est connu @param dfp liste des chemins @return moyenne, stddev """ dfp = dfp.copy() dfp ["speed"] = dfp["dist"] / dfp["hours"] dfp ["dist"] = dfp.apply( lambda r: DataVelibCollect.distance_haversine( r["lat0"],r["lng0"],r["lat1"],r["lng1"]), axis=1) mean = sum( dfp["speed"]) / len(dfp) std = sum ( (x-mean)**2 for x in dfp["speed"]) / len(dfp) return mean, std**0.5
def distance_path(dfp): """ calcule la vitesse moyenne lorsque le chemin est connu @param dfp liste des chemins @return moyenne, stddev """ dfp = dfp.copy() dfp["speed"] = dfp["dist"] / dfp["hours"] dfp["dist"] = dfp.apply(lambda r: DataVelibCollect.distance_haversine( r["lat0"], r["lng0"], r["lat1"], r["lng1"]), axis=1) mean = sum(dfp["speed"]) / len(dfp) std = sum((x - mean)**2 for x in dfp["speed"]) / len(dfp) return mean, std**0.5