From 3d7da80ac11bb87ab441fb51f93b738be02de2c3 Mon Sep 17 00:00:00 2001
From: Denise sur Lya
Date: Sat, 17 Apr 2021 13:47:35 +0200
Subject: =?UTF-8?q?Extrapolation=20am=C3=A9lior=C3=A9e=20+=20possibilit?=
=?UTF-8?q?=C3=A9=20de=20voir=20le=20point=20voulu?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
calculs_extrapole.py | 189 +++++++++++++++++++++++++++++++++++++-----------
data/changelog_data.txt | 8 ++
gestion_donnees.py | 5 ++
templates/index.html | 8 +-
trace_courbe.py | 65 ++++++++++++++---
5 files changed, 219 insertions(+), 56 deletions(-)
diff --git a/calculs_extrapole.py b/calculs_extrapole.py
index ab22502..509402b 100644
--- a/calculs_extrapole.py
+++ b/calculs_extrapole.py
@@ -10,8 +10,95 @@ from gestion_erreurs import warning, debug
from configuration import CONFIG
from gestion_donnees import convertit_age_vers_texte
import gestion_unites as u
+from math import ceil
-#### Les fonctions qui permettent de faire les calculs additionnels une fois qu'on a l'extrapolation
+#### Les fonctions qui permettent de faire les calculs additionnels une fois qu'on a l'extrapolation (ou pas)
+
+def interpole_lineaire(dates, donnees, t, liste_err):
+ """ simple interpolation linéaire.
+ dates et donnees sont les dates et données de l'enfant.
+ t est le temps (jours) auquel on veut l'interpolation. On renvoie la donnée interpolée.
+ On interpole linéairement entre les deux données. Si ça
+ n'est pas possible parce que t n'est pas dans les bornes, on renvoie -1
+ """
+
+ if tdates[-1]:
+ return -1 # en dehors des bornes
+
+ i=0 # on cherche l'intervalle : entre dates[i] et dates[i+1] on a la donnée t
+ while imax(donnees) or valBêta : Les calculs de données sont améliorés :
+
+- Si l'âge demandé (ou la donnée) est entre les données saisies, c'est une simple interpolation linéaires entre les données existantes,
+- Si c'est en dehors, alors on fait un calcul d'extrapolation comme avant
+
+En plus, on peut décider de marquer sur le graphique, ou pas, le point qu'on cherche.
+
"
+
"Version 2.3001","13/03/2021","Petit changement : on peut maintenant mettre le poids en grammes. Si le poids saisi est supérieur à 500 il sera automatiquement converti.
"
"Version 2.3","26/02/2021","Nouveauté : extrapolation de la courbe améliorée, ainsi que la possibilité de faire des ""calculs"" sur la courbe. Il y a aussi deux-trois petits changements cosmétiques.
"
diff --git a/gestion_donnees.py b/gestion_donnees.py
index 2583007..2153a55 100644
--- a/gestion_donnees.py
+++ b/gestion_donnees.py
@@ -333,6 +333,11 @@ def gere_configuration(data,liste_err):
else:
configuration["non_sauve"]["calculextratemps_type"] = ""
+ # Tracer les calculs sur la grille
+ configuration["non_sauve"]["calculextradata_trace"] = gere_checkbox(data.get("calculextradata_trace"))
+ configuration["non_sauve"]["calculextratemps_trace"] = gere_checkbox(data.get("calculextratemps_trace"))
+
+
return configuration
diff --git a/templates/index.html b/templates/index.html
index 64fb9e1..32c45e1 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -121,19 +121,23 @@
diff --git a/trace_courbe.py b/trace_courbe.py
index e725607..28ee5b4 100644
--- a/trace_courbe.py
+++ b/trace_courbe.py
@@ -5,8 +5,10 @@ import gestionOMS as oms
import gestion_unites as u
from gestion_donnees import calcule_max_graphique, convertit_jours_vers_python, convertit_age_vers_texte
from gestion_erreurs import debug, erreur, warning
+from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole, interpole_lineaire, interpole_lineaire_ordonnee, formate_resultat_donnee, formate_resultat_age, formate_interpole, formate_extrapole
+
from numpy import arange
-from calculs_extrapole import calcule_donnee_extrapolee, calcule_age_extrapole
+
import matplotlib.pyplot as plt
@@ -167,6 +169,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err):
jextrapole = jextrapole or conf["non_sauve"][calextra+"_type"] == typedonnee
#print(jextrapole)
+ ############################## Là où on extrapole ################################
if jextrapole:
try:
debug("Il faut extrapoler les courbes !", liste_err)
@@ -181,6 +184,7 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err):
debug("On extrapole sur les jours : "+str(sources_extrap), liste_err)
+ # On récupère toutes les données extrapolées
dates_extrapole, donnees_extrapole = prolongecourbe(t, sources_extrap, sources_extrap_data, conf["typecourbe"], liste_err)
debug("données extrapolées !", liste_err)
#debug(str(dates_extrapole[0:10])+str(donnees_extrapole[0:10]), liste_err)
@@ -201,19 +205,50 @@ def cree_figure(conf,l_jours,l_poids,typedonnee,liste_extracalculs, liste_err):
plt.plot(dates_extrapole_trace, donnees_extrapole_trace,color=conf["couleurs"]["cadretxt"], linestyle=(0, (5,7)), marker=None)
debug("Tracé de la courbe extrapolée ok", liste_err)
- # Calculer une donnée à l'âge x
+ ### Calculer une donnée à l'âge x
if conf["non_sauve"]["calculextradata_type"] == typedonnee:
- r = calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextradata_age"], typedonnee, liste_err)
- if r!="":
- liste_extracalculs.append(r)
+ # On essaie l'interpolation
+ r = interpole_lineaire(l_jours,l_poids,conf["non_sauve"]["calculextradata_age"], liste_err)
+ if r==-1:
+ # ça sera donc une extrapolation
+ r = calcule_donnee_extrapolee(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextradata_age"], liste_err)
+ message=formate_extrapole(conf["non_sauve"]["nbextradata"])
+# if == 0:
+# message+="l'ensemble des données"
+# else:
+# message+="les "+str(conf["non_sauve"]["nbextradata"])+" dernière"+met_s(conf["non_sauve"]["nbextradata"])+" données"
+ else:
+ message=formate_interpole()
+
+ texte = formate_resultat_donnee(conf["non_sauve"]["calculextradata_age"], r, typedonnee, message, liste_err)
+ debug("calcul de la donnée extrapolée : "+texte, liste_err)
+ if texte!="":
+ liste_extracalculs.append(texte)
print(liste_extracalculs)
+ # Ajouter le trait ?
+ if conf["non_sauve"]["calculextradata_trace"] == "oui":
+ dessine_guides(conf["non_sauve"]["calculextradata_age"], r, conf["couleurs"]["cadretxt"], unite, ax, liste_err)
- # Calculer un âge où on atteint cette donnée
+ ### Calculer un âge où on atteint cette donnée
if conf["non_sauve"]["calculextratemps_type"] == typedonnee:
- r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err)
- if r!="":
- liste_extracalculs.append(r)
+ # interpolation
+ r = interpole_lineaire_ordonnee(l_jours,l_poids,conf["non_sauve"]["calculextratemps_val"], liste_err)
+ if r==-1:
+ # ça sera donc une extrapolation
+ r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], liste_err)
+ message=formate_extrapole(conf["non_sauve"]["nbextradata"])
+ else:
+ message=formate_interpole()
+
+ texte = formate_resultat_age(r, conf["non_sauve"]["calculextratemps_val"], typedonnee, message, liste_err)
+
+ #r = calcule_age_extrapole(dates_extrapole, donnees_extrapole, conf["non_sauve"]["calculextratemps_val"], typedonnee, liste_err)
+ if texte!="":
+ liste_extracalculs.append(texte)
print(liste_extracalculs)
+ # Ajouter le trait ?
+ if conf["non_sauve"]["calculextratemps_trace"]:
+ dessine_guides(r, conf["non_sauve"]["calculextratemps_val"], conf["couleurs"]["cadretxt"], unite, ax, liste_err)
except:
warning("Des problèmes pour extrapoler...", liste_err)
@@ -371,4 +406,14 @@ def prolongecourbe(tableauOMS, dates, donnees, typecourbe, liste_err):
ligne2 = tableauOMS[int(j)]
nouvdonnees.append(coeff_moyen*ligne2[imin]+ (1-coeff_moyen)*ligne2[imax])
- return nouvdates,nouvdonnees
\ No newline at end of file
+ return nouvdates,nouvdonnees
+
+
+def dessine_guides(t, data, couleur, unite, ax, liste_err):
+ """ dessine deux lignes, horizontales et verticales qui vont "vers" la courbe
+ jusqu'aux points (t, data). En pointillés et avec un point dessus."""
+ debug("Début de dessine_guides"+str(t)+", "+str(data), liste_err)
+ t_conv = u.convertitunite(t,unite,liste_err)
+ ax.vlines(t_conv, 0, data, colors=couleur, linestyles="dashed")
+ ax.hlines(data, 0, t_conv, color=couleur, linestyles="dashed")
+ ax.plot([t_conv], [data], color=couleur, marker="*", ms=13)
--
cgit v1.2.3