4 Commits 63963670bf ... 4b56e407b9

Author SHA1 Message Date
  Ali 4b56e407b9 New parameters in detail table 1 year ago
  Ali 91c09cb9aa Fix ouput mode of tableau detail 1 year ago
  Ali 5efed13f97 Fix bug 1 year ago
  Ali 3d83b04014 Adding parametrization of table column name 1 year ago
3 changed files with 73 additions and 14 deletions
  1. 1 1
      setup.py
  2. 2 0
      thesis_analysis/analyseStatistiques.py
  3. 70 13
      thesis_analysis/genererTableau.py

+ 1 - 1
setup.py

@@ -41,6 +41,6 @@ setup(
     test_suite='tests',
     test_suite='tests',
     tests_require=test_requirements,
     tests_require=test_requirements,
     url='https://github.com/alibell/py_thesis_toolbox',
     url='https://github.com/alibell/py_thesis_toolbox',
-    version='0.0.2',
+    version='0.0.3',
     zip_safe=False,
     zip_safe=False,
 )
 )

+ 2 - 0
thesis_analysis/analyseStatistiques.py

@@ -98,8 +98,10 @@ class analyseStatistiques ():
         description["n"] = data.shape[0]
         description["n"] = data.shape[0]
         description["mean"] = data.mean()
         description["mean"] = data.mean()
         description["median"] = data.median()
         description["median"] = data.median()
+        description["min"] = data.min()
         description["Q25"] = data.quantile(0.25)
         description["Q25"] = data.quantile(0.25)
         description["Q75"] = data.quantile(0.75)
         description["Q75"] = data.quantile(0.75)
+        description["max"] = data.max()
         description["std"] = data.std()
         description["std"] = data.std()
         description["std_mean"] = description["std"]/math.sqrt(description["n"])
         description["std_mean"] = description["std"]/math.sqrt(description["n"])
         description["ci_95"] = [description["mean"]-1.96*description["std_mean"], 
         description["ci_95"] = [description["mean"]-1.96*description["std_mean"], 

+ 70 - 13
thesis_analysis/genererTableau.py

@@ -16,14 +16,16 @@ class genererTableau ():
             qualitative_string_format : format d'écriture du n et de la proportion des variables qualitatives
             qualitative_string_format : format d'écriture du n et de la proportion des variables qualitatives
     """
     """
     
     
-    def __init__ (self, data, precision = 2, quantitative_string_format = "{mean:.2f} +/- {std:.2f} ({n})", qualitative_string_format = "{n} ({p:.2%})"):
+    def __init__ (self, data, precision = 2, quantitative_column_title = "{variable} mean +/- std (n)", quantitative_string_format = "{mean:.2f} +/- {std:.2f} ({n})", qualitative_column_title="{variable} no. (%)", qualitative_string_format = "{n} ({p:.2%})"):
         
         
         """
         """
             Data : data contenant les données aggrégées, généré par analyseStatistiques.analyse_univarie
             Data : data contenant les données aggrégées, généré par analyseStatistiques.analyse_univarie
         """
         """
         
         
         # Parametres
         # Parametres
+        self.quantitative_column_title = quantitative_column_title
         self.quantitative_string_format = quantitative_string_format
         self.quantitative_string_format = quantitative_string_format
+        self.qualitative_column_title = qualitative_column_title
         self.qualitative_string_format = qualitative_string_format
         self.qualitative_string_format = qualitative_string_format
         self.absence_test = "Absence de test effectué (CI des tests conventionnels non remplis)"
         self.absence_test = "Absence de test effectué (CI des tests conventionnels non remplis)"
         self.precision = precision
         self.precision = precision
@@ -72,7 +74,7 @@ class genererTableau ():
         """
         """
         
         
         texte = self.quantitative_string_format.format(
         texte = self.quantitative_string_format.format(
-            mean = round(mean, self.precision), 
+            mean=round(mean, self.precision), 
             std=round(std, self.precision), 
             std=round(std, self.precision), 
             n=round(n, self.precision)
             n=round(n, self.precision)
         )
         )
@@ -278,12 +280,14 @@ class genererTableau ():
             
             
         return en_tete
         return en_tete
     
     
-    def _generer_en_tete_detail(self, variable):
+    def _generer_en_tete_detail(self, variable, iqr=False, extremes=False):
         
         
         """
         """
             Genere l'en-tête d'un tableau Descriptif
             Genere l'en-tête d'un tableau Descriptif
             Input :
             Input :
                 axes : liste des axes d'analyse
                 axes : liste des axes d'analyse
+                iqr, boolean: Si true, intègle les intervalles interquartiles
+                extremes, boolean: Si true, intègle les valeurs extrêmes
             Output : None
             Output : None
         """
         """
         
         
@@ -299,6 +303,19 @@ class genererTableau ():
         ## Pour les variables quantitatives
         ## Pour les variables quantitatives
         if type_variable == "quantitative":
         if type_variable == "quantitative":
             en_tete = en_tete + ["n", "mean", "std", "IC 95%"]
             en_tete = en_tete + ["n", "mean", "std", "IC 95%"]
+
+            extremes_iqr = [
+                ("min", extremes),
+                ("Q25", iqr),
+                ("median", iqr),
+                ("Q75", iqr),
+                ("max", extremes),
+            ]
+
+            for title, rule in extremes_iqr:
+                if rule:
+                    en_tete.append(title)
+
         elif type_variable == "qualitative":
         elif type_variable == "qualitative":
             en_tete.append("n")
             en_tete.append("n")
             en_tete = en_tete + self.liste_modalites_variables[variable]
             en_tete = en_tete + self.liste_modalites_variables[variable]
@@ -322,7 +339,7 @@ class genererTableau ():
             # Ligne d'une variable quantitative : une seule ligne
             # Ligne d'une variable quantitative : une seule ligne
             
             
             ligne = [] # On instancie la ligne
             ligne = [] # On instancie la ligne
-            ligne.append(variable+" mean +/- std (n)") # Ajout du nom de variable
+            ligne.append(self.quantitative_column_title.format(variable=variable)) # Ajout du nom de variable
             ligne.append("") # Espace vide, technique
             ligne.append("") # Espace vide, technique
             ligne.append(self._generer_str_mean_std_n(
             ligne.append(self._generer_str_mean_std_n(
                 self.data[variable]["global"]["mean"],
                 self.data[variable]["global"]["mean"],
@@ -351,7 +368,7 @@ class genererTableau ():
             
             
             ## On écrit la première ligne : nom de variable et test
             ## On écrit la première ligne : nom de variable et test
             ligne = [] # On instancie la ligne
             ligne = [] # On instancie la ligne
-            ligne.append(variable+" no. (%)") # Nom de variable
+            ligne.append(self.qualitative_column_title.format(variable=variable)) # Nom de variable
             ligne = ligne + ["", ""] # Variable vides
             ligne = ligne + ["", ""] # Variable vides
             
             
             # Données liées à chaque axe
             # Données liées à chaque axe
@@ -406,13 +423,15 @@ class genererTableau ():
         
         
         return(lignes)
         return(lignes)
     
     
-    def _generer_lignes_detail(self, variable, axe = None):
+    def _generer_lignes_detail(self, variable, axe = None, extremes=False, iqr=False):
         
         
         """
         """
             Genere des ligne d'analyse d'un tableau détaillé pour une variable
             Genere des ligne d'analyse d'un tableau détaillé pour une variable
             Input :
             Input :
                 variable : nom de la variable
                 variable : nom de la variable
                 axe : axe sur lesquels générer les ligne
                 axe : axe sur lesquels générer les ligne
+                iqr, boolean: Si true, intègle les intervalles interquartiles
+                extremes, boolean: Si true, intègle les valeurs extrêmes
         """        
         """        
     
     
         lignes = []
         lignes = []
@@ -426,8 +445,25 @@ class genererTableau ():
                 ligne.append(self._generer_str_valeur(self.data[variable]["global"]["mean"])) # Moyenne
                 ligne.append(self._generer_str_valeur(self.data[variable]["global"]["mean"])) # Moyenne
                 ligne.append(self._generer_str_valeur(self.data[variable]["global"]["std"])) # Ecart type
                 ligne.append(self._generer_str_valeur(self.data[variable]["global"]["std"])) # Ecart type
                 ligne.append(self._generer_str_ci(self.data[variable]["global"]["ci_95"])) # IC à 95%
                 ligne.append(self._generer_str_ci(self.data[variable]["global"]["ci_95"])) # IC à 95%
+
+                extremes_iqr = [
+                    ("min", extremes),
+                    ("Q25", iqr),
+                    ("median", iqr),
+                    ("Q75", iqr),
+                    ("max", extremes),
+                ]
+
+                for value, rule in extremes_iqr:
+                    if rule:
+                        ligne.append(
+                            self._generer_str_valeur(
+                                self.data[variable]["global"][value]
+                            )
+                        )
+
                 ligne = ligne + ["", "", ""] # Blanc technique
                 ligne = ligne + ["", "", ""] # Blanc technique
-                
+
                 lignes.append(ligne)
                 lignes.append(ligne)
             else:
             else:
                 # On vérifie l'axe
                 # On vérifie l'axe
@@ -457,7 +493,23 @@ class genererTableau ():
                     ligne.append(self._generer_str_valeur(donnees_axe[valeur_axe]["mean"])) # Moyenne
                     ligne.append(self._generer_str_valeur(donnees_axe[valeur_axe]["mean"])) # Moyenne
                     ligne.append(self._generer_str_valeur(donnees_axe[valeur_axe]["std"])) # Ecart type
                     ligne.append(self._generer_str_valeur(donnees_axe[valeur_axe]["std"])) # Ecart type
                     ligne.append(self._generer_str_ci(donnees_axe[valeur_axe]["ci_95"])) # IC à 95%
                     ligne.append(self._generer_str_ci(donnees_axe[valeur_axe]["ci_95"])) # IC à 95%
-                    
+
+                    extremes_iqr = [
+                        ("min", extremes),
+                        ("Q25", iqr),
+                        ("median", iqr),
+                        ("Q75", iqr),
+                        ("max", extremes),
+                    ]
+
+                    for value, rule in extremes_iqr:
+                        if rule:
+                            ligne.append(
+                                self._generer_str_valeur(
+                                    self.data[variable]["global"][value]
+                                )
+                            )
+
                     ligne = ligne + ["", "", ""] # Blanc technique
                     ligne = ligne + ["", "", ""] # Blanc technique
                     lignes.append(ligne)
                     lignes.append(ligne)
         else:
         else:
@@ -605,7 +657,7 @@ class genererTableau ():
         
         
         return(sortie)
         return(sortie)
     
     
-    def tableau_detail_variable (self, chemin, variable, axes = None, format_sortie = "csv"):
+    def tableau_detail_variable (self, chemin, variable, axes = None, iqr=False, extremes=False, format_sortie = "csv"):
         
         
         """
         """
             Décrit le contenu d'une variable selon un axe ou plusieurs axes donnés.
             Décrit le contenu d'une variable selon un axe ou plusieurs axes donnés.
@@ -615,6 +667,8 @@ class genererTableau ():
                 chemin : chemin du fichier de sortie
                 chemin : chemin du fichier de sortie
                 variable : nom de la variable à traiter
                 variable : nom de la variable à traiter
                 axes : liste des axes d'analyse
                 axes : liste des axes d'analyse
+                iqr, boolean: Si True, inclus les intervalles interquartiles
+                extremes, boolean: Si True, inclus les extremes (min, max)
                 format_sortie :
                 format_sortie :
                     'tsv' pour un tableau séparé par une tabulation
                     'tsv' pour un tableau séparé par une tabulation
                     'csv' pour un tableau séparé par une virgule
                     'csv' pour un tableau séparé par une virgule
@@ -633,14 +687,14 @@ class genererTableau ():
         # Récupération des donnée
         # Récupération des donnée
         
         
         # Génération de l'en-tête
         # Génération de l'en-tête
-        en_tete = self._generer_en_tete_detail(variable)
+        en_tete = self._generer_en_tete_detail(variable, extremes=extremes, iqr=iqr)
                 
                 
         # Création du tableau
         # Création du tableau
         tableau = []
         tableau = []
         tableau.append(en_tete)
         tableau.append(en_tete)
         
         
         # On génère la première ligne d'analyse
         # On génère la première ligne d'analyse
-        tableau = tableau + self._generer_lignes_detail(variable, None)
+        tableau = tableau + self._generer_lignes_detail(variable, None, extremes=extremes, iqr=iqr)
         
         
         # Ligne vide
         # Ligne vide
         tableau.append(["" for x in range(len(tableau[-1]))])
         tableau.append(["" for x in range(len(tableau[-1]))])
@@ -648,6 +702,9 @@ class genererTableau ():
         # Ajout des axes
         # Ajout des axes
         if axes is not None:
         if axes is not None:
             for axe in axes:
             for axe in axes:
-                tableau = tableau + self._generer_lignes_detail(variable, axe)
+                tableau = tableau + self._generer_lignes_detail(variable, axe, extremes=extremes, iqr=iqr)
+
+        # Generation de la sortie
+        sortie = self._generer_sortie(chemin, tableau, format_sortie)
         
         
-        return(tableau)
+        return(sortie)