PE: n'affiche plus les note manquantes comme NaN

This commit is contained in:
Emmanuel Viennet 2022-03-17 15:33:33 +01:00
parent 87af662c65
commit 69725ea386
2 changed files with 31 additions and 23 deletions

View File

@ -194,12 +194,14 @@ class SemestreTag(pe_tagtable.TableTag):
return tagdict
# -----------------------------------------------------------------------------
def comp_MoyennesTag(self, tag, force=False):
"""Calcule et renvoie les "moyennes" de tous les étudiants du SemTag (non défaillants)
à un tag donné, en prenant en compte
def comp_MoyennesTag(self, tag, force=False) -> list:
"""Calcule et renvoie les "moyennes" de tous les étudiants du SemTag
(non défaillants) à un tag donné, en prenant en compte
tous les modimpl_id concerné par le tag, leur coeff et leur pondération.
Force ou non le calcul de la moyenne lorsque des notes sont manquantes.
Renvoie les informations sous la forme d'une liste [ (moy, somme_coeff_normalise, etudid), ...]
Renvoie les informations sous la forme d'une liste
[ (moy, somme_coeff_normalise, etudid), ...]
"""
lesMoyennes = []
for etudid in self.get_etudids():

View File

@ -38,6 +38,7 @@ Created on Thu Sep 8 09:36:33 2016
"""
import datetime
import numpy as np
from app.scodoc import notes_table
@ -287,47 +288,52 @@ class TableTag(object):
# *********************************************
def moyenne_ponderee_terme_a_terme(notes, coeffs=None, force=False):
def moyenne_ponderee_terme_a_terme(notes, coefs=None, force=False):
"""
Calcule la moyenne pondérée d'une liste de notes avec d'éventuels coeffs de pondération.
Renvoie le résultat sous forme d'un tuple (moy, somme_coeff)
La liste de notes contient soit : 1) des valeurs numériques 2) des strings "-NA-" (pas de notes) ou "-NI-" (pas inscrit)
ou "-c-" ue capitalisée, 3) None.
La liste de notes contient soit :
1) des valeurs numériques
2) des strings "-NA-" (pas de notes) ou "-NI-" (pas inscrit) ou "-c-" ue capitalisée,
3) None.
Le paramètre force indique si le calcul de la moyenne doit être forcée ou non, c'est à
dire s'il y a ou non omission des notes non numériques (auquel cas la moyenne est calculée sur les
notes disponibles) ; sinon renvoie (None, None).
dire s'il y a ou non omission des notes non numériques (auquel cas la moyenne est
calculée sur les notes disponibles) ; sinon renvoie (None, None).
"""
# Vérification des paramètres d'entrée
if not isinstance(notes, list) or (
coeffs != None and not isinstance(coeffs, list) and len(coeffs) != len(notes)
coefs != None and not isinstance(coefs, list) and len(coefs) != len(notes)
):
raise ValueError("Erreur de paramètres dans moyenne_ponderee_terme_a_terme")
# Récupération des valeurs des paramètres d'entrée
coeffs = [1] * len(notes) if coeffs == None else coeffs
coefs = [1] * len(notes) if coefs is None else coefs
# S'il n'y a pas de notes
if not notes: # Si notes = []
return (None, None)
notesValides = [
(1 if isinstance(note, float) or isinstance(note, int) else 0) for note in notes
] # Liste indiquant les notes valides
if force == True or (
force == False and sum(notesValides) == len(notes)
): # Si on force le calcul de la moyenne ou qu'on ne le force pas et qu'on a le bon nombre de notes
(moyenne, ponderation) = (0.0, 0.0)
# Liste indiquant les notes valides
notes_valides = [
(isinstance(note, float) and not np.isnan(note)) or isinstance(note, int)
for note in notes
]
# Si on force le calcul de la moyenne ou qu'on ne le force pas
# et qu'on a le bon nombre de notes
if force or sum(notes_valides) == len(notes):
moyenne, ponderation = 0.0, 0.0
for i in range(len(notes)):
if notesValides[i]:
moyenne += coeffs[i] * notes[i]
ponderation += coeffs[i]
if notes_valides[i]:
moyenne += coefs[i] * notes[i]
ponderation += coefs[i]
return (
(moyenne / (ponderation * 1.0), ponderation)
if ponderation != 0
else (None, 0)
)
else: # Si on ne force pas le calcul de la moyenne
# Si on ne force pas le calcul de la moyenne
return (None, None)