From c2fe511bb9e6974cc267b8926a47b1fa81b37da3 Mon Sep 17 00:00:00 2001 From: Denise sur Lya Date: Fri, 12 Feb 2021 23:18:52 +0100 Subject: [PATCH] =?utf8?q?Possibilit=C3=A9=20de=20prolonger=20la=20courbe?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- configuration.py | 3 +- data/changelog_data.txt | 2 + gestion_donnees.py | 5 ++- templates/index.html | 3 ++ trace_courbe.py | 93 +++++++++++++++++++++++++++++++++++------ 5 files changed, 92 insertions(+), 14 deletions(-) diff --git a/configuration.py b/configuration.py index 79bcd6d..242f179 100644 --- a/configuration.py +++ b/configuration.py @@ -112,11 +112,12 @@ DEFAUT["unite"] = "" DEFAUT["tracevide"] = "" DEFAUT["memechelle"] = "" DEFAUT["positionlegende"] = "hg" +DEFAUT["prolongercourbes"] = "" + DEFAUT["prematurite"] = "0j" DEFAUT["agecorrige"] = "oui" - # initialiser la config def config_init(): c = DEFAUT.copy() diff --git a/data/changelog_data.txt b/data/changelog_data.txt index a90c500..09a6da4 100644 --- a/data/changelog_data.txt +++ b/data/changelog_data.txt @@ -1,3 +1,5 @@ +"Version 2.25","12/02/2021","

Nouveauté : possibilité de ""prolonger"" la courbe de poids/taille en pointillés. L'extrapolation est faite à partir de la dernière donnée. À tester encore !

" + "Version 2.2001","13/11/2020","

Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.

" "Version 2.2","12/11/2020","

Ajout de la possibilité d'avoir la courbe ajustée pour les prématurés. Attention c'est encore en bêta ! Le principe c'est simplement les courbes OMS décalées de la durée de prématurité, ce qui convient plus ou moins bien aux enfants nés prématurés une fois qu'ils ont atteint l'âge du terme en âge corrigé. diff --git a/gestion_donnees.py b/gestion_donnees.py index 880614d..c378b5e 100644 --- a/gestion_donnees.py +++ b/gestion_donnees.py @@ -82,7 +82,7 @@ def calcule_max_graphique(l_jours): return CONFIG["jours_defaut_donneesvides"] else: jour_maxi = max(l_jours)# pas la peine d'aller très au delà du jour max - jour_maxi = int(jour_maxi* 1.1)+3 # on rajoute un peu + jour_maxi = int(jour_maxi* 1.2)+3 # on rajoute un peu return jour_maxi @@ -238,6 +238,7 @@ def gere_configuration(data,liste_err): # Même échelle sur tous les graphiques configuration["memechelle"] = gere_checkbox(data.get("memechelle","")) + # maxi. 0 signifie qu'on veut pas de maxi maxi = data.get("maxi","") @@ -289,6 +290,8 @@ def gere_configuration(data,liste_err): positionlegende = "upper left" configuration["positionlegende"] = positionlegende + configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) + configuration["couleurs"] = {} # gérer les couleurs diff --git a/templates/index.html b/templates/index.html index 6f75438..959c6a1 100644 --- a/templates/index.html +++ b/templates/index.html @@ -93,6 +93,8 @@ {% endfor %}

  • +
  • Prolonger les courbes (expérimental) :
  • +
  • Dimensions du graphique :
  • @@ -103,6 +105,7 @@ {% endfor %} +
  • Couleur courbe du bas | Couleur courbe du milieu | Couleur courbe du haut
  • Couleur du fond | Couleur de la grille | Couleur des axes, texte et courbe
  • diff --git a/trace_courbe.py b/trace_courbe.py index d004dcb..fab6471 100644 --- a/trace_courbe.py +++ b/trace_courbe.py @@ -51,15 +51,13 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): # à toutes les données. # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. - debug("Prématurité : "+str(prema)+"age corrigé : "+conf["agecorrige"],liste_err) - + debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) if prema>0 and conf["agecorrige"] == "oui": l_jours = [j-prema for j in l_jours] jour_maxi = jour_maxi - prema # debug("liste des jours : "+str(l_jours),liste_err) - else: - debug("bla",liste_err) + l_jours_conv = convertit_tableau(l_jours,unite,liste_err) # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne... age_maxi = convertitunite(jour_maxi-1,unite,liste_err) @@ -113,7 +111,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): # convertir les unités - + #### Partie code OMS #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues try: t = lire_fichier_csv(fichier_oms) @@ -142,13 +140,16 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): plt.rcParams['grid.color'] = conf["couleurs"]["grille"] plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] - #warning("bla"+str(liste_data_labels),liste_err) + #Tracé des courbes OMS for (i,label,couleur) in liste_data_labels: plt.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) debug("cree_figure : tracé des courbes OMS ok",liste_err) + + ##### Tracé des courbes OMS fini + # On extrait la valeur min et la valeur max des poids (colonne_min,_,_) = liste_data_labels[-1] (colonne_max,_,_) = liste_data_labels[0] @@ -165,20 +166,43 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): poids_min = max(0,poids_min-1) #max : +5% poids_max = poids_max * 1.05 + - #warning("Jusque là ça marche",liste_err) debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) - ### Tracé pour de bon if l_jours != []: plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) - + + #### extrapolatios éventuelles + #print("prolongercourbes" in conf) + if conf["prolongercourbes"] == "oui": + #print("coucou") + # les dates, on prend tous les jours tant qu'à faire + date_fin = int(l_jours[-1]) + dates_extrapole = list(range(date_fin, jour_maxi)) + donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) + #print("données extrapolées !") + dates_extrapole = convertit_tableau(dates_extrapole,unite,liste_err) + + # tracé des données extrapolées + plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) + + else: + debug("On ne trace pas de courbe enfant", liste_err) + plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) + #print("bla") plt.title(titre,color=conf["couleurs"]["cadretxt"]) - plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) + #print("ble") + if l_jours_conv == []: + plt.axis([0,age_maxi, poids_min, poids_max]) + else: + plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) + #print("bli") + if conf['legende']=="oui": legende = plt.legend(loc=conf['positionlegende']) @@ -187,5 +211,50 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): fig.tight_layout() - #warning("Jusque là ça marche",liste_err) - return fig \ No newline at end of file + debug("Fin de cree_figure", liste_err) + return fig + + + +def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): + """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours) + et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate + (tableaux de jours) + typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z + à l'indice 1 + On renvoie [] si pas pu extrapoler. """ + + # la ligne OMS + ligneoms = tableauOMS[date] + debug("prolongecourbe : Ligne OMS :"+str(ligneoms)+" valeur de donnée : "+str(donnee), liste_err) + + + # On cherche dans quel intervalle on se situe + if typecourbe == "P": + idep=4 + else: + idep = 1 + i = idep + while i=len(ligneoms): + warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err) + return [] + if i==idep: + warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err) + return [] + + # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] + # On utilisera la même chose pour la nouvelle donnee + #print(ligneoms[i], ligneoms[i-1]) + coeff = (donnee - ligneoms[i])/(ligneoms[i-1] - ligneoms[i]) + #print("coeff : "+str(coeff)) + + # extrapolations + nouvdonnees = [] + for j in nouvdates: + ligne2 = tableauOMS[j] + nouvdonnees.append(coeff*ligne2[i-1]+ (1-coeff)*ligne2[i]) + + return nouvdonnees \ No newline at end of file -- 2.41.0