#!/usr/bin/env python # encoding: utf-8 import pandas as pd import numpy as np class Student(object): """ Informations on a student which can be use inside template. Those informations should not be modify or use for compute analysis otherwise they won't be spread over other POV. """ def __init__(self, quest_df, exo_df, eval_df): """ Description of a student from quest, exo and eval """ name = {*quest_df["Eleve"].unique(), *exo_df["Eleve"].unique(), *eval_df["Eleve"].unique(), } if len(name) != 1: raise ValueError("Can't initiate Student: dfs contains different student names") self.name = name.pop() evalname = {*quest_df["Nom"].unique(), *exo_df["Nom"].unique(), *eval_df["Nom"].unique(), } if len(evalname) != 1: raise ValueError("Can't initiate Student: dfs contains different evaluation names") self.quest_df = quest_df self.exo_df = exo_df self.eval = eval_df.to_dict('records')[0] @property def latex_exo_tabulars(self): """ Return list of latex tabulars. One by exercise of the evaluation """ try: self._latex_exo_tabulars except AttributeError: self._latex_exo_tabulars = self.build_latex_exo_tabulars() return self._latex_exo_tabulars def build_latex_exo_tabulars(self): tabulars = [] for t in self.exo_df["Exercice"]: tabulars.append(self.build_latex_exo_tabular(t)) return tabulars def build_latex_exo_tabular(self, exo_name): exo = self.exo_df[self.exo_df["Exercice"] == exo_name] quest = self.quest_df[self.quest_df["Exercice"] == exo_name] tabular = [r"\begin{tabular}{|p{2cm}|c|}"] tabular.append(r"\hline") if type(exo_name) == int: tabular.append(f"Exercice {exo_name} & {exo['Mark_barem'].all()} \\\\") else: tabular.append(f"{exo_name} & {exo['Mark_barem'].all()} \\\\") tabular.append(r"\hline") if len(quest) > 1: for _, q in quest.iterrows(): line = "" if not pd.isnull(q["Question"]): line += str(q['Question']) if not pd.isnull(q["Commentaire"]): line += str(q['Commentaire']) line += " & " if q["Niveau"] == 1: line += q['Latex_rep'] else: line += str(q['Mark']) tabular.append(line) tabular.append(r"\hline") tabular.append(r"\end{tabular}") return '\n'.join(tabular) class Classe(object): """ Informations on a class which can be use inside template. Those informations should not be modify or use for compute analysis otherwise they won't be spread over other POV. """ pass # TODO: à factoriser Il y a la même dans term.py |jeu. mars 23 19:36:28 EAT 2017 def select(quest_df, exo_df, eval_df, index, value): """ Return quest, exo and eval rows which correspond index == value :param quest_df: TODO :param exo_df: TODO :param eval_df: TODO """ qu = quest_df[quest_df[index] == value] exo = exo_df[exo_df[index] == value] ev = eval_df[eval_df[index] == value] return qu, exo, ev def select_contains(quest_df, exo_df, eval_df, index, name_part): """ Return quest, exo and eval rows which contains name_part :param quest_df: TODO :param exo_df: TODO :param eval_df: TODO """ qu = quest_df[quest_df[index].str.contains(name_part)] exo = exo_df[exo_df[index].str.contains(name_part)] ev = eval_df[eval_df[index].str.contains(name_part)] return qu, exo, ev def students_pov(quest_df, exo_df, eval_df): es = [] for e in eval_df["Eleve"].unique(): d = select(quest_df, exo_df, eval_df, "Eleve", e) eleve = Student(*d) es.append(eleve) return es def class_pov(quest_df, exo_df, eval_df): return Classe(quest_df, exo_df, eval_df) # ----------------------------- # Reglages pour 'vim' # vim:set autoindent expandtab tabstop=4 shiftwidth=4: # cursor: 16 del