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(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 kPlusProches(point_a_verifier, tableau, k): """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). Renvoie un tableau trié avec les k plus proches points de `point_a_verifier`, au format (distance, indice du tableau original)""" dist = [] 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]