forked from ScoDoc/ScoDoc
125 lines
4.7 KiB
Python
125 lines
4.7 KiB
Python
from app.comp import moy_sem
|
|
from app.pe.pe_tabletags import TableTag
|
|
from app.pe.pe_etudiant import EtudiantsJuryPE
|
|
from app.pe.pe_trajectoire import Trajectoire, TrajectoiresJuryPE
|
|
from app.pe.pe_trajectoiretag import TrajectoireTag
|
|
|
|
|
|
import pandas as pd
|
|
import numpy as np
|
|
|
|
|
|
class AggregatInterclasseTag(TableTag):
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def __init__(
|
|
self,
|
|
nom_aggregat: str,
|
|
etudiants: EtudiantsJuryPE,
|
|
trajectoires_jury_pe: TrajectoiresJuryPE,
|
|
trajectoires_taggues: dict[tuple, TrajectoireTag],
|
|
):
|
|
"""
|
|
Interclasse l'ensemble des étudiants diplômés à une année
|
|
donnée (celle du jury), pour un aggrégat donné (par ex: 'S2', '3S')
|
|
en reportant :
|
|
|
|
* les moyennes obtenues sur la trajectoire qu'il ont suivi pour atteindre le numéro de semestre de fin de l'aggrégat (indépendamment de son
|
|
formsemestres)
|
|
* calculant le classement sur les étudiants diplômes
|
|
"""
|
|
TableTag.__init__(self)
|
|
|
|
# Le nom
|
|
self.aggregat = nom_aggregat
|
|
self.nom = self.get_repr()
|
|
|
|
"""Les étudiants diplômés et leurs trajectoires (cf. trajectoires.suivis)""" # TODO
|
|
self.diplomes_ids = etudiants.etudiants_diplomes
|
|
self.etudiants_diplomes = {etudid for etudid in self.diplomes_ids}
|
|
# pour les exports sous forme de dataFrame
|
|
self.etudiants = {etudid: etudiants.identites[etudid].etat_civil for etudid in self.diplomes_ids}
|
|
|
|
# Les trajectoires (et leur version tagguées), en ne gardant que celles associées à l'aggrégat
|
|
self.trajectoires: dict[int, Trajectoire] = {}
|
|
for trajectoire_id in trajectoires_jury_pe.trajectoires:
|
|
trajectoire = trajectoires_jury_pe.trajectoires[trajectoire_id]
|
|
if trajectoire_id[0] == nom_aggregat:
|
|
self.trajectoires[trajectoire_id] = trajectoire
|
|
|
|
self.trajectoires_taggues: dict[int, Trajectoire] = {}
|
|
for trajectoire_id in self.trajectoires:
|
|
self.trajectoires_taggues[trajectoire_id] = trajectoires_taggues[
|
|
trajectoire_id
|
|
]
|
|
|
|
# Les trajectoires suivies par les étudiants du jury, en ne gardant que
|
|
# celles associées aux diplomés
|
|
self.suivi: dict[int, Trajectoire] = {}
|
|
for etudid in self.diplomes_ids:
|
|
self.suivi[etudid] = trajectoires_jury_pe.suivi[etudid][nom_aggregat]
|
|
|
|
|
|
self.tags_sorted = self.do_taglist()
|
|
"""Liste des tags (triés par ordre alphabétique)"""
|
|
|
|
# Construit la matrice de notes
|
|
self.notes = self.compute_notes_matrice()
|
|
|
|
# Synthétise les moyennes/classements par tag
|
|
self.moyennes_tags = {}
|
|
for tag in self.tags_sorted:
|
|
moy_gen_tag = self.notes[tag]
|
|
self.moyennes_tags[tag] = self.comp_moy_et_stat(moy_gen_tag)
|
|
|
|
# Est significatif ? (aka a-t-il des tags et des notes)
|
|
self.significatif = len(self.tags_sorted) > 0
|
|
|
|
|
|
def get_repr(self) -> str:
|
|
"""Une représentation textuelle"""
|
|
return f"Aggrégat {self.aggregat}"
|
|
|
|
def do_taglist(self):
|
|
"""Synthétise les tags à partir des trajectoires_tagguées
|
|
|
|
Returns:
|
|
Une liste de tags triés par ordre alphabétique
|
|
"""
|
|
tags = []
|
|
for trajectoire in self.trajectoires_taggues.values():
|
|
tags.extend(trajectoire.tags_sorted)
|
|
return sorted(set(tags))
|
|
|
|
def compute_notes_matrice(self):
|
|
"""Construit la matrice de notes (etudid x tags)
|
|
retraçant les moyennes obtenues par les étudiants dans les semestres associés à
|
|
l'aggrégat (une trajectoire ayant pour numéro de semestre final, celui de l'aggrégat).
|
|
"""
|
|
# nb_tags = len(self.tags_sorted) unused ?
|
|
# nb_etudiants = len(self.diplomes_ids)
|
|
|
|
# Index de la matrice (etudids -> dim 0, tags -> dim 1)
|
|
etudids = list(self.diplomes_ids)
|
|
tags = self.tags_sorted
|
|
|
|
# Partant d'un dataframe vierge
|
|
df = pd.DataFrame(np.nan, index=etudids, columns=tags)
|
|
|
|
for trajectoire in self.trajectoires_taggues.values():
|
|
# Charge les moyennes par tag de la trajectoire tagguée
|
|
notes = trajectoire.notes
|
|
# Etudiants/Tags communs entre la trajectoire_tagguée et les données interclassées
|
|
etudids_communs = df.index.intersection(notes.index)
|
|
tags_communs = df.columns.intersection(notes.columns)
|
|
|
|
# Injecte les notes par tag
|
|
df.loc[etudids_communs, tags_communs] = notes.loc[
|
|
etudids_communs, tags_communs
|
|
]
|
|
|
|
# Force les nan
|
|
df.fillna(np.nan)
|
|
|
|
return df
|