From 7f164b1e1f42661d915c50bec700e89dc3259193 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Wed, 16 Feb 2022 00:43:22 +0100 Subject: [PATCH] Bonus Annecy --- app/comp/bonus_spo.py | 53 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py index 26bd460dd..098bd1286 100644 --- a/app/comp/bonus_spo.py +++ b/app/comp/bonus_spo.py @@ -13,6 +13,7 @@ Les classes de Bonus fournissent deux méthodes: """ import datetime +import math import numpy as np import pandas as pd @@ -106,6 +107,8 @@ class BonusSport: # sem_modimpl_moys_spo est (nb_etuds, nb_mod_sport) # ou (nb_etuds, nb_mod_sport, nb_ues_non_bonus) nb_etuds, nb_mod_sport = sem_modimpl_moys_spo.shape[:2] + if nb_etuds == 0 or nb_mod_sport == 0: + return # no bonus at all # Enlève les NaN du numérateur: sem_modimpl_moys_no_nan = np.nan_to_num(sem_modimpl_moys_spo, nan=0.0) @@ -157,7 +160,8 @@ class BonusSport: """Calcul des bonus: méthode virtuelle à écraser. Arguments: - sem_modimpl_moys_inscrits: - ndarray (nb_etuds, mod_sport) ou en APC (nb_etuds, mods_sport, nb_ue_non_bonus) + ndarray (nb_etuds, mod_sport) + ou en APC (nb_etuds, mods_sport, nb_ue_non_bonus) les notes aux modules sports auxquel l'étudiant est inscrit, 0 sinon. Pas de nans. - modimpl_coefs_etuds_no_nan: les coefficients: float ndarray @@ -236,10 +240,6 @@ class BonusSportAdditif(BonusSport): bonus_moy_arr, index=self.etuds_idx, dtype=float ) - # if len(bonus_moy_arr.shape) > 1: - # bonus_moy_arr = bonus_moy_arr.sum(axis=1) - # Laisse bonus_moy_gen à None, en APC le bonus moy. gen. sera réparti sur les UEs. - class BonusSportMultiplicatif(BonusSport): """Bonus sport qui multiplie les moyennes d'UE par un facteur""" @@ -294,6 +294,49 @@ class BonusDirect(BonusSportAdditif): proportion_point = 1.0 +class BonusAnnecy(BonusSport): + """Calcul bonus modules optionnels (sport), règle IUT d'Annecy. + Il peut y avoir plusieurs modules de bonus. + Prend pour chaque étudiant la meilleure de ses notes bonus et + ajoute à chaque UE : + 0.05 point si >=10, + 0.1 point si >=12, + 0.15 point si >=14, + 0.2 point si >=16, + 0.25 point si >=18. + """ + + name = "bonus_iut_annecy" + displayed_name = "IUT d'Annecy" + + def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): + """calcul du bonus""" + # if math.prod(sem_modimpl_moys_inscrits.shape) == 0: + # return # no etuds or no mod sport + # Prend la note de chaque modimpl, sans considération d'UE + if len(sem_modimpl_moys_inscrits.shape) > 2: # apc + sem_modimpl_moys_inscrits = sem_modimpl_moys_inscrits[:, :, 0] + # ici sem_modimpl_moys_inscrits est nb_etuds x nb_mods_bonus, en APC et en classic + note_bonus_max = np.max(sem_modimpl_moys_inscrits, axis=1) # 1d, nb_etuds + bonus = np.zeros(note_bonus_max.shape) + bonus[note_bonus_max >= 18.0] = 0.25 + bonus[note_bonus_max >= 16.0] = 0.20 + bonus[note_bonus_max >= 14.0] = 0.15 + bonus[note_bonus_max >= 12.0] = 0.10 + bonus[note_bonus_max >= 10.0] = 0.05 + + # Bonus moyenne générale et sur les UE + self.bonus_moy_gen = pd.Series(bonus, index=self.etuds_idx, dtype=float) + ues_idx = [ue.id for ue in self.formsemestre.query_ues(with_sport=False)] + nb_ues_no_bonus = len(ues_idx) + self.bonus_ues = pd.DataFrame( + np.stack([bonus] * nb_ues_no_bonus, axis=1), + columns=ues_idx, + index=self.etuds_idx, + dtype=float, + ) + + class BonusBethune(BonusSportMultiplicatif): """Calcul bonus modules optionnels (sport), règle IUT de Béthune.