2021-12-26 19:15:47 +01:00
|
|
|
##############################################################################
|
|
|
|
# ScoDoc
|
2023-01-02 13:16:27 +01:00
|
|
|
# Copyright (c) 1999 - 2023 Emmanuel Viennet. All rights reserved.
|
2021-12-26 19:15:47 +01:00
|
|
|
# See LICENSE
|
|
|
|
##############################################################################
|
|
|
|
|
|
|
|
"""Quelques classes auxiliaires pour les calculs des notes
|
|
|
|
"""
|
|
|
|
|
2022-01-08 18:06:00 +01:00
|
|
|
import numpy as np
|
|
|
|
|
2021-12-26 19:15:47 +01:00
|
|
|
|
|
|
|
class StatsMoyenne:
|
|
|
|
"""Une moyenne d'un ensemble étudiants sur quelque chose
|
|
|
|
(moyenne générale d'un semestre, d'un module, d'un groupe...)
|
|
|
|
et les statistiques associées: min, max, moy, effectif
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, vals):
|
|
|
|
"""Calcul les statistiques.
|
|
|
|
Les valeurs NAN ou non numériques sont toujours enlevées.
|
2022-01-25 10:45:13 +01:00
|
|
|
Si vals is None, renvoie des zéros (utilisé pour UE bonus)
|
2021-12-26 19:15:47 +01:00
|
|
|
"""
|
2022-02-11 10:30:24 +01:00
|
|
|
try:
|
|
|
|
if vals is None or len(vals) == 0 or np.isnan(vals).all():
|
|
|
|
self.moy = self.min = self.max = self.size = self.nb_vals = 0
|
|
|
|
else:
|
|
|
|
self.moy = np.nanmean(vals)
|
|
|
|
self.min = np.nanmin(vals)
|
|
|
|
self.max = np.nanmax(vals)
|
|
|
|
self.size = len(vals)
|
|
|
|
self.nb_vals = self.size - np.count_nonzero(np.isnan(vals))
|
|
|
|
except TypeError: # que des NaN dans un array d'objets, ou ce genre de choses exotiques...
|
2022-01-25 10:45:13 +01:00
|
|
|
self.moy = self.min = self.max = self.size = self.nb_vals = 0
|
2021-12-26 19:15:47 +01:00
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
"Tous les attributs dans un dict"
|
|
|
|
return {
|
|
|
|
"min": self.min,
|
|
|
|
"max": self.max,
|
|
|
|
"moy": self.moy,
|
|
|
|
"size": self.size,
|
|
|
|
"nb_vals": self.nb_vals,
|
|
|
|
}
|