Corrige les semestres pris en compte pour le calcul des moyennes d'aggrégat (bug QLIO UPHF)

This commit is contained in:
Cléo Baras 2024-01-27 07:24:52 +01:00
parent 787e514dca
commit 3550e4290a
3 changed files with 50 additions and 36 deletions

View File

@ -259,10 +259,17 @@ class EtudiantsJuryPE:
} # les semestres de n°i de l'étudiant } # les semestres de n°i de l'étudiant
self.cursus[etudid][nom_sem] = semestres_i self.cursus[etudid][nom_sem] = semestres_i
def get_trajectoire(self, etudid: int, formsemestre_final: FormSemestre): def get_trajectoire(self, etudid: int, formsemestre_final: FormSemestre, nom_aggregat: str):
"""Ensemble des semestres parcourus par """Ensemble des semestres parcourus par
un étudiant pour l'amener à un semestre terminal. un étudiant pour l'amener à un semestre terminal.
Si nom_aggregat est de type "Si", limite les semestres à ceux de numéro i.
Par ex: si formsemestre_terminal est un S3 et nom_agrregat "S3", ne prend en compte que les
semestres 3.
Si nom_aggregat est de type "iA" ou "iS" (incluant plusieurs numéros de semestres), prend en
compte les dit numéros de semestres.
Par ex: si formsemestre_terminal est un S3, ensemble des S1, Par ex: si formsemestre_terminal est un S3, ensemble des S1,
S2, S3 suivi pour l'amener au S3 (il peut y avoir plusieurs S1, S2, S3 suivi pour l'amener au S3 (il peut y avoir plusieurs S1,
ou S2, ou S3 s'il a redoublé). ou S2, ou S3 s'il a redoublé).
@ -277,12 +284,19 @@ class EtudiantsJuryPE:
numero_semestre_terminal = formsemestre_final.semestre_id numero_semestre_terminal = formsemestre_final.semestre_id
semestres_significatifs = self.get_semestres_significatifs(etudid) semestres_significatifs = self.get_semestres_significatifs(etudid)
# Semestres de n° inférieur (pax ex: des S1, S2, S3 pour un S3 terminal) if nom_aggregat.startswith("S"): # les semestres
# et qui lui sont antérieurs numero_semestres_possibles =[numero_semestre_terminal]
elif nom_aggregat.endswith("A"): # les années
numero_semestres_possibles = [int(sem[-1]) for sem in pe_comp.PARCOURS[nom_aggregat]["aggregat"]]
assert numero_semestre_terminal in numero_semestres_possibles
else: # les xS = tous les semestres jusqu'à Sx (pax ex: des S1, S2, S3 pour un S3 terminal)
numero_semestres_possibles = list(range(1, numero_semestre_terminal+1))
semestres_aggreges = {} semestres_aggreges = {}
for fid, semestre in semestres_significatifs.items(): for fid, semestre in semestres_significatifs.items():
# Semestres parmi ceux de n° possibles & qui lui sont antérieurs
if ( if (
semestre.semestre_id <= numero_semestre_terminal semestre.semestre_id in numero_semestres_possibles
and semestre.date_fin <= formsemestre_final.date_fin and semestre.date_fin <= formsemestre_final.date_fin
): ):
semestres_aggreges[fid] = semestre semestres_aggreges[fid] = semestre

View File

@ -318,29 +318,35 @@ class JuryPE(object):
} }
for aggregat in aggregats: for aggregat in aggregats:
"""La trajectoire de l'étudiant sur l'aggrégat""" # La trajectoire de l'étudiant sur l'aggrégat
trajectoire = self.trajectoires.suivi[etudid][aggregat] trajectoire = self.trajectoires.suivi[etudid][aggregat]
"""Les moyennes par tag de cette trajectoire"""
# Les moyennes par tag de cette trajectoire
donnees[etudid] |= {
f"{aggregat} notes ": "-",
f"{aggregat} class. (groupe)": "-",
f"{aggregat} min/moy/max (groupe)": "-",
}
if trajectoire: if trajectoire:
trajectoire_tagguee = self.trajectoires_tagguees[ trajectoire_tagguee = self.trajectoires_tagguees[
trajectoire.trajectoire_id trajectoire.trajectoire_id
] ]
bilan = trajectoire_tagguee.moyennes_tags[tag] if tag in trajectoire_tagguee.moyennes_tags:
bilan = trajectoire_tagguee.moyennes_tags[tag]
donnees[etudid] |= {
f"{aggregat} notes ": round(bilan['notes'].loc[etudid], 2),
f"{aggregat} class. (groupe)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}",
f"{aggregat} min/moy/max (groupe)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}",
}
donnees[etudid] |= {
f"{aggregat} notes ": f"{bilan['notes'].loc[etudid]:.1f}",
f"{aggregat} class. (groupe)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}",
f"{aggregat} min/moy/max (groupe)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}",
}
else:
donnees[etudid] |= {
f"{aggregat} notes ": "-",
f"{aggregat} class. (groupe)": "-",
f"{aggregat} min/moy/max (groupe)": "-",
}
"""L'interclassement""" """L'interclassement"""
interclass = self.interclassements_taggues[aggregat] interclass = self.interclassements_taggues[aggregat]
donnees[etudid] |= {
f"{aggregat} class. (promo)": "-",
f"{aggregat} min/moy/max (promo)": "-",
}
if tag in interclass.moyennes_tags: if tag in interclass.moyennes_tags:
bilan = interclass.moyennes_tags[tag] bilan = interclass.moyennes_tags[tag]
@ -348,11 +354,6 @@ class JuryPE(object):
f"{aggregat} class. (promo)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}", f"{aggregat} class. (promo)": f"{bilan['classements'].loc[etudid]}/{bilan['nb_inscrits']}",
f"{aggregat} min/moy/max (promo)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}", f"{aggregat} min/moy/max (promo)": f"{bilan['min']:.1f}/{bilan['moy']:.1f}/{bilan['max']:.1f}",
} }
else:
donnees[etudid] |= {
f"{aggregat} class. (promo)": "-",
f"{aggregat} min/moy/max (promo)": "-",
}
# Fin de l'aggrégat # Fin de l'aggrégat
# Construction du dataFrame # Construction du dataFrame

View File

@ -36,8 +36,7 @@ class Trajectoire:
"""Les semestres à aggréger""" """Les semestres à aggréger"""
self.semestres_aggreges = {} self.semestres_aggreges = {}
def add_semestres_a_aggreger(self, semestres: dict[int:FormSemestre]):
def add_semestres_a_aggreger(self, semestres: dict[int: FormSemestre]):
"""Ajoute des semestres au semestre à aggréger """Ajoute des semestres au semestre à aggréger
Args: Args:
@ -45,8 +44,6 @@ class Trajectoire:
""" """
self.semestres_aggreges = self.semestres_aggreges | semestres self.semestres_aggreges = self.semestres_aggreges | semestres
def get_repr(self): def get_repr(self):
"""Représentation textuelle d'une trajectoire """Représentation textuelle d'une trajectoire
basée sur ses semestres aggrégés""" basée sur ses semestres aggrégés"""
@ -72,11 +69,10 @@ class TrajectoiresJuryPE:
self.annee_diplome = annee_diplome self.annee_diplome = annee_diplome
"""Toutes les trajectoires possibles""" """Toutes les trajectoires possibles"""
self.trajectoires: dict[tuple: Trajectoire] = {} self.trajectoires: dict[tuple:Trajectoire] = {}
"""Quelle trajectoires pour quel étudiant : """Quelle trajectoires pour quel étudiant :
dictionnaire {etudid: {nom_aggregat: Trajectoire}}""" dictionnaire {etudid: {nom_aggregat: Trajectoire}}"""
self.suivi: dict[int: str] = {} self.suivi: dict[int:str] = {}
def cree_trajectoires(self, etudiants: EtudiantsJuryPE): def cree_trajectoires(self, etudiants: EtudiantsJuryPE):
"""Créé toutes les trajectoires, au regard du cursus des étudiants """Créé toutes les trajectoires, au regard du cursus des étudiants
@ -84,15 +80,17 @@ class TrajectoiresJuryPE:
""" """
for nom_aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS: for nom_aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS:
"""L'aggrégat considéré (par ex: 3S=S1+S2+S3), son nom de son semestre terminal (par ex: S3) et son numéro (par ex: 3)""" """L'aggrégat considéré (par ex: 3S=S1+S2+S3), son nom de son semestre terminal (par ex: S3) et son numéro (par ex: 3)"""
noms_semestre_de_aggregat = pe_comp.PARCOURS[nom_aggregat]["aggregat"] noms_semestre_de_aggregat = pe_comp.PARCOURS[nom_aggregat]["aggregat"]
nom_semestre_terminal = noms_semestre_de_aggregat[-1] nom_semestre_terminal = noms_semestre_de_aggregat[-1]
for etudid in etudiants.cursus: for etudid in etudiants.cursus:
if etudid not in self.suivi: if etudid not in self.suivi:
self.suivi[etudid] = {aggregat: None self.suivi[etudid] = {
for aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS} aggregat: None
for aggregat in pe_comp.TOUS_LES_SEMESTRES
+ pe_comp.TOUS_LES_AGGREGATS
}
"""Le formsemestre terminal (dernier en date) associé au """Le formsemestre terminal (dernier en date) associé au
semestre marquant la fin de l'aggrégat semestre marquant la fin de l'aggrégat
@ -111,7 +109,9 @@ class TrajectoiresJuryPE:
"""La liste des semestres de l'étudiant à prendre en compte """La liste des semestres de l'étudiant à prendre en compte
pour cette trajectoire""" pour cette trajectoire"""
semestres_a_aggreger = etudiants.get_trajectoire(etudid, formsemestre_final) semestres_a_aggreger = etudiants.get_trajectoire(
etudid, formsemestre_final, nom_aggregat
)
"""Ajout des semestres à la trajectoire""" """Ajout des semestres à la trajectoire"""
trajectoire.add_semestres_a_aggreger(semestres_a_aggreger) trajectoire.add_semestres_a_aggreger(semestres_a_aggreger)
@ -138,7 +138,7 @@ def get_trajectoires_etudid(trajectoires, etudid):
liste.append(trajet.trajectoire_id) liste.append(trajet.trajectoire_id)
return liste return liste
def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int): def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int):
"""Pour un nom d'aggrégat donné (par ex: 'S3') et un semestre terminal cible """Pour un nom d'aggrégat donné (par ex: 'S3') et un semestre terminal cible
identifié par son formsemestre_id (par ex: 'S3 2022-2023'), identifié par son formsemestre_id (par ex: 'S3 2022-2023'),
@ -162,4 +162,3 @@ def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int)
formsemestres_etudiant = cursus_etudiant[formsemestre_id_terminal] formsemestres_etudiant = cursus_etudiant[formsemestre_id_terminal]
formsemestres = formsemestres | formsemestres_etudiant formsemestres = formsemestres | formsemestres_etudiant
return formsemestres return formsemestres