Exemplo n.º 1
0
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] 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
Exemplo n.º 3
0
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