summaryrefslogtreecommitdiff
path: root/calculs_extrapole.py
diff options
context:
space:
mode:
Diffstat (limited to 'calculs_extrapole.py')
-rw-r--r--calculs_extrapole.py189
1 files changed, 145 insertions, 44 deletions
diff --git a/calculs_extrapole.py b/calculs_extrapole.py
index ab22502..509402b 100644
--- a/calculs_extrapole.py
+++ b/calculs_extrapole.py
@@ -10,8 +10,95 @@ from gestion_erreurs import warning, debug
10from configuration import CONFIG 10from configuration import CONFIG
11from gestion_donnees import convertit_age_vers_texte 11from gestion_donnees import convertit_age_vers_texte
12import gestion_unites as u 12import gestion_unites as u
13from math import ceil
13 14
14#### Les fonctions qui permettent de faire les calculs additionnels une fois qu'on a l'extrapolation 15#### Les fonctions qui permettent de faire les calculs additionnels une fois qu'on a l'extrapolation (ou pas)
16
17def interpole_lineaire(dates, donnees, t, liste_err):
18 """ simple interpolation linéaire.
19 dates et donnees sont les dates et données de l'enfant.
20 t est le temps (jours) auquel on veut l'interpolation. On renvoie la donnée interpolée.
21 On interpole linéairement entre les deux données. Si ça
22 n'est pas possible parce que t n'est pas dans les bornes, on renvoie -1
23 """
24
25 if t<dates[0] or t>dates[-1]:
26 return -1 # en dehors des bornes
27
28 i=0 # on cherche l'intervalle : entre dates[i] et dates[i+1] on a la donnée t
29 while i<len(dates)-1 and dates[i+1]<t:
30 i+=1
31
32 m = (donnees[i+1] - donnees[i])/(dates[i+1] - dates[i]) # pente de la courbe
33 valeur = m * (t - dates[i]) + donnees[i]
34 return valeur
35
36
37def interpole_lineaire_ordonnee(dates, donnees, val, liste_err):
38 """ interpolation linéaire des données.
39 dates et donnees sont les dates et données de l'enfant.
40 val est la valeur pour laquelle on veut trouver le temps.
41 On interpole linéairement entre les deux données. Si ça
42 n'est pas possible parce que t n'est pas dans les bornes, on renvoie -1
43
44 Comportement potentiellement foireux si jamais les données ne sont pas
45 croissantes (poids qui chute, etc)..."""
46
47 if val>max(donnees) or val<min(donnees):
48 return -1 # en dehors des maxi et mini
49
50 i = 0 # On cherche dans quel intervalles de données on se situe (donnnes[i]
51 # et donnees [i+1])
52 while i<len(donnees)-1 and donnees[i+1]<val:
53 i+=1
54
55 m = (dates[i+1] - dates[i])/(donnees[i+1] - donnees[i])
56 temps = m * (val - donnees[i]) + dates[i]
57
58 return ceil(temps)
59
60
61######################################
62
63
64
65
66
67def calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, age_voulu, liste_err):
68 """ prend en argument les données extrapolées, l'âge voulu en jours.
69 Renvoie la donnée, ou -1 si ça n'a pas marché"""
70 age_voulu = int(age_voulu) # pour avoir les choses bien
71 debug("On veut la donnée à l'âge "+str(age_voulu), liste_err)
72 try:
73 i_date_voulue = dates_extrapole.index(age_voulu)
74 donnee_voulue = donnees_extrapole[i_date_voulue]
75
76 return donnee_voulue
77 #return formate_resultat_donnee(age_voulu, donnee_voulue, typedonnee, "", liste_err)
78 except:
79 warning("Impossible de calculer la donnée à l'âge "+age_voulu, liste_err)
80 return -1
81
82
83
84def calcule_age_extrapole(dates_extrapole, donnees_extrapole, donnee_voulue, liste_err):
85 """ prend en argument les données extrapolées, la donnée voulue (dans l'unité adaptée)
86 Renvoie la donnée, ou -1 si ça n'a pas marché"""
87
88 debug("On veut savoir à quel âge on a "+str(donnee_voulue), liste_err)
89 try:
90 i=0
91 while i<len(donnees_extrapole) and donnees_extrapole[i]<donnee_voulue:
92 i+=1
93
94 return dates_extrapole[i]
95 #return formate_resultat_age(dates_extrapole[i], donnee_voulue, typedonnee, "", liste_err)
96 except:
97 warning("Impossible de calculer l'âge pour la donnée "+str(donnee_voulue), liste_err)
98 return -1
99
100######################################
101### Formatage du résultat "joli"
15 102
16def met_s(chaine): 103def met_s(chaine):
17 """ renvoie un s si pluriel, rien sinon""" 104 """ renvoie un s si pluriel, rien sinon"""
@@ -27,7 +114,7 @@ def joliechaine_age(age):
27 nombre = "" 114 nombre = ""
28 for char in age: 115 for char in age:
29 if char=="a": 116 if char=="a":
30 retour+=nombre+" année"+met_s(nombre)+", " 117 retour+=nombre+" an"+met_s(nombre)+", "
31 nombre="" 118 nombre=""
32 elif char=="m": 119 elif char=="m":
33 retour+=nombre+" mois, " 120 retour+=nombre+" mois, "
@@ -42,48 +129,62 @@ def joliechaine_age(age):
42 nombre+=char 129 nombre+=char
43 #print(retour) 130 #print(retour)
44 return retour[:-2] 131 return retour[:-2]
45
46 132
133def formate_resultat_donnee(age, donnee, typedonnee, extra, liste_err):
134 """ Formate le tout en une zolie phrase
135 age et donnee sont les données,
136 typedonnee est le type de donnée (poids, etc)
137 extra est un truc additionnel à mettre entre parenthèses"""
47 138
48def calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, age_voulu, typedonnee, liste_err): 139 donnee_arrondie = u.arrondit_donnee(donnee, typedonnee)
49 """ prend en argument les données extrapolées, l'âge voulu en jours, 140 chaine = "À "+joliechaine_age(convertit_age_vers_texte(age))
50 et le type de données qu'on veut afficher, et renvoie une jolie phrase 141
51 à afficher""" 142 if typedonnee == "poids":
52 age_voulu = int(age_voulu) # pour avoir les choses bien 143 chaine+= ", l'enfant pèsera "+str(donnee_arrondie)+" kg"
53 debug("On veut la donnée à l'âge "+str(age_voulu), liste_err) 144 elif typedonnee == "taille":
54 try: 145 chaine+= ", l'enfant mesurera "+str(donnee_arrondie)+" cm"
55 i_date_voulue = dates_extrapole.index(age_voulu) 146 else: # phrase générique
56 donnee_voulue = donnees_extrapole[i_date_voulue] 147 chaine+= ", la donnée sera : "+str(donnee_arrondie)+" "+CONFIG["unites_typedonnees"][typedonnee]
57 donnee_arrondie = u.arrondit_donnee(donnee_voulue, typedonnee) 148
58 chaine = "À "+joliechaine_age(convertit_age_vers_texte(age_voulu)) 149 if extra!="":
59 150 ajout=" ("+extra+")"
60 if typedonnee == "poids": 151 else:
61 return chaine+", l'enfant pèsera "+str(donnee_arrondie)+" kg." 152 ajout=""
62 elif typedonnee == "taille": 153
63 return chaine+", l'enfant mesurera "+str(donnee_arrondie)+" cm." 154 chaine+=ajout+"."
64 else: # phrase générique 155 return chaine
65 return chaine+", la donnée sera : "+str(donnee_arrondie)+" "+CONFIG["unites_typedonnees"][typedonnee]+"." 156
66 except: 157def formate_resultat_age(age, donnee, typedonnee, extra, liste_err):
67 warning("Impossible de calculer la donnée à l'âge "+age_voulu, liste_err) 158 """ formate les données en une zolie phrase
68 return "" 159 age et donnee sont les données
69 160 typedonnee est le type de donnée (poids, etc)
70def calcule_age_extrapole(dates_extrapole, donnees_extrapole, donnee_voulue, typedonnee, liste_err): 161 extra est un truc additionnel à mettre entre parenthèses"""
71 """ prend en argument les données extrapolées, la donnée voulue (dans l'unité adaptée) 162 age_joli = joliechaine_age(convertit_age_vers_texte(age))
72 et son type, et renvoie la jolie phrase à afficher""" 163 if typedonnee=="poids":
164 chaine= "L'enfant atteindra un poids de "+str(donnee)+" kg à l'âge de "+age_joli
165 elif typedonnee=="taille":
166 chaine= "L'enfant atteindra la taille "+str(donnee)+ "cm à l'âge de "+age_joli
167 else:# phrase générique
168 chaine= "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee)+" à l'âge de "+age_joli
73 169
74 debug("On veut savoir à quel âge on a "+str(donnee_voulue), liste_err) 170 if extra!="":
75 try: 171 ajout=" ("+extra+")"
76 i=0 172 else:
77 while i<len(donnees_extrapole) and donnees_extrapole[i]<donnee_voulue: 173 ajout=""
78 i+=1 174
79 175 chaine+=ajout+"."
80 age_joli = joliechaine_age(convertit_age_vers_texte(dates_extrapole[i])) 176 return chaine
81 if typedonnee=="poids": 177
82 return "L'enfant atteindra un poids de "+str(donnee_voulue)+" kg à l'âge de "+age_joli+"." 178def formate_extrapole(nb_extra):
83 elif typedonnee=="taille": 179 """ Renvoie une chaîne qui dit sur cb on a extrapolé"""
84 return "L'enfant atteindra la taille "+str(donnee_voulue)+ "cm à l'âge de "+age_joli+"." 180 message="extrapolation sur "
85 else:# phrase générique 181 if nb_extra== 0:
86 return "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee_voulue)+" à l'âge de "+age_joli+"." 182 message+="l'ensemble des données"
87 except: 183 elif nb_extra==1:
88 warning("Impossible de calculer l'âge pour la donnée "+str(donnee_voulue), liste_err) 184 message+="la donnée la plus récente"
89 return "" 185 else:
186 message+="les "+str(nb_extra)+" dernières données"
187 return message
188
189def formate_interpole():
190 return "interpolation sur les données existantes" \ No newline at end of file