]>
git.immae.eu Git - perso/Denise/oms.git/blob - calculs_extrapole.py
c84960d6b703d9ba5e75b7c60b80aaf3efd46c27
2 # -*- coding: utf-8 -*-
4 Created on Thu Feb 18 18:25:11 2021
9 from gestion_erreurs
import warning
, debug
10 from configuration
import CONFIG
11 from gestion_donnees
import convertit_age_vers_texte
12 import gestion_unites
as u
15 #### Les fonctions qui permettent de faire les calculs additionnels une fois qu'on a l'extrapolation (ou pas)
17 def interpole_lineaire(dates
, donnees
, t
, liste_err
):
18 """ simple interpolation linéaire.
19 dates et donnees sont les dates et données de l'enfant.
20 t est le temps (jours) auquel on veut l'interpolation. On renvoie la donnée interpolée.
21 On interpole linéairement entre les deux données. Si ça
22 n'est pas possible parce que t n'est pas dans les bornes, on renvoie -1
25 if t
<dates
[0] or t
>dates
[-1]:
26 return -1 # en dehors des bornes
28 i
=0 # on cherche l'intervalle : entre dates[i] et dates[i+1] on a la donnée t
29 while i
<len(dates
)-1 and dates
[i
+1]<t
:
32 m
= (donnees
[i
+1] - donnees
[i
])/(dates
[i
+1] - dates
[i
]) # pente de la courbe
33 valeur
= m
* (t
- dates
[i
]) + donnees
[i
]
37 def interpole_lineaire_ordonnee(dates
, donnees
, val
, liste_err
):
38 """ interpolation linéaire des données.
39 dates et donnees sont les dates et données de l'enfant.
40 val est la valeur pour laquelle on veut trouver le temps.
41 On interpole linéairement entre les deux données. Si ça
42 n'est pas possible parce que t n'est pas dans les bornes, on renvoie -1
44 Comportement potentiellement foireux si jamais les données ne sont pas
45 croissantes (poids qui chute, etc)..."""
47 if val
>max(donnees
) or val
<min(donnees
):
48 return -1 # en dehors des maxi et mini
50 i
= 0 # On cherche dans quel intervalles de données on se situe (donnnes[i]
52 while i
<len(donnees
)-1 and donnees
[i
+1]<val
:
55 m
= (dates
[i
+1] - dates
[i
])/(donnees
[i
+1] - donnees
[i
])
56 temps
= m
* (val
- donnees
[i
]) + dates
[i
]
61 ######################################
67 def calcule_donnee_extrapolee(dates_extrapole
, donnees_extrapole
, age_voulu
, liste_err
):
68 """ prend en argument les données extrapolées, l'âge voulu en jours.
69 Renvoie la donnée, ou -1 si ça n'a pas marché"""
70 age_voulu
= int(age_voulu
) # pour avoir les choses bien
71 debug("On veut la donnée à l'âge "+str(age_voulu
), liste_err
)
73 i_date_voulue
= dates_extrapole
.index(age_voulu
)
74 donnee_voulue
= donnees_extrapole
[i_date_voulue
]
77 #return formate_resultat_donnee(age_voulu, donnee_voulue, typedonnee, "", liste_err)
79 warning("Impossible de calculer la donnée à l'âge "+age_voulu
, liste_err
)
84 def calcule_age_extrapole(dates_extrapole
, donnees_extrapole
, donnee_voulue
, liste_err
):
85 """ prend en argument les données extrapolées, la donnée voulue (dans l'unité adaptée)
86 Renvoie la donnée, ou -1 si ça n'a pas marché"""
88 debug("On veut savoir à quel âge on a "+str(donnee_voulue
), liste_err
)
91 while i
<len(donnees_extrapole
) and donnees_extrapole
[i
]<donnee_voulue
:
94 return dates_extrapole
[i
]
95 #return formate_resultat_age(dates_extrapole[i], donnee_voulue, typedonnee, "", liste_err)
97 warning("Impossible de calculer l'âge pour la donnée "+str(donnee_voulue
), liste_err
)
100 ######################################
101 ### Formatage du résultat "joli"
104 """ renvoie un s si pluriel, rien sinon"""
110 def joliechaine_age(age
):
111 """ prend en argument une chaîne du type 6a3m2j et renvoie une chaîne un peu
112 plus jolie à lire genre 6 ans, 3mois, 2 jours"""
117 retour
+=nombre
+" an"+met_s(nombre
)+", "
120 retour
+=nombre
+" mois, "
123 retour
+=nombre
+" semaine"+met_s(nombre
)+", "
126 retour
+=nombre
+" jour"+met_s(nombre
)+", "
133 def formate_resultat_donnee(age
, date
, donnee
, typedonnee
, extra
, liste_err
):
134 """ Formate le tout en une zolie phrase
135 age date et donnee sont les données. date peut être None (sinon donnée de date)
136 typedonnee est le type de donnée (poids, etc)
137 extra est un truc additionnel à mettre entre parenthèses"""
139 donnee_arrondie
= u
.arrondit_donnee(donnee
, typedonnee
)
140 chaine
= "À "+joliechaine_age(convertit_age_vers_texte(age
))
143 chaine
+= ", le "+date
.strftime("%d/%m/%Y")
145 if typedonnee
== "poids":
146 chaine
+= ", l'enfant pèsera "+str(donnee_arrondie
)+" kg"
147 elif typedonnee
== "taille":
148 chaine
+= ", l'enfant mesurera "+str(donnee_arrondie
)+" cm"
149 else: # phrase générique
150 chaine
+= ", la donnée sera : "+str(donnee_arrondie
)+" "+CONFIG
["unites_typedonnees"][typedonnee
]
160 def formate_resultat_age(age
, date
, donnee
, typedonnee
, extra
, liste_err
):
161 """ formate les données en une zolie phrase
162 age, date et donnee sont les données. date est une donnée de date qui peut être vide.
163 typedonnee est le type de donnée (poids, etc)
164 extra est un truc additionnel à mettre entre parenthèses"""
165 age_joli
= joliechaine_age(convertit_age_vers_texte(age
))
166 if typedonnee
=="poids":
167 chaine
= "L'enfant atteindra un poids de "+str(donnee
)+" kg à l'âge de "+age_joli
168 elif typedonnee
=="taille":
169 chaine
= "L'enfant atteindra la taille "+str(donnee
)+ "cm à l'âge de "+age_joli
170 else:# phrase générique
171 chaine
= "L'enfant atteindra la donnée "+typedonnee
+" "+str(donnee
)+" à l'âge de "+age_joli
174 chaine
+= ", le "+date
.strftime("%d/%m/%Y")
184 def formate_extrapole(nb_extra
):
185 """ Renvoie une chaîne qui dit sur cb on a extrapolé"""
186 message
="extrapolation à partir "
188 message
+="de l'ensemble des données"
190 message
+="de la donnée la plus récente"
192 message
+="des "+str(nb_extra
)+" dernières données"
195 def formate_interpole():
196 return "interpolation à partir des données existantes"