Possibilité de prolonger la courbe
authorDenise sur Lya <sekhmet@lya>
Fri, 12 Feb 2021 22:18:52 +0000 (23:18 +0100)
committerDenise sur Lya <sekhmet@lya>
Fri, 12 Feb 2021 22:18:52 +0000 (23:18 +0100)
configuration.py
data/changelog_data.txt
gestion_donnees.py
templates/index.html
trace_courbe.py

index 79bcd6d12bd54c3ed3020b1e04f001061a766d6c..242f179bafedaa25daea28a1e51df3eaa062bc3f 100644 (file)
@@ -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()
index a90c500103a551ba0f31aa3cdb55f1249214b858..09a6da4171e7ade71714c39f00917839762ffad6 100644 (file)
@@ -1,3 +1,5 @@
+"Version 2.25","12/02/2021","<p>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 !</p>"
+
 "Version 2.2001","13/11/2020","<p>Amélioration de l'affichage pour les prémas (masqués par défaut). Précision dans le texte + FAQ.</p>"
 
 "Version 2.2","12/11/2020","<p>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é.
index 880614de16c1235cd1aba63b6365200202df1e1b..c378b5e653a043334dbbeeae658a7555902d8878 100644 (file)
@@ -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
index 6f7543828f4ac1fe50a01a6095190da10b6ef596..959c6a17082865667281722ad6fed206498100de 100644 (file)
@@ -93,6 +93,8 @@
        {% endfor %}
                </select></label></li>
        <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li>
+       <li>Prolonger les courbes (expérimental) : <input type="checkbox" name="prolongercourbes" {% if valform.prolongercourbes == "oui" %} checked{% endif%}></li>
+       
        <li><label>Même échelle sur tous les graphiques&nbsp;: </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li>
        <li>Dimensions du graphique&nbsp;: <label>largeur&nbsp;: </label><input type="text" name="largeur" value="{{ valform.largeur }}"> 
        <label>hauteur&nbsp;: </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li>
 {% endfor %}
 </select></label>
        </li>
+       
        <li>Couleur courbe du bas <input type="color" name="couleur_courbe1" value="{{ valform.couleurs.courbe1 }}"> | Couleur courbe du milieu <input type="color" name="couleur_courbe2"  value="{{ valform.couleurs.courbe2 }}"> | Couleur courbe du haut <input type="color" name="couleur_courbe3" value="{{ valform.couleurs.courbe3 }}"> </li>
        <li>Couleur du fond <input type="color" name="couleur_fond" value="{{ valform.couleurs.fond }}"> | Couleur de la grille <input type="color" name="couleur_grille" value="{{ valform.couleurs.grille }}"> | Couleur des axes, texte et courbe <input type="color" name="couleur_cadretxt" value="{{ valform.couleurs.cadretxt }}"></li>
 </ul>
index d004dcb7b485cbfc9ccf3298e452c82278d069a3..fab64718c0f7508795f13fea2854b268e5b3d19e 100644 (file)
@@ -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) and ligneoms[i]<donnee:
+        i+=1
+    debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err)
+    if 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