You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
2.0 KiB

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
6 months ago
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
6 months ago
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
6 months ago
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).
6 months ago
`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 = []
6 months ago
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]