]> git.immae.eu Git - perso/Denise/oms.git/blame - calculs_extrapole.py
Petite modif dans l'affichage de la version du fichier de sauvegarde
[perso/Denise/oms.git] / calculs_extrapole.py
CommitLineData
cf0d4c8c
DL
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Thu Feb 18 18:25:11 2021
5
6@author: sekhmet
7"""
8
9from gestion_erreurs import warning, debug
10from configuration import CONFIG
11from gestion_donnees import convertit_age_vers_texte
12import gestion_unites as u
3d7da80a 13from math import ceil
cf0d4c8c 14
3d7da80a
DL
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"
cf0d4c8c
DL
102
103def met_s(chaine):
104 """ renvoie un s si pluriel, rien sinon"""
105 if int(chaine)>1:
106 return "s"
107 else:
108 return ""
109
110def joliechaine_age(age):
111 """ prend en argument une chaîne du type 6a3m2j et renvoie une chaîne un peu
112 plus jolie à lire genre 6 ans, 3mois, 2 jours"""
113 retour = ""
114 nombre = ""
115 for char in age:
116 if char=="a":
3d7da80a 117 retour+=nombre+" an"+met_s(nombre)+", "
cf0d4c8c
DL
118 nombre=""
119 elif char=="m":
120 retour+=nombre+" mois, "
121 nombre=""
122 elif char=="s":
123 retour+=nombre+" semaine"+met_s(nombre)+", "
124 nombre=""
125 elif char=="j":
126 retour+=nombre+" jour"+met_s(nombre)+", "
127 nombre=""
128 else:
129 nombre+=char
130 #print(retour)
131 return retour[:-2]
cf0d4c8c 132
32b3d061 133def formate_resultat_donnee(age, date, donnee, typedonnee, extra, liste_err):
3d7da80a 134 """ Formate le tout en une zolie phrase
32b3d061 135 age date et donnee sont les données. date peut être None (sinon donnée de date)
3d7da80a
DL
136 typedonnee est le type de donnée (poids, etc)
137 extra est un truc additionnel à mettre entre parenthèses"""
cf0d4c8c 138
3d7da80a
DL
139 donnee_arrondie = u.arrondit_donnee(donnee, typedonnee)
140 chaine = "À "+joliechaine_age(convertit_age_vers_texte(age))
141
32b3d061
D
142 if date != None:
143 chaine += ", le "+date.strftime("%d/%m/%Y")
144
3d7da80a
DL
145 if typedonnee == "poids":
146 chaine+= ", l'enfant pèsera "+str(donnee_arrondie)+" kg"
147 elif typedonnee == "taille":
148 chaine+= ", l'enfant mesurera "+str(donnee_arrondie)+" cm"
149 else: # phrase générique
150 chaine+= ", la donnée sera : "+str(donnee_arrondie)+" "+CONFIG["unites_typedonnees"][typedonnee]
151
152 if extra!="":
153 ajout=" ("+extra+")"
154 else:
155 ajout=""
156
157 chaine+=ajout+"."
158 return chaine
159
32b3d061 160def formate_resultat_age(age, date, donnee, typedonnee, extra, liste_err):
3d7da80a 161 """ formate les données en une zolie phrase
32b3d061 162 age, date et donnee sont les données. date est une donnée de date qui peut être vide.
3d7da80a
DL
163 typedonnee est le type de donnée (poids, etc)
164 extra est un truc additionnel à mettre entre parenthèses"""
165 age_joli = joliechaine_age(convertit_age_vers_texte(age))
166 if typedonnee=="poids":
167 chaine= "L'enfant atteindra un poids de "+str(donnee)+" kg à l'âge de "+age_joli
168 elif typedonnee=="taille":
169 chaine= "L'enfant atteindra la taille "+str(donnee)+ "cm à l'âge de "+age_joli
170 else:# phrase générique
171 chaine= "L'enfant atteindra la donnée "+typedonnee+" "+str(donnee)+" à l'âge de "+age_joli
cf0d4c8c 172
32b3d061
D
173 if date != None:
174 chaine += ", le "+date.strftime("%d/%m/%Y")
175
3d7da80a
DL
176 if extra!="":
177 ajout=" ("+extra+")"
178 else:
179 ajout=""
180
181 chaine+=ajout+"."
182 return chaine
183
184def formate_extrapole(nb_extra):
185 """ Renvoie une chaîne qui dit sur cb on a extrapolé"""
438ef56d 186 message="extrapolation à partir "
3d7da80a 187 if nb_extra== 0:
438ef56d 188 message+="de l'ensemble des données"
3d7da80a 189 elif nb_extra==1:
438ef56d 190 message+="de la donnée la plus récente"
3d7da80a 191 else:
438ef56d 192 message+="des "+str(nb_extra)+" dernières données"
3d7da80a
DL
193 return message
194
195def formate_interpole():
438ef56d 196 return "interpolation à partir des données existantes"