|
|
|
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), i)
|
|
|
|
sorted(dist, key=lambda t: t[0])
|
|
|
|
return dist[:k+1]
|