from datetime import date def ecartDate(date1, date2): """Renvoie le nombre de jours écoulés entre date1 et date2 (modulo 365)""" delta_sec = (date.fromisoformat(date2)-date.fromisoformat(date1)).total_seconds() secParJour = 86400 return delta_sec / secParJour def distance_euclide(point1, point2): """Prend en paramètre 2 tuples au format (Date du jour, Température moyenne, température de référence) et qui renvoie un nombre réel représentant la distance euclidienne au carré entre ces deux points""" duree = ecartDate(point1[0], point2[0]) delta_T_moy = (point1[1]-point2[1])**2 delta_T_ref = (point1[2]-point2[2])**2 return duree**2/100 + delta_T_moy**2 + delta_T_ref**2 def distance_manhattan(point1, point2): """Prend en paramètre 2 tuples au format (Date du jour, Température moyenne, température de référence) et qui renvoie un nombre réel représentant la distance de Manhattan entre ces deux points""" duree = abs(ecartDate(point1[0], point2[0])) delta_T_moy = abs(point1[1]-point2[1]) delta_T_ref = abs(point1[2]-point2[2]) return duree/100 + delta_T_moy + delta_T_ref def kPlusProches(point_a_verifier, tableau, k, isEuclideanDistance): """Prend en paramètres un tuple au format (Date du jour, Température moyenne, température de référence) et un tableau au format (Numéro du jour, Température moyenne, Température de référence). `isEuclidDistance` : true -> euclide ; false -> manhattan Renvoie un tableau trié avec les k plus proches points de `point_a_verifier`, au format (distance, indice du tableau original)""" dist = [] if isEuclideanDistance: distance = distance_euclide else: distance = distance_manhattan for i, point in enumerate(tableau): dist.append((distance(point_a_verifier, point[0]), i)) dist = sorted(dist, key=lambda t: t[0]) return dist[:k]