diff options
Diffstat (limited to 'calculs_extrapole.py')
-rw-r--r-- | calculs_extrapole.py | 189 |
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 | |||
10 | from configuration import CONFIG | 10 | from configuration import CONFIG |
11 | from gestion_donnees import convertit_age_vers_texte | 11 | from gestion_donnees import convertit_age_vers_texte |
12 | import gestion_unites as u | 12 | import gestion_unites as u |
13 | from 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 | |||
17 | def 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 | |||
37 | def 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 | |||
67 | def 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 | |||
84 | def 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 | ||
16 | def met_s(chaine): | 103 | def 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 | ||
133 | def 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 | ||
48 | def 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: | 157 | def 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) | |
70 | def 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+"." | 178 | def 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 | |||
189 | def formate_interpole(): | ||
190 | return "interpolation sur les données existantes" \ No newline at end of file | ||