2024-02-08 22:09:11 +01:00
|
|
|
##############################################################################
|
|
|
|
#
|
|
|
|
# Gestion scolarite IUT
|
|
|
|
#
|
|
|
|
# Copyright (c) 1999 - 2024 Emmanuel Viennet. All rights reserved.
|
|
|
|
#
|
|
|
|
# This program is free software; you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program; if not, write to the Free Software
|
|
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
#
|
|
|
|
# Emmanuel Viennet emmanuel.viennet@viennet.net
|
|
|
|
#
|
|
|
|
##############################################################################
|
|
|
|
|
|
|
|
##############################################################################
|
|
|
|
# Module "Avis de poursuite d'étude"
|
|
|
|
# conçu et développé par Cléo Baras (IUT de Grenoble)
|
|
|
|
##############################################################################
|
|
|
|
|
|
|
|
"""
|
|
|
|
Created on Thu Sep 8 09:36:33 2016
|
|
|
|
|
|
|
|
@author: barasc
|
|
|
|
"""
|
|
|
|
|
|
|
|
import pandas as pd
|
|
|
|
import numpy as np
|
|
|
|
|
2024-02-03 10:46:14 +01:00
|
|
|
from app.pe.pe_tabletags import TableTag, MoyenneTag
|
2024-01-24 15:37:50 +01:00
|
|
|
from app.pe.pe_etudiant import EtudiantsJuryPE
|
2024-02-05 12:58:09 +01:00
|
|
|
from app.pe.pe_rcs import RCS, RCSsJuryPE
|
2024-02-05 19:46:16 +01:00
|
|
|
from app.pe.pe_rcstag import RCSTag
|
2024-01-27 08:22:36 +01:00
|
|
|
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-02-08 22:09:11 +01:00
|
|
|
class RCSInterclasseTag(TableTag):
|
|
|
|
"""
|
|
|
|
Interclasse l'ensemble des étudiants diplômés à une année
|
|
|
|
donnée (celle du jury), pour un RCS donné (par ex: 'S2', '3S')
|
|
|
|
en reportant :
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-02-08 22:09:11 +01:00
|
|
|
* 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
|
|
|
|
formsemestre)
|
|
|
|
* calculant le classement sur les étudiants diplômes
|
|
|
|
"""
|
2024-01-24 15:37:50 +01:00
|
|
|
|
|
|
|
def __init__(
|
|
|
|
self,
|
2024-02-05 19:46:16 +01:00
|
|
|
nom_rcs: str,
|
2024-01-24 15:37:50 +01:00
|
|
|
etudiants: EtudiantsJuryPE,
|
2024-02-05 19:46:16 +01:00
|
|
|
rcss_jury_pe: RCSsJuryPE,
|
|
|
|
rcss_tags: dict[tuple, RCSTag],
|
2024-01-24 15:37:50 +01:00
|
|
|
):
|
2024-01-27 09:15:17 +01:00
|
|
|
TableTag.__init__(self)
|
|
|
|
|
2024-02-05 19:46:16 +01:00
|
|
|
self.nom_rcs = nom_rcs
|
|
|
|
"""Le nom du RCS interclassé"""
|
2024-02-03 10:46:14 +01:00
|
|
|
|
2024-01-27 09:15:17 +01:00
|
|
|
self.nom = self.get_repr()
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-02-05 19:46:16 +01:00
|
|
|
"""Les étudiants diplômés et leurs rcss""" # TODO
|
2024-01-24 19:37:45 +01:00
|
|
|
self.diplomes_ids = etudiants.etudiants_diplomes
|
2024-01-24 15:37:50 +01:00
|
|
|
self.etudiants_diplomes = {etudid for etudid in self.diplomes_ids}
|
2024-01-27 09:15:17 +01:00
|
|
|
# pour les exports sous forme de dataFrame
|
2024-02-03 10:46:14 +01:00
|
|
|
self.etudiants = {
|
|
|
|
etudid: etudiants.identites[etudid].etat_civil
|
|
|
|
for etudid in self.diplomes_ids
|
|
|
|
}
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-02-08 22:09:11 +01:00
|
|
|
# Les trajectoires (et leur version tagguées), en ne gardant que
|
|
|
|
# celles associées à l'aggrégat
|
2024-02-05 19:46:16 +01:00
|
|
|
self.rcss: dict[int, RCS] = {}
|
2024-02-03 10:46:14 +01:00
|
|
|
"""Ensemble des trajectoires associées à l'aggrégat"""
|
2024-02-05 19:46:16 +01:00
|
|
|
for trajectoire_id in rcss_jury_pe.rcss:
|
|
|
|
trajectoire = rcss_jury_pe.rcss[trajectoire_id]
|
|
|
|
if trajectoire_id[0] == nom_rcs:
|
|
|
|
self.rcss[trajectoire_id] = trajectoire
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-02-05 12:58:09 +01:00
|
|
|
self.trajectoires_taggues: dict[int, RCS] = {}
|
2024-02-03 10:46:14 +01:00
|
|
|
"""Ensemble des trajectoires tagguées associées à l'aggrégat"""
|
2024-02-05 19:46:16 +01:00
|
|
|
for trajectoire_id in self.rcss:
|
2024-02-08 22:09:11 +01:00
|
|
|
self.trajectoires_taggues[trajectoire_id] = rcss_tags[trajectoire_id]
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Les trajectoires suivies par les étudiants du jury, en ne gardant que
|
|
|
|
# celles associées aux diplomés
|
2024-02-05 12:58:09 +01:00
|
|
|
self.suivi: dict[int, RCS] = {}
|
2024-02-03 10:46:14 +01:00
|
|
|
"""Association entre chaque étudiant et la trajectoire tagguée à prendre en
|
|
|
|
compte pour l'aggrégat"""
|
2024-01-24 15:37:50 +01:00
|
|
|
for etudid in self.diplomes_ids:
|
2024-02-05 19:46:16 +01:00
|
|
|
self.suivi[etudid] = rcss_jury_pe.suivi[etudid][nom_rcs]
|
2024-01-24 15:37:50 +01:00
|
|
|
|
|
|
|
self.tags_sorted = self.do_taglist()
|
2024-02-02 17:16:07 +01:00
|
|
|
"""Liste des tags (triés par ordre alphabétique)"""
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Construit la matrice de notes
|
2024-01-24 15:37:50 +01:00
|
|
|
self.notes = self.compute_notes_matrice()
|
2024-02-03 10:46:14 +01:00
|
|
|
"""Matrice des notes de l'aggrégat"""
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Synthétise les moyennes/classements par tag
|
2024-02-03 10:46:14 +01:00
|
|
|
self.moyennes_tags: dict[str, MoyenneTag] = {}
|
2024-01-24 15:37:50 +01:00
|
|
|
for tag in self.tags_sorted:
|
|
|
|
moy_gen_tag = self.notes[tag]
|
2024-02-03 10:46:14 +01:00
|
|
|
self.moyennes_tags[tag] = MoyenneTag(tag, moy_gen_tag)
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-01-27 09:15:17 +01:00
|
|
|
# Est significatif ? (aka a-t-il des tags et des notes)
|
|
|
|
self.significatif = len(self.tags_sorted) > 0
|
|
|
|
|
2024-01-24 19:37:45 +01:00
|
|
|
def get_repr(self) -> str:
|
|
|
|
"""Une représentation textuelle"""
|
2024-02-05 19:46:16 +01:00
|
|
|
return f"Aggrégat {self.nom_rcs}"
|
2024-01-24 19:37:45 +01:00
|
|
|
|
2024-01-24 15:37:50 +01:00
|
|
|
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 = []
|
2024-01-25 21:54:22 +01:00
|
|
|
for trajectoire in self.trajectoires_taggues.values():
|
2024-01-24 15:37:50 +01:00
|
|
|
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).
|
|
|
|
"""
|
2024-01-25 21:54:22 +01:00
|
|
|
# nb_tags = len(self.tags_sorted) unused ?
|
|
|
|
# nb_etudiants = len(self.diplomes_ids)
|
2024-01-24 15:37:50 +01:00
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Index de la matrice (etudids -> dim 0, tags -> dim 1)
|
2024-01-24 19:37:45 +01:00
|
|
|
etudids = list(self.diplomes_ids)
|
2024-01-24 15:37:50 +01:00
|
|
|
tags = self.tags_sorted
|
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Partant d'un dataframe vierge
|
2024-01-24 15:37:50 +01:00
|
|
|
df = pd.DataFrame(np.nan, index=etudids, columns=tags)
|
|
|
|
|
2024-01-25 22:07:24 +01:00
|
|
|
for trajectoire in self.trajectoires_taggues.values():
|
2024-01-25 21:54:22 +01:00
|
|
|
# Charge les moyennes par tag de la trajectoire tagguée
|
2024-01-25 22:07:24 +01:00
|
|
|
notes = trajectoire.notes
|
2024-01-25 21:54:22 +01:00
|
|
|
# Etudiants/Tags communs entre la trajectoire_tagguée et les données interclassées
|
2024-01-24 15:37:50 +01:00
|
|
|
etudids_communs = df.index.intersection(notes.index)
|
|
|
|
tags_communs = df.columns.intersection(notes.columns)
|
|
|
|
|
2024-01-25 21:54:22 +01:00
|
|
|
# Injecte les notes par tag
|
2024-01-24 15:37:50 +01:00
|
|
|
df.loc[etudids_communs, tags_communs] = notes.loc[
|
|
|
|
etudids_communs, tags_communs
|
|
|
|
]
|
|
|
|
|
|
|
|
return df
|