Update opolka/ScoDoc from ScoDoc/ScoDoc #2

Merged
opolka merged 1272 commits from ScoDoc/ScoDoc:master into master 2024-05-27 09:11:04 +02:00
3 changed files with 103 additions and 86 deletions
Showing only changes of commit b5125fa3d7 - Show all commits

View File

@ -108,8 +108,8 @@ class JuryPE(object):
self._gen_trajectoires() self._gen_trajectoires()
self._gen_semXs() self._gen_semXs()
self._gen_xls_sxtags(zipfile) self._gen_xls_sxtags(zipfile)
# self._gen_rcsemxs() self._gen_rcsemxs()
# self._gen_xls_rcrcss_tags(zipfile) self._gen_xls_rcstags(zipfile)
# self._gen_xls_interclassements_rcss(zipfile) # self._gen_xls_interclassements_rcss(zipfile)
# self._gen_xls_synthese_jury_par_tag(zipfile) # self._gen_xls_synthese_jury_par_tag(zipfile)
# self._gen_xls_synthese_par_etudiant(zipfile) # self._gen_xls_synthese_par_etudiant(zipfile)
@ -255,7 +255,7 @@ class JuryPE(object):
self.rcss_jury.cree_rcsemxs(self.etudiants) self.rcss_jury.cree_rcsemxs(self.etudiants)
self.rcss_jury._aff_rcsemxs_suivis(self.etudiants) self.rcss_jury._aff_rcsemxs_suivis(self.etudiants)
def _gen_xls_rcrcss_tags(self, zipfile: ZipFile): def _gen_xls_rcstags(self, zipfile: ZipFile):
"""Génère les RCS taggués traduisant les moyennes (orientées compétences) """Génère les RCS taggués traduisant les moyennes (orientées compétences)
de regroupements de semestre de type Sx, xA ou xS. de regroupements de semestre de type Sx, xA ou xS.
@ -278,8 +278,8 @@ class JuryPE(object):
pe_affichage.pe_print("*** Calcule les moyennes des RC de RCFS") pe_affichage.pe_print("*** Calcule les moyennes des RC de RCFS")
self.rcss_tags = {} self.rcss_tags = {}
for rcs_id, rcrcf in self.rcss_jury.rcsemxs.items(): for rcs_id, rcsemx in self.rcss_jury.rcsemxs.items():
self.rcss_tags[rcs_id] = RCSTag(rcrcf, self.sxtags) self.rcss_tags[rcs_id] = RCSTag(rcsemx, self.sxtags)
# Intègre le bilan des trajectoires tagguées au zip final # Intègre le bilan des trajectoires tagguées au zip final
output = io.BytesIO() output = io.BytesIO()

View File

@ -142,22 +142,25 @@ class RCSsJuryPE:
analysés (trajectoires traduisant son parcours dans les analysés (trajectoires traduisant son parcours dans les
différents semestres) + les mémorise dans les données de l'étudiant différents semestres) + les mémorise dans les données de l'étudiant
""" """
self.rcsemxs_suivis = {nom_rcs: None for nom_rcs in pe_rcs.TOUS_LES_RCS} self.rcsemxs_suivis = {}
self.rcsemxs = {} self.rcsemxs = {}
# Pour tous les étudiants du jury # Pour tous les étudiants du jury
for etudid in self.trajectoires_suivies: for etudid in self.trajectoires_suivies:
self.rcsemxs_suivis[etudid] = {} self.rcsemxs_suivis[etudid] = {
nom_rcs: None for nom_rcs in pe_rcs.TOUS_LES_RCS_AVEC_PLUSIEURS_SEM
}
# Recopie des SemX & des suivis associés # Recopie des SemX & des suivis associés => est-ce utile ?
for nom_rcs in pe_rcs.TOUS_LES_SEMESTRES: # for nom_rcs in pe_rcs.TOUS_LES_SEMESTRES:
trajectoire = self.semXs_suivis[etudid][nom_rcs] # trajectoire = self.semXs_suivis[etudid][nom_rcs]
if trajectoire: # if trajectoire:
self.rcsemxs[trajectoire.rcs_id] = trajectoire # self.rcsemxs[trajectoire.rcs_id] = trajectoire
self.rcsemxs_suivis[etudid][nom_rcs] = trajectoire # self.rcsemxs_suivis[etudid][nom_rcs] = trajectoire
# Pour chaque aggréggat de type xA ou Sx # Pour chaque aggréggat de type xA ou Sx
for nom_rcs in pe_rcs.TOUS_LES_RCS_AVEC_PLUSIEURS_SEM: tous_les_agregats = pe_rcs.TOUS_LES_RCS
for nom_rcs in tous_les_agregats:
trajectoire = self.trajectoires_suivies[etudid][nom_rcs] trajectoire = self.trajectoires_suivies[etudid][nom_rcs]
if not trajectoire: if not trajectoire:
self.rcsemxs_suivis[etudid][nom_rcs] = None self.rcsemxs_suivis[etudid][nom_rcs] = None
@ -179,16 +182,20 @@ class RCSsJuryPE:
semxs_a_aggreger = {} semxs_a_aggreger = {}
for Sx in noms_sems_aggregat: for Sx in noms_sems_aggregat:
semestres_etudiants = etudiants.cursus[etudid][Sx] semestres_etudiants = etudiants.cursus[etudid][Sx]
if not semestres_etudiants:
semx_id = get_semx_from_semestres_aggreges( pe_affichage.pe_print(
self.semXs, semestres_etudiants f"-> ⚠ Pas de semestres {Sx} pour {etudiants.identites[etudid].etat_civil}"
)
if not semx_id:
raise (
"Il manque un SemX pour créer les RCSemX dans cree_rcsemxs"
) )
# Les SemX à ajouter au RCSemX else:
semxs_a_aggreger[semx_id] = self.semXs[semx_id] semx_id = get_semx_from_semestres_aggreges(
self.semXs, semestres_etudiants
)
if not semx_id:
raise (
"Il manque un SemX pour créer les RCSemX dans cree_rcsemxs"
)
# Les SemX à ajouter au RCSemX
semxs_a_aggreger[semx_id] = self.semXs[semx_id]
# Ajout des SemX à ceux à aggréger dans le RCSemX # Ajout des SemX à ceux à aggréger dans le RCSemX
rcsemx = self.rcsemxs[tid] rcsemx = self.rcsemxs[tid]
@ -200,15 +207,16 @@ class RCSsJuryPE:
def _aff_rcsemxs_suivis(self, etudiants): def _aff_rcsemxs_suivis(self, etudiants):
"""Affiche les RCSemX suivis par les étudiants""" """Affiche les RCSemX suivis par les étudiants"""
# Affichage pour debug # Affichage pour debug
jeunes = list(enumerate(self.rcsemxs_suivis)) jeunes = list(enumerate(self.rcsemxs_suivis.keys()))
vides = [] vides = []
for no_etud, etudid in jeunes[:20]: for no_etud, etudid in jeunes:
pe_affichage.pe_print(f"-> {etudiants.identites[etudid].nomprenom} :") if etudid not in etudiants.abandons_ids:
for nom_rcs, rcs in self.rcsemxs_suivis[etudid].items(): pe_affichage.pe_print(f"-> {etudiants.identites[etudid].nomprenom} :")
if rcs: for nom_rcs, rcs in self.rcsemxs_suivis[etudid].items():
pe_affichage.pe_print(f" > RCSemX {nom_rcs}: {rcs.get_repr()}") if rcs:
else: pe_affichage.pe_print(f" > RCSemX {nom_rcs}: {rcs.get_repr()}")
vides += [f"{nom_rcs}"] else:
vides += [f"{nom_rcs}"]
pe_affichage.pe_print(f"-> ⚠ RCSemX vides : {', '.join(list(set(vides)))}") pe_affichage.pe_print(f"-> ⚠ RCSemX vides : {', '.join(list(set(vides)))}")

View File

@ -41,8 +41,7 @@ from app.models import FormSemestre
from app.pe import pe_affichage from app.pe import pe_affichage
import pandas as pd import pandas as pd
import numpy as np import numpy as np
import app.pe.rcss.pe_rcs as pe_rcs from app.pe.rcss import pe_rcs, pe_rcsemx
import app.pe.rcss.pe_rcsemx as pe_rcrcf
import app.pe.pe_sxtag as pe_sxtag import app.pe.pe_sxtag as pe_sxtag
import app.pe.pe_comp as pe_comp import app.pe.pe_comp as pe_comp
from app.pe.pe_tabletags import TableTag from app.pe.pe_tabletags import TableTag
@ -50,7 +49,9 @@ from app.pe.pe_moytag import MoyennesTag
class RCSTag(TableTag): class RCSTag(TableTag):
def __init__(self, rcrcf: pe_rcs.RCS, sxstags: dict[(str, int) : pe_sxtag.SxTag]): def __init__(
self, rcsemx: pe_rcsemx.RCSemX, sxstags: dict[(str, int) : pe_sxtag.SxTag]
):
"""Calcule les moyennes par tag (orientées compétences) """Calcule les moyennes par tag (orientées compétences)
d'un regroupement de SxTag d'un regroupement de SxTag
(RCRCF), pour extraire les classements par tag pour un (RCRCF), pour extraire les classements par tag pour un
@ -58,42 +59,43 @@ class RCSTag(TableTag):
participé au même semestre terminal. participé au même semestre terminal.
Args: Args:
rcs: Un RCS (identifié par un nom et l'id de son semestre terminal) rcsemx: Le RCSemX (identifié par un nom et l'id de son semestre terminal)
sxstags: Les données sur les RCF taggués sxstags: Les données sur les SemX taggués
""" """
TableTag.__init__(self) TableTag.__init__(self)
self.rcs_id: tuple(str, int) = rcrcf.rcs_id self.rcs_id: tuple(str, int) = rcsemx.rcs_id
"""Identifiant du RCS taggué (identique au RCS sur lequel il s'appuie)""" """Identifiant du RCSTag (identique au RCSemX sur lequel il s'appuie)"""
self.rcrcf: pe_rcrcf.RCSemX = rcrcf self.rcsemx: pe_rcsemx.RCSemX = rcsemx
"""RCRCF associé au RCS taggué""" """RCSemX associé au RCSTag"""
self.nom = self.get_repr() self.nom = self.get_repr()
"""Représentation textuelle du RCS taggué""" """Représentation textuelle du RSCtag"""
# Les données du semestre final # Les données du semestre final
self.formsemestre_terminal: FormSemestre = rcrcf.formsemestre_final self.formsemestre_final: FormSemestre = rcsemx.formsemestre_final
"""Le semestre final""" """Le semestre final"""
self.fid_final: int = rcrcf.formsemestre_final.formsemestre_id self.fid_final: int = rcsemx.formsemestre_final.formsemestre_id
"""Le fid du semestre final""" """Le fid du semestre final"""
# Affichage pour debug # Affichage pour debug
pe_affichage.pe_print(f"-> {self.get_repr(verbose=True)}") pe_affichage.pe_print(f"-> {self.get_repr(verbose=True)}")
# Les données aggrégés (RCRCF + SxTags # Les données aggrégés (RCRCF + SxTags
self.rcsemxs_aggreges = rcrcf.rcsemxs_aggreges self.semXs_aggreges: dict[(str, int) : pe_rcsemx.RCSemX] = rcsemx.semXs_aggreges
"""Les RCFs aggrégés""" """Les SemX aggrégés"""
self.sxstags = {} self.sxstags = {}
"""Les SxTag associés aux RCF aggrégés""" """Les SxTag associés aux SemX aggrégés"""
try: try:
for rcf_id in self.rcsemxs_aggreges: for rcf_id in self.semXs_aggreges:
self.sxstags[rcf_id] = sxstags[rcf_id] self.sxstags[rcf_id] = sxstags[rcf_id]
except: except:
raise ValueError("Semestres SxTag manquants") raise ValueError("Semestres SxTag manquants")
# Les étudiants (etuds, états civils & etudis) # Les étudiants (etuds, états civils & etudis)
sxtag_final = self.sxstags[self.rcs_id] sems_dans_aggregat = pe_rcs.TYPES_RCS[self.rcs_id[0]]["aggregat"]
sxtag_final = self.sxstags[(sems_dans_aggregat[-1], self.rcs_id[1])]
self.etuds = sxtag_final.etuds self.etuds = sxtag_final.etuds
"""Les étudiants (extraits du semestre final)""" """Les étudiants (extraits du semestre final)"""
self.add_etuds(self.etuds) self.add_etuds(self.etuds)
@ -106,7 +108,10 @@ class RCSTag(TableTag):
pe_affichage.pe_print( pe_affichage.pe_print(
f"* Association UEs -> compétences : {self.acronymes_ues_to_competences}" f"* Association UEs -> compétences : {self.acronymes_ues_to_competences}"
) )
self.competences_sorted = sorted(self.acronymes_ues_to_competences.values()) self.competences_sorted = sorted(
set(self.acronymes_ues_to_competences.values())
)
"""Compétences (triées par nom, extraites des SxTag aggrégés)""" """Compétences (triées par nom, extraites des SxTag aggrégés)"""
pe_affichage.pe_print(f"* Compétences : {', '.join(self.competences_sorted)}") pe_affichage.pe_print(f"* Compétences : {', '.join(self.competences_sorted)}")
@ -119,6 +124,7 @@ class RCSTag(TableTag):
self.moyennes_tags: dict[str, MoyennesTag] = {} self.moyennes_tags: dict[str, MoyennesTag] = {}
"""Synthétise les moyennes/classements par tag (qu'ils soient personnalisé ou de compétences)""" """Synthétise les moyennes/classements par tag (qu'ils soient personnalisé ou de compétences)"""
for tag in self.tags_sorted: for tag in self.tags_sorted:
print(tag)
# Cube de notes (etudids_sorted x compétences_sorted x sxstags) # Cube de notes (etudids_sorted x compétences_sorted x sxstags)
notes_df, notes_cube = self.compute_notes_comps_cube( notes_df, notes_cube = self.compute_notes_comps_cube(
tag, self.etudids_sorted, self.competences_sorted, self.sxstags tag, self.etudids_sorted, self.competences_sorted, self.sxstags
@ -153,7 +159,7 @@ class RCSTag(TableTag):
"""Renvoie une représentation textuelle (celle de la trajectoire sur laquelle elle """Renvoie une représentation textuelle (celle de la trajectoire sur laquelle elle
est basée)""" est basée)"""
if verbose: if verbose:
return self.rcrcf.get_repr(verbose=verbose) return self.rcsemx.get_repr(verbose=verbose)
else: else:
return f"{self.__class__.__name__} ({self.rcs_id})" return f"{self.__class__.__name__} ({self.rcs_id})"
@ -182,26 +188,29 @@ class RCSTag(TableTag):
np.nan, index=etudids_sorted, columns=competences_sorted np.nan, index=etudids_sorted, columns=competences_sorted
) )
# Charge les notes du semestre tag (copie car changement de nom de colonnes à venir) # Charge les notes du semestre tag (copie car changement de nom de colonnes à venir)
moys_tag = sxtag.moyennes_tags[tag] if tag in sxtag.moyennes_tags: # si le tag est présent dans le semestre
notes = moys_tag.matrice_notes.copy() # avec une copie moys_tag = sxtag.moyennes_tags[tag]
# Traduction des acronymes d'UE en compétences notes = moys_tag.matrice_notes.copy() # avec une copie
acronymes_ues_columns = notes.columns
acronymes_to_comps = [
self.acronymes_ues_to_competences[acro]
for acro in acronymes_ues_columns
]
notes.columns = acronymes_to_comps
# Les étudiants et les compétences communes # Traduction des acronymes d'UE en compétences
etudids_communs, comp_communes = pe_comp.find_index_and_columns_communs( acronymes_ues_columns = notes.columns
notes_df, notes acronymes_to_comps = [
) self.acronymes_ues_to_competences[acro]
for acro in acronymes_ues_columns
]
notes.columns = acronymes_to_comps
# Recopie des notes et des coeffs # Les étudiants et les compétences communes
notes_df.loc[etudids_communs, comp_communes] = notes.loc[ (
etudids_communs, comp_communes etudids_communs,
] comp_communes,
) = pe_comp.find_index_and_columns_communs(notes_df, notes)
# Recopie des notes et des coeffs
notes_df.loc[etudids_communs, comp_communes] = notes.loc[
etudids_communs, comp_communes
]
# Supprime tout ce qui n'est pas numérique # Supprime tout ce qui n'est pas numérique
# for col in notes_df.columns: # for col in notes_df.columns:
@ -242,29 +251,29 @@ class RCSTag(TableTag):
coeffs_df = pd.DataFrame( coeffs_df = pd.DataFrame(
np.nan, index=etudids_sorted, columns=competences_sorted np.nan, index=etudids_sorted, columns=competences_sorted
) )
if tag in sxtag.moyennes_tags:
moys_tag = sxtag.moyennes_tags[tag]
moys_tag = sxtag.moyennes_tags[tag] # Charge les notes et les coeffs du semestre tag
coeffs = moys_tag.matrice_coeffs_moy_gen.copy() # les coeffs
# Charge les notes et les coeffs du semestre tag # Traduction des acronymes d'UE en compétences
coeffs = moys_tag.matrice_coeffs_moy_gen.copy() # les coeffs acronymes_ues_columns = coeffs.columns
acronymes_to_comps = [
self.acronymes_ues_to_competences[acro]
for acro in acronymes_ues_columns
]
coeffs.columns = acronymes_to_comps
# Traduction des acronymes d'UE en compétences # Les étudiants et les compétences communes
acronymes_ues_columns = coeffs.columns etudids_communs, comp_communes = pe_comp.find_index_and_columns_communs(
acronymes_to_comps = [ coeffs_df, coeffs
self.acronymes_ues_to_competences[acro] )
for acro in acronymes_ues_columns
]
coeffs.columns = acronymes_to_comps
# Les étudiants et les compétences communes # Recopie des notes et des coeffs
etudids_communs, comp_communes = pe_comp.find_index_and_columns_communs( coeffs_df.loc[etudids_communs, comp_communes] = coeffs.loc[
coeffs_df, coeffs etudids_communs, comp_communes
) ]
# Recopie des notes et des coeffs
coeffs_df.loc[etudids_communs, comp_communes] = coeffs.loc[
etudids_communs, comp_communes
]
# Stocke les dfs # Stocke les dfs
coeffs_dfs[sxtag_id] = coeffs_df coeffs_dfs[sxtag_id] = coeffs_df