diff options
Diffstat (limited to 'trace_courbe.py')
-rw-r--r-- | trace_courbe.py | 156 |
1 files changed, 112 insertions, 44 deletions
diff --git a/trace_courbe.py b/trace_courbe.py index c3e1691..e725607 100644 --- a/trace_courbe.py +++ b/trace_courbe.py | |||
@@ -3,21 +3,24 @@ | |||
3 | from configuration import CONFIG | 3 | from configuration import CONFIG |
4 | import gestionOMS as oms | 4 | import gestionOMS as oms |
5 | import gestion_unites as u | 5 | import gestion_unites as u |
6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python | 6 | from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python, convertit_age_vers_texte |
7 | from gestion_erreurs import debug, erreur, warning | 7 | from gestion_erreurs import debug, erreur, warning |
8 | from numpy import arange | 8 | from numpy import arange |
9 | from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole | ||
9 | 10 | ||
10 | import matplotlib.pyplot as plt | 11 | import matplotlib.pyplot as plt |
11 | 12 | ||
12 | # Essentiellement, la fonction qui trace la courbe | 13 | # Essentiellement, la fonction qui trace la courbe, mais on y trouve également les fonctions d'extrapolation. |
14 | # Ainsi que les calculs additionnels. | ||
13 | 15 | ||
14 | 16 | ||
15 | def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | 17 | def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err): |
16 | """ conf est le dictionnaire de config. l_jours et l_poids les listes des temps (en jours) et de données | 18 | """ conf est le dictionnaire de config. l_jours et l_poids les listes des temps (en jours) et de données |
17 | (donc pas forcément du poids) | 19 | (donc pas forcément du poids) |
18 | typedonnee est le type de données (voir CONFIG["liste_typedonnees"] | 20 | typedonnee est le type de données (voir CONFIG["liste_typedonnees"] |
19 | liste_err la liste des erreurs à compléter (voir gestion_erreurs)) | 21 | liste_err la liste des erreurs à compléter (voir gestion_erreurs)) |
20 | Renvoie la figure tracée""" | 22 | Renvoie la figure tracée, et les calculs additionnels sont mis sous forme de chaîne dans la liste |
23 | liste_extracalculs""" | ||
21 | debug("debut de cree_figure. Config : "+str(conf),liste_err) | 24 | debug("debut de cree_figure. Config : "+str(conf),liste_err) |
22 | try: | 25 | try: |
23 | liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err) | 26 | liste_data_labels_p,liste_data_labels_z = oms.renvoie_liste_labels(conf,CONFIG["liste_data_choisie_p"],CONFIG["liste_data_choisie_z"],liste_err) |
@@ -156,19 +159,64 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
156 | debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) | 159 | debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) |
157 | 160 | ||
158 | #### extrapolatios éventuelles | 161 | #### extrapolatios éventuelles |
159 | #print("prolongercourbes" in conf) | 162 | # a-t-on demndé des calculs ? |
160 | if conf["prolongercourbes"] == "oui": | 163 | jextrapole = conf["non_sauve"]["prolongercourbes"] == "oui" |
161 | #print("coucou") | 164 | # Est-ce qu'on a demandé un calcul sur cette donnée ? |
162 | # les dates, on prend tous les jours tant qu'à faire | 165 | print() |
163 | date_fin = int(l_jours[-1]) | 166 | for calextra in CONFIG["extradata"]: |
164 | dates_extrapole = list(range(date_fin, jour_maxi)) | 167 | jextrapole = jextrapole or conf["non_sauve"][calextra+"_type"] == typedonnee |
165 | donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) | 168 | |
166 | #print("données extrapolées !") | 169 | #print(jextrapole) |
167 | dates_extrapole = u.convertit_tableau(dates_extrapole,unite,liste_err) | 170 | if jextrapole: |
168 | 171 | try: | |
169 | # tracé des données extrapolées | 172 | debug("Il faut extrapoler les courbes !", liste_err) |
170 | plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) | 173 | # Prendre l'ensemble des dates "source" |
171 | debug("Tracé de la courbe extrapolée ok", liste_err) | 174 | # print(conf["non_sauve"]["nbdataextra"]) |
175 | if conf["non_sauve"]["nbextradata"] == 0: | ||
176 | sources_extrap = l_jours | ||
177 | sources_extrap_data = l_poids | ||
178 | else: | ||
179 | sources_extrap = l_jours[-conf["non_sauve"]["nbextradata"]:] # les derniers jours | ||
180 | sources_extrap_data = l_poids[-conf["non_sauve"]["nbextradata"]:] | ||
181 | |||
182 | debug("On extrapole sur les jours : "+str(sources_extrap), liste_err) | ||
183 | |||
184 | dates_extrapole, donnees_extrapole = prolongecourbe(t, sources_extrap, sources_extrap_data, conf["typecourbe"], liste_err) | ||
185 | debug("données extrapolées !", liste_err) | ||
186 | #debug(str(dates_extrapole[0:10])+str(donnees_extrapole[0:10]), liste_err) | ||
187 | |||
188 | # QUe veut-on maintenant sur ces données extrapolées ? | ||
189 | # Afficher la courbe | ||
190 | if conf["non_sauve"]["prolongercourbes"] == "oui": | ||
191 | # On va prendre les extrapolations de la dernière donnée jusqu'à l fin du graphe | ||
192 | debut_extr = int(l_jours[-conf["non_sauve"]["nbextradata"]]) | ||
193 | i_debut_extr = dates_extrapole.index(debut_extr) | ||
194 | i_fin_extr = dates_extrapole.index(jour_maxi) | ||
195 | # Voilà ce qu'on veut tracer | ||
196 | dates_extrapole_trace = dates_extrapole[i_debut_extr:i_fin_extr+1] | ||
197 | donnees_extrapole_trace = donnees_extrapole[i_debut_extr:i_fin_extr+1] | ||
198 | dates_extrapole_trace = u.convertit_tableau(dates_extrapole_trace,unite,liste_err) | ||
199 | |||
200 | # tracé des données extrapolées | ||
201 | plt.plot(dates_extrapole_trace, donnees_extrapole_trace,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) | ||
202 | debug("Tracé de la courbe extrapolée ok", liste_err) | ||
203 | |||
204 | # Calculer une donnée à l'âge x | ||
205 | if conf["non_sauve"]["calculextradata_type"] == typedonnee: | ||
206 | r = calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextradata_age"], typedonnee, liste_err) | ||
207 | if r!="": | ||
208 | liste_extracalculs.append(r) | ||
209 | print(liste_extracalculs) | ||
210 | |||
211 | # Calculer un âge où on atteint cette donnée | ||
212 | if conf["non_sauve"]["calculextratemps_type"] == typedonnee: | ||
213 | r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err) | ||
214 | if r!="": | ||
215 | liste_extracalculs.append(r) | ||
216 | print(liste_extracalculs) | ||
217 | |||
218 | except: | ||
219 | warning("Des problèmes pour extrapoler...", liste_err) | ||
172 | 220 | ||
173 | else: | 221 | else: |
174 | debug("On ne trace pas de courbe enfant", liste_err) | 222 | debug("On ne trace pas de courbe enfant", liste_err) |
@@ -239,14 +287,11 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
239 | 287 | ||
240 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) | 288 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) |
241 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) | 289 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) |
242 | #print("bla") | ||
243 | plt.title(titre,color=conf["couleurs"]["cadretxt"]) | 290 | plt.title(titre,color=conf["couleurs"]["cadretxt"]) |
244 | #print("ble") | ||
245 | if l_jours_conv == []: | 291 | if l_jours_conv == []: |
246 | plt.axis([0,age_maxi, poids_min, poids_max]) | 292 | plt.axis([0,age_maxi, poids_min, poids_max]) |
247 | else: | 293 | else: |
248 | plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) | 294 | plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) |
249 | #print("bli") | ||
250 | 295 | ||
251 | 296 | ||
252 | if conf['legende']=="oui": | 297 | if conf['legende']=="oui": |
@@ -264,43 +309,66 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
264 | 309 | ||
265 | ######################################## Pour extrapoler la courbe | 310 | ######################################## Pour extrapoler la courbe |
266 | 311 | ||
267 | def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): | 312 | def prolongecourbe(tableauOMS, dates, donnees, typecourbe, liste_err): |
268 | """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours) | 313 | """ tableauOMS est le ableau des données OMS. dates et donnees sont les dates (jours) |
269 | et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate | 314 | et les données d'où on extrapole. On calcule toutes les dates comme des sauvages. |
315 | On renvoie la liste des jours totale et la liste des data_totales | ||
270 | (tableaux de jours) | 316 | (tableaux de jours) |
271 | typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z | 317 | typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z |
272 | à l'indice 1 | 318 | à l'indice 1 |
273 | On renvoie [] si pas pu extrapoler. """ | 319 | On renvoie [],[] si pas pu extrapoler. """ |
320 | # les lignes OMS correspondant aux dates données | ||
321 | lignesoms = [tableauOMS[int(date)] for date in dates] | ||
322 | debug("prolongecourbe : Lignes OMS :"+str(lignesoms)+" valeur de données : "+str(donnees), liste_err) | ||
274 | 323 | ||
275 | # la ligne OMS | ||
276 | ligneoms = tableauOMS[date] | ||
277 | debug("prolongecourbe : Ligne OMS :"+str(ligneoms)+" valeur de donnée : "+str(donnee), liste_err) | ||
278 | 324 | ||
279 | 325 | ||
280 | # On cherche dans quel intervalle on se situe | 326 | # Principe : on cherche dans quel intervalle de "colonnes" on se situe. |
327 | # On va donc regarder pour chaque donnée entre quels i on se situe,et après | ||
328 | # prendre le plus grand intervalle. | ||
329 | # Numéros de colonnes d'où on part. Pour la fin c'est forcément longueur-1 | ||
281 | if typecourbe == "P": | 330 | if typecourbe == "P": |
282 | idep=4 | 331 | idep=4 |
283 | else: | 332 | else: |
284 | idep = 1 | 333 | idep = 1 |
285 | i = idep | 334 | |
286 | while i<len(ligneoms) and ligneoms[i]<donnee: | 335 | liste_indices = [] |
287 | i+=1 | 336 | for k in range(len(dates)): |
288 | debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err) | 337 | i= idep |
289 | if i>=len(ligneoms): | 338 | ligne = lignesoms[k] |
290 | warning("prolongation de courbe : pas réussi... donnée trop haute !", liste_err) | 339 | while i<len(ligne) and ligne[i]<donnees[k]: |
291 | return [] | 340 | i+=1 |
292 | if i==idep: | 341 | debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err) |
293 | warning("prolongation de courbe : pas réussi... donnée trop basse !", liste_err) | 342 | if i>=len(ligne): |
294 | return [] | 343 | warning("prolongation de courbe : pas réussi... donnée trop haute !", liste_err) |
344 | return [],[] | ||
345 | if i==idep: | ||
346 | warning("prolongation de courbe : pas réussi... donnée trop basse !", liste_err) | ||
347 | return [],[] | ||
348 | liste_indices.append(i) | ||
349 | imin=min(liste_indices) -1 | ||
350 | imax=max(liste_indices) | ||
351 | debug("Les données se situent dans les indices : "+str(imin)+", "+str(imax),liste_err) | ||
352 | # Maintenant on doit trouver les coeffs : on se situe en coeff * l[imin]+ (1-coeff)*ligne[imax] | ||
353 | # Et faire la moyenne de ces coeffs | ||
354 | total = 0 | ||
355 | for k in range(len(dates)): | ||
356 | ligne = lignesoms[k] | ||
357 | donnee = donnees[k] | ||
358 | total += (donnee - ligne[imax])/(ligne[imin] - ligne[imax]) | ||
359 | #print(k) | ||
360 | coeff_moyen = total/len(dates) | ||
361 | |||
362 | debug("Coeff moyen calculé : "+str(coeff_moyen), liste_err) | ||
295 | 363 | ||
296 | # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] | 364 | # On utilisera la même chose pour les nouvelle donnee |
297 | # On utilisera la même chose pour la nouvelle donnee | ||
298 | coeff = (donnee - ligneoms[i])/(ligneoms[i-1] - ligneoms[i]) | ||
299 | 365 | ||
300 | # extrapolations | 366 | # extrapolations |
367 | nouvdates =oms.extraire_colonne(tableauOMS,0) # On sort tout. | ||
368 | #print(nouvdates) | ||
301 | nouvdonnees = [] | 369 | nouvdonnees = [] |
302 | for j in nouvdates: | 370 | for j in nouvdates: |
303 | ligne2 = tableauOMS[j] | 371 | ligne2 = tableauOMS[int(j)] |
304 | nouvdonnees.append(coeff*ligne2[i-1]+ (1-coeff)*ligne2[i]) | 372 | nouvdonnees.append(coeff_moyen*ligne2[imin]+ (1-coeff_moyen)*ligne2[imax]) |
305 | 373 | ||
306 | return nouvdonnees \ No newline at end of file | 374 | return nouvdates,nouvdonnees \ No newline at end of file |