diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py index 15472b593..7427089d0 100644 --- a/app/comp/bonus_spo.py +++ b/app/comp/bonus_spo.py @@ -49,6 +49,10 @@ class BonusSport: - modimpl_coefs: les coefs des modules En classique: 1d ndarray de float (modimpl) En APC: 2d ndarray de float, (modimpl x UE) <= attention à transposer + - etud_moy_gen: Series, index etudid, valeur float (moyenne générale avant bonus) + - etud_moy_ue: DataFrame columns UE (sans sport), rows etudid (moyennes avant bonus) + + etud_moy_gen et etud_moy_ue ne sont PAS modifiés (mais utilisés par certains bonus non additifs). """ # Si vrai, en APC, si le bonus UE est None, reporte le bonus moy gen: @@ -67,9 +71,13 @@ class BonusSport: ues: list, modimpl_inscr_df: pd.DataFrame, modimpl_coefs: np.array, + etud_moy_gen, + etud_moy_ue, ): self.formsemestre = formsemestre self.ues = ues + self.etud_moy_gen = etud_moy_gen + self.etud_moy_ue = etud_moy_ue self.etuds_idx = modimpl_inscr_df.index # les étudiants inscrits au semestre self.bonus_ues: pd.DataFrame = None # virtual self.bonus_moy_gen: pd.Series = None # virtual @@ -293,7 +301,7 @@ class BonusTours(BonusDirect): # ---- Un peu moins simples (mais pas trop compliqué) -# Bonus simple, mais avec chagement de paramètres en 2010 ! +# Bonus simple, mais avec changement de paramètres en 2010 ! class BonusLille(BonusSportSimples): """Calcul bonus modules optionels (sport, culture), règle IUT Villeneuve d'Ascq @@ -320,8 +328,63 @@ class BonusLille(BonusSportSimples): ) +def bonus_iut1grenoble_2017(notes_sport, coefs, infos=None): + """Calcul bonus sport IUT Grenoble sur la moyenne générale (version 2017) + + La note de sport de nos étudiants va de 0 à 5 points. + Chaque point correspond à un % qui augmente la moyenne de chaque UE et la moyenne générale. + Par exemple : note de sport 2/5 : la moyenne générale sera augmentée de 2%. + + Calcul ici du bonus sur moyenne générale + """ + # les coefs sont ignorés + # notes de 0 à 5 + points = sum([x for x in notes_sport]) + factor = (points / 4.0) / 100.0 + bonus = infos["moy"] * factor + + return bonus + + +class BonusGrenobleIUT1(BonusSport): + """ + La note de sport est sur 20, et on calcule une bonification (en %) + qui va s'appliquer à la moyenne de chaque UE du semestre en appliquant + la formule : bonification (en %) = (note-10)*0,5. + + Bonification qui ne s'applique que si la note est >10. + + (Une note de 10 donne donc 0% de bonif ; note de 20 : 5% de bonif) + + """ + + name = "bonus_grenoble_iut1_2020" + # C'est un bonus "multiplicatif": on l'exprime en additif, + # sur chaque moyenne d'UE m_0 + # m_1 = a . m_0 + # m_1 = m_0 + bonus + # bonus = m_0 (a - 1) + def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): + """calcul du bonus""" + # Calcule moyenne pondérée des notes de sport: + notes = np.sum( + sem_modimpl_moys_inscrits * modimpl_coefs_etuds_no_nan, axis=1 + ) / np.sum(modimpl_coefs_etuds_no_nan, axis=1) + notes = np.nan_to_num(notes, copy=False) + a = (notes - 10.0) * 0.005 + a[a <= 0] = 1.0 # note < 10, pas de bonus + if self.formsemestre.formation.is_apc(): + # ne s'applique qu'aux moyennes d'UE + b = self.etud_moy_ue * (a - 1) + self.bonus_ues = b # DataFrame + else: + # ne s'applique qu'à la moyenne générale + b = self.etud_moy_gen * (a - 1) + self.bonus_moy_gen = b + + class BonusVilleAvray(BonusSport): - """Calcul bonus modules optionels (sport, culture), règle IUT Ville d'Avray + """Bonus modules optionels (sport, culture), règle IUT Ville d'Avray. Les étudiants de l'IUT peuvent suivre des enseignements optionnels de l'Université Paris 10 (C2I) non rattachés à une unité d'enseignement. diff --git a/app/comp/res_but.py b/app/comp/res_but.py index 2ae263d5b..e1fcdc272 100644 --- a/app/comp/res_but.py +++ b/app/comp/res_but.py @@ -73,6 +73,8 @@ class ResultatsSemestreBUT(NotesTableCompat): self.ues, self.modimpl_inscr_df, self.modimpl_coefs_df.transpose(), + self.etud_moy_gen, + self.etud_moy_ue, ) self.bonus_ues = bonus.get_bonus_ues() if self.bonus_ues is not None: diff --git a/app/comp/res_classic.py b/app/comp/res_classic.py index 3c7428673..65c83e641 100644 --- a/app/comp/res_classic.py +++ b/app/comp/res_classic.py @@ -80,6 +80,8 @@ class ResultatsSemestreClassic(NotesTableCompat): self.ues, self.modimpl_inscr_df, self.modimpl_coefs, + self.etud_moy_gen, + self.etud_moy_ue, ) self.bonus_ues = bonus.get_bonus_ues() if self.bonus_ues is not None: