diff options
author | Denise sur Lya <sekhmet@lya> | 2021-02-12 23:18:52 +0100 |
---|---|---|
committer | Denise sur Lya <sekhmet@lya> | 2021-02-12 23:18:52 +0100 |
commit | c2fe511bb9e6974cc267b8926a47b1fa81b37da3 (patch) | |
tree | 6dbb649f7f81771ce2906787e84833196c8d07b6 | |
parent | 85e9aa73264a0e8669074444807054a20d3d805d (diff) | |
download | oms-c2fe511bb9e6974cc267b8926a47b1fa81b37da3.tar.gz oms-c2fe511bb9e6974cc267b8926a47b1fa81b37da3.tar.zst oms-c2fe511bb9e6974cc267b8926a47b1fa81b37da3.zip |
Possibilité de prolonger la courbe
-rw-r--r-- | configuration.py | 3 | ||||
-rw-r--r-- | data/changelog_data.txt | 2 | ||||
-rw-r--r-- | gestion_donnees.py | 5 | ||||
-rw-r--r-- | templates/index.html | 3 | ||||
-rw-r--r-- | 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"] = "" | |||
112 | DEFAUT["tracevide"] = "" | 112 | DEFAUT["tracevide"] = "" |
113 | DEFAUT["memechelle"] = "" | 113 | DEFAUT["memechelle"] = "" |
114 | DEFAUT["positionlegende"] = "hg" | 114 | DEFAUT["positionlegende"] = "hg" |
115 | DEFAUT["prolongercourbes"] = "" | ||
116 | |||
115 | 117 | ||
116 | DEFAUT["prematurite"] = "0j" | 118 | DEFAUT["prematurite"] = "0j" |
117 | DEFAUT["agecorrige"] = "oui" | 119 | DEFAUT["agecorrige"] = "oui" |
118 | 120 | ||
119 | |||
120 | # initialiser la config | 121 | # initialiser la config |
121 | def config_init(): | 122 | def config_init(): |
122 | c = DEFAUT.copy() | 123 | 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 @@ | |||
1 | "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>" | ||
2 | |||
1 | "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>" | 3 | "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>" |
2 | 4 | ||
3 | "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é. | 5 | "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é. |
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): | |||
82 | return CONFIG["jours_defaut_donneesvides"] | 82 | return CONFIG["jours_defaut_donneesvides"] |
83 | else: | 83 | else: |
84 | jour_maxi = max(l_jours)# pas la peine d'aller très au delà du jour max | 84 | jour_maxi = max(l_jours)# pas la peine d'aller très au delà du jour max |
85 | jour_maxi = int(jour_maxi* 1.1)+3 # on rajoute un peu | 85 | jour_maxi = int(jour_maxi* 1.2)+3 # on rajoute un peu |
86 | return jour_maxi | 86 | return jour_maxi |
87 | 87 | ||
88 | 88 | ||
@@ -238,6 +238,7 @@ def gere_configuration(data,liste_err): | |||
238 | 238 | ||
239 | # Même échelle sur tous les graphiques | 239 | # Même échelle sur tous les graphiques |
240 | configuration["memechelle"] = gere_checkbox(data.get("memechelle","")) | 240 | configuration["memechelle"] = gere_checkbox(data.get("memechelle","")) |
241 | |||
241 | 242 | ||
242 | # maxi. 0 signifie qu'on veut pas de maxi | 243 | # maxi. 0 signifie qu'on veut pas de maxi |
243 | maxi = data.get("maxi","") | 244 | maxi = data.get("maxi","") |
@@ -289,6 +290,8 @@ def gere_configuration(data,liste_err): | |||
289 | positionlegende = "upper left" | 290 | positionlegende = "upper left" |
290 | configuration["positionlegende"] = positionlegende | 291 | configuration["positionlegende"] = positionlegende |
291 | 292 | ||
293 | configuration["prolongercourbes"] = gere_checkbox(data.get("prolongercourbes","")) | ||
294 | |||
292 | 295 | ||
293 | configuration["couleurs"] = {} | 296 | configuration["couleurs"] = {} |
294 | # gérer les couleurs | 297 | # 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 @@ | |||
93 | {% endfor %} | 93 | {% endfor %} |
94 | </select></label></li> | 94 | </select></label></li> |
95 | <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li> | 95 | <li><label>valeur maximum du graphique (facultatif, syntaxe similaire à l'âge) </label><input type="text" name="maxi" value="{{ valform.maxi }}"></li> |
96 | <li>Prolonger les courbes (expérimental) : <input type="checkbox" name="prolongercourbes" {% if valform.prolongercourbes == "oui" %} checked{% endif%}></li> | ||
97 | |||
96 | <li><label>Même échelle sur tous les graphiques : </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li> | 98 | <li><label>Même échelle sur tous les graphiques : </label><input type="checkbox" name="memechelle" {% if valform.memechelle == 'oui' %} checked{% endif %}></li> |
97 | <li>Dimensions du graphique : <label>largeur : </label><input type="text" name="largeur" value="{{ valform.largeur }}"> | 99 | <li>Dimensions du graphique : <label>largeur : </label><input type="text" name="largeur" value="{{ valform.largeur }}"> |
98 | <label>hauteur : </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li> | 100 | <label>hauteur : </label><input type="text" name="hauteur" value="{{ valform.hauteur }}"></li> |
@@ -103,6 +105,7 @@ | |||
103 | {% endfor %} | 105 | {% endfor %} |
104 | </select></label> | 106 | </select></label> |
105 | </li> | 107 | </li> |
108 | |||
106 | <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> | 109 | <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> |
107 | <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> | 110 | <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> |
108 | </ul> | 111 | </ul> |
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): | |||
51 | # à toutes les données. | 51 | # à toutes les données. |
52 | # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. | 52 | # Si agecorrige est non, alors on veut ajouter la valeur de préma aux courbes de référence. |
53 | 53 | ||
54 | debug("Prématurité : "+str(prema)+"age corrigé : "+conf["agecorrige"],liste_err) | 54 | debug("Prématurité : "+str(prema)+" age corrigé : "+conf["agecorrige"],liste_err) |
55 | |||
56 | 55 | ||
57 | if prema>0 and conf["agecorrige"] == "oui": | 56 | if prema>0 and conf["agecorrige"] == "oui": |
58 | l_jours = [j-prema for j in l_jours] | 57 | l_jours = [j-prema for j in l_jours] |
59 | jour_maxi = jour_maxi - prema | 58 | jour_maxi = jour_maxi - prema |
60 | # debug("liste des jours : "+str(l_jours),liste_err) | 59 | # debug("liste des jours : "+str(l_jours),liste_err) |
61 | else: | 60 | |
62 | debug("bla",liste_err) | ||
63 | l_jours_conv = convertit_tableau(l_jours,unite,liste_err) | 61 | l_jours_conv = convertit_tableau(l_jours,unite,liste_err) |
64 | # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne... | 62 | # Attention, comme les jours commencent à partir de 0, faut enlever 1 pour avoir la borne... |
65 | age_maxi = convertitunite(jour_maxi-1,unite,liste_err) | 63 | age_maxi = convertitunite(jour_maxi-1,unite,liste_err) |
@@ -113,7 +111,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
113 | 111 | ||
114 | 112 | ||
115 | # convertir les unités | 113 | # convertir les unités |
116 | 114 | #### Partie code OMS | |
117 | #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues | 115 | #### On extrait les données des courbes, et on convertit les jours dans l'unité voulues |
118 | try: | 116 | try: |
119 | t = lire_fichier_csv(fichier_oms) | 117 | t = lire_fichier_csv(fichier_oms) |
@@ -142,13 +140,16 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
142 | plt.rcParams['grid.color'] = conf["couleurs"]["grille"] | 140 | plt.rcParams['grid.color'] = conf["couleurs"]["grille"] |
143 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] | 141 | plt.rcParams['legend.edgecolor'] = conf["couleurs"]["grille"] |
144 | 142 | ||
145 | #warning("bla"+str(liste_data_labels),liste_err) | 143 | #Tracé des courbes OMS |
146 | for (i,label,couleur) in liste_data_labels: | 144 | for (i,label,couleur) in liste_data_labels: |
147 | plt.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) | 145 | plt.plot(coljour,extraire_colonne(t,i,jour_maxi),label=label,color=couleur) |
148 | #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) | 146 | #warning("colonne"+str(i)+str(label)+str(couleur),liste_err) |
149 | 147 | ||
150 | debug("cree_figure : tracé des courbes OMS ok",liste_err) | 148 | debug("cree_figure : tracé des courbes OMS ok",liste_err) |
151 | 149 | ||
150 | |||
151 | ##### Tracé des courbes OMS fini | ||
152 | |||
152 | # On extrait la valeur min et la valeur max des poids | 153 | # On extrait la valeur min et la valeur max des poids |
153 | (colonne_min,_,_) = liste_data_labels[-1] | 154 | (colonne_min,_,_) = liste_data_labels[-1] |
154 | (colonne_max,_,_) = liste_data_labels[0] | 155 | (colonne_max,_,_) = liste_data_labels[0] |
@@ -165,20 +166,43 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
165 | poids_min = max(0,poids_min-1) | 166 | poids_min = max(0,poids_min-1) |
166 | #max : +5% | 167 | #max : +5% |
167 | poids_max = poids_max * 1.05 | 168 | poids_max = poids_max * 1.05 |
169 | |||
168 | 170 | ||
169 | #warning("Jusque là ça marche",liste_err) | ||
170 | debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) | 171 | debug("cree_figure : prête à tracer la courbe de l'enfant",liste_err) |
171 | 172 | ||
172 | |||
173 | ### Tracé pour de bon | 173 | ### Tracé pour de bon |
174 | if l_jours != []: | 174 | if l_jours != []: |
175 | plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') | 175 | plt.plot(l_jours_conv,l_poids,label=conf["nom"],color=conf["couleurs"]["cadretxt"],marker='o') |
176 | debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) | 176 | debug("Tracé de la courbe enfant, avec les jours "+str(l_jours_conv),liste_err) |
177 | 177 | ||
178 | #### extrapolatios éventuelles | ||
179 | #print("prolongercourbes" in conf) | ||
180 | if conf["prolongercourbes"] == "oui": | ||
181 | #print("coucou") | ||
182 | # les dates, on prend tous les jours tant qu'à faire | ||
183 | date_fin = int(l_jours[-1]) | ||
184 | dates_extrapole = list(range(date_fin, jour_maxi)) | ||
185 | donnees_extrapole = prolongecourbe(t, date_fin, l_poids[-1], dates_extrapole, conf["typecourbe"], liste_err) | ||
186 | #print("données extrapolées !") | ||
187 | dates_extrapole = convertit_tableau(dates_extrapole,unite,liste_err) | ||
188 | |||
189 | # tracé des données extrapolées | ||
190 | plt.plot(dates_extrapole, donnees_extrapole,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None) | ||
191 | |||
192 | else: | ||
193 | debug("On ne trace pas de courbe enfant", liste_err) | ||
194 | |||
178 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) | 195 | plt.xlabel("Âge en "+unite,color=conf["couleurs"]["cadretxt"]) |
179 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) | 196 | plt.ylabel(typedonnee.capitalize()+" en "+CONFIG["unites_typedonnees"][typedonnee],color=conf["couleurs"]["cadretxt"]) |
197 | #print("bla") | ||
180 | plt.title(titre,color=conf["couleurs"]["cadretxt"]) | 198 | plt.title(titre,color=conf["couleurs"]["cadretxt"]) |
181 | plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) | 199 | #print("ble") |
200 | if l_jours_conv == []: | ||
201 | plt.axis([0,age_maxi, poids_min, poids_max]) | ||
202 | else: | ||
203 | plt.axis([min(0,l_jours_conv[0]),age_maxi,poids_min,poids_max]) | ||
204 | #print("bli") | ||
205 | |||
182 | 206 | ||
183 | if conf['legende']=="oui": | 207 | if conf['legende']=="oui": |
184 | legende = plt.legend(loc=conf['positionlegende']) | 208 | legende = plt.legend(loc=conf['positionlegende']) |
@@ -187,5 +211,50 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_err): | |||
187 | 211 | ||
188 | fig.tight_layout() | 212 | fig.tight_layout() |
189 | 213 | ||
190 | #warning("Jusque là ça marche",liste_err) | 214 | debug("Fin de cree_figure", liste_err) |
191 | return fig \ No newline at end of file | 215 | return fig |
216 | |||
217 | |||
218 | |||
219 | def prolongecourbe(tableauOMS, date, donnee, nouvdates, typecourbe, liste_err): | ||
220 | """ tableauOMS est le ableau des données OMS. date et donnee sont la date (jours) | ||
221 | et la dernière donnée d'où on extrapole. On veut les extrapolations à nouvdate | ||
222 | (tableaux de jours) | ||
223 | typecourbe est P ou Z. Pour P il faut commencer à regarder à l'indice 4, pour Z | ||
224 | à l'indice 1 | ||
225 | On renvoie [] si pas pu extrapoler. """ | ||
226 | |||
227 | # la ligne OMS | ||
228 | ligneoms = tableauOMS[date] | ||
229 | debug("prolongecourbe : Ligne OMS :"+str(ligneoms)+" valeur de donnée : "+str(donnee), liste_err) | ||
230 | |||
231 | |||
232 | # On cherche dans quel intervalle on se situe | ||
233 | if typecourbe == "P": | ||
234 | idep=4 | ||
235 | else: | ||
236 | idep = 1 | ||
237 | i = idep | ||
238 | while i<len(ligneoms) and ligneoms[i]<donnee: | ||
239 | i+=1 | ||
240 | debug("prolongecourbe : on a trouvé la valeur de i : "+str(i),liste_err) | ||
241 | if i>=len(ligneoms): | ||
242 | warning("prolongation de courbe : pas réussi... donnée au dessus !", liste_err) | ||
243 | return [] | ||
244 | if i==idep: | ||
245 | warning("prolongation de courbe : pas réussi... donnée en dessous !", liste_err) | ||
246 | return [] | ||
247 | |||
248 | # Le coeff : donnee = coeff * l[i-1]+ (1-coeff)*ligne[i] | ||
249 | # On utilisera la même chose pour la nouvelle donnee | ||
250 | #print(ligneoms[i], ligneoms[i-1]) | ||
251 | coeff = (donnee - ligneoms[i])/(ligneoms[i-1] - ligneoms[i]) | ||
252 | #print("coeff : "+str(coeff)) | ||
253 | |||
254 | # extrapolations | ||
255 | nouvdonnees = [] | ||
256 | for j in nouvdates: | ||
257 | ligne2 = tableauOMS[j] | ||
258 | nouvdonnees.append(coeff*ligne2[i-1]+ (1-coeff)*ligne2[i]) | ||
259 | |||
260 | return nouvdonnees \ No newline at end of file | ||