From 7446739301d17b637179e7023daf363e4cba4ef3 Mon Sep 17 00:00:00 2001 From: Benjamin Bertrand Date: Thu, 23 Mar 2017 19:16:22 +0300 Subject: [PATCH] Append diff between empty and na. Add warning if note > bareme --- notes_tools/tools/df_marks_manip.py | 17 ++++++++++++----- samples/312.xlsx | Bin 13935 -> 14469 bytes 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/notes_tools/tools/df_marks_manip.py b/notes_tools/tools/df_marks_manip.py index eb3b193..7dac37c 100644 --- a/notes_tools/tools/df_marks_manip.py +++ b/notes_tools/tools/df_marks_manip.py @@ -7,6 +7,9 @@ from math import ceil, floor import logging logger = logging.getLogger(__name__) +NOANSWER = "na" +NORATED = "" + # Values manipulations def round_half_point(val): @@ -49,7 +52,7 @@ def note_to_rep(x): '\\RepU' """ if x["Niveau"]: - if pd.isnull(x["Note"]): + if x["Note"] == NOANSWER: return latex_caract[0] elif x["Note"] in range(4): return latex_caract[int(x["Note"])+1] @@ -78,7 +81,12 @@ def note_to_mark(x): """ if x["Niveau"]: + if x["Note"] == NOANSWER: + return 0 return x["Note"] * x["Bareme"] / 3 + + if x["Note"] > x["Bareme"]: + logger.warning(f"The note ({x['Note']}) is greated than the rating scale ({x['Bareme']}) at {x}") return x["Note"] def note_to_level(x): @@ -112,8 +120,7 @@ def note_to_level(x): >>> note_to_level(df.loc[10]) 2 """ - - if pd.isnull(x["Note"]): + if x["Note"] == NOANSWER: return "na" if pd.isnull(x["Bareme"]) or x["Bareme"] == 0: @@ -468,8 +475,8 @@ def digest_flat_df(flat_df): 2 0 E1 N2 1 4.0 01/10/2016 3.0 0.75 3 1 E2 N2 1 4.0 01/10/2016 NaN NaN """ - # Remove data with "nn" (non notés) - df = flat_df.copy()[flat_df["Note"].astype("object") != "nn"] + df = flat_df.dropna(subset=["Note"]) + df["Mark"] = compute_marks(df) df["Level"] = compute_level(df) df["Latex_rep"] = compute_latex_rep(df) diff --git a/samples/312.xlsx b/samples/312.xlsx index 7f825bc385357b9c3afc8d54606056febead6240..b2131270706ec5a99258f15962e7dcfdb60f4076 100644 GIT binary patch delta 12909 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