Compare commits
2 Commits
6889ddd97c
...
2e86b3a0a2
Author | SHA1 | Date | |
---|---|---|---|
2e86b3a0a2 | |||
7e6b24aaea |
@ -21,27 +21,34 @@ competences: # Competences
|
|||||||
name: Communiquer
|
name: Communiquer
|
||||||
abrv: Com
|
abrv: Com
|
||||||
|
|
||||||
valid_scores: #
|
scores: #
|
||||||
BAD: # Everything is bad
|
BAD: # Everything is bad
|
||||||
value: 0
|
value: 0
|
||||||
|
numeric_value: 0
|
||||||
color: "#E7472B"
|
color: "#E7472B"
|
||||||
FEW: # Few good things
|
FEW: # Few good things
|
||||||
value: 1
|
value: 1
|
||||||
|
numeric_value: 1
|
||||||
color: "#FF712B"
|
color: "#FF712B"
|
||||||
NEARLY: # Nearly good but things are missing
|
NEARLY: # Nearly good but things are missing
|
||||||
value: 2
|
value: 2
|
||||||
|
numeric_value: 2
|
||||||
color: "#F2EC4C"
|
color: "#F2EC4C"
|
||||||
GOOD: # Everything is good
|
GOOD: # Everything is good
|
||||||
value: 3
|
value: 3
|
||||||
|
numeric_value: 3
|
||||||
color: "#68D42F"
|
color: "#68D42F"
|
||||||
NOTFILLED: # The item is not scored yet
|
NOTFILLED: # The item is not scored yet
|
||||||
value: ""
|
value: ""
|
||||||
|
numeric_value: None
|
||||||
color: white
|
color: white
|
||||||
NOANSWER: # Student gives no answer (count as 0)
|
NOANSWER: # Student gives no answer (count as 0)
|
||||||
value: "."
|
value: "."
|
||||||
|
numeric_value: 0
|
||||||
color: black
|
color: black
|
||||||
ABS: # Student has absent (this score won't be impact the final mark)
|
ABS: # Student has absent (this score won't be impact the final mark)
|
||||||
value: a
|
value: a
|
||||||
|
numeric_value: None
|
||||||
color: lightgray
|
color: lightgray
|
||||||
|
|
||||||
csv_fields: # dataframe_field: csv_field
|
csv_fields: # dataframe_field: csv_field
|
||||||
|
@ -31,10 +31,10 @@ class CSVLoader(Loader):
|
|||||||
:example:
|
:example:
|
||||||
>>> loader = CSVLoader()
|
>>> loader = CSVLoader()
|
||||||
>>> loader.get_config()
|
>>> loader.get_config()
|
||||||
{'source': './', 'competences': {'Chercher': {'name': 'Chercher', 'abrv': 'Cher'}, 'Représenter': {'name': 'Représenter', 'abrv': 'Rep'}, 'Modéliser': {'name': 'Modéliser', 'abrv': 'Mod'}, 'Raisonner': {'name': 'Raisonner', 'abrv': 'Rai'}, 'Calculer': {'name': 'Calculer', 'abrv': 'Cal'}, 'Communiquer': {'name': 'Communiquer', 'abrv': 'Com'}}, 'valid_scores': {'BAD': {'value': 0, 'color': '#E7472B'}, 'FEW': {'value': 1, 'color': '#FF712B'}, 'NEARLY': {'value': 2, 'color': '#F2EC4C'}, 'GOOD': {'value': 3, 'color': '#68D42F'}, 'NOTFILLED': {'value': '', 'color': 'white'}, 'NOANSWER': {'value': '.', 'color': 'black'}, 'ABS': {'value': 'a', 'color': 'lightgray'}}, 'csv_fields': {'term': 'Trimestre', 'exam': 'Nom', 'date': 'Date', 'exercise': 'Exercice', 'question': 'Question', 'competence': 'Competence', 'theme': 'Domaine', 'comment': 'Commentaire', 'score_rate': 'Bareme', 'is_leveled': 'Est_nivele'}, 'id_templates': {'exam': '{name}_{tribe}', 'question': '{exam_id}_{exercise}_{question}_{comment}'}}
|
{'source': './', 'competences': {'Chercher': {'name': 'Chercher', 'abrv': 'Cher'}, 'Représenter': {'name': 'Représenter', 'abrv': 'Rep'}, 'Modéliser': {'name': 'Modéliser', 'abrv': 'Mod'}, 'Raisonner': {'name': 'Raisonner', 'abrv': 'Rai'}, 'Calculer': {'name': 'Calculer', 'abrv': 'Cal'}, 'Communiquer': {'name': 'Communiquer', 'abrv': 'Com'}}, 'scores': {'BAD': {'value': 0, 'numeric_value': 0, 'color': '#E7472B'}, 'FEW': {'value': 1, 'numeric_value': 1, 'color': '#FF712B'}, 'NEARLY': {'value': 2, 'numeric_value': 2, 'color': '#F2EC4C'}, 'GOOD': {'value': 3, 'numeric_value': 3, 'color': '#68D42F'}, 'NOTFILLED': {'value': '', 'numeric_value': 'None', 'color': 'white'}, 'NOANSWER': {'value': '.', 'numeric_value': 0, 'color': 'black'}, 'ABS': {'value': 'a', 'numeric_value': 'None', 'color': 'lightgray'}}, 'csv_fields': {'term': 'Trimestre', 'exam': 'Nom', 'date': 'Date', 'exercise': 'Exercice', 'question': 'Question', 'competence': 'Competence', 'theme': 'Domaine', 'comment': 'Commentaire', 'score_rate': 'Bareme', 'is_leveled': 'Est_nivele'}, 'id_templates': {'exam': '{name}_{tribe}', 'question': '{exam_id}_{exercise}_{question}_{comment}'}}
|
||||||
>>> loader = CSVLoader("./test_config.yml")
|
>>> loader = CSVLoader("./test_config.yml")
|
||||||
>>> loader.get_config()
|
>>> loader.get_config()
|
||||||
{'source': './example', 'competences': {'Chercher': {'name': 'Chercher', 'abrv': 'Cher'}, 'Représenter': {'name': 'Représenter', 'abrv': 'Rep'}, 'Modéliser': {'name': 'Modéliser', 'abrv': 'Mod'}, 'Raisonner': {'name': 'Raisonner', 'abrv': 'Rai'}, 'Calculer': {'name': 'Calculer', 'abrv': 'Cal'}, 'Communiquer': {'name': 'Communiquer', 'abrv': 'Com'}}, 'valid_scores': {'BAD': {'value': 0, 'color': '#E7472B'}, 'FEW': {'value': 1, 'color': '#FF712B'}, 'NEARLY': {'value': 2, 'color': '#F2EC4C'}, 'GOOD': {'value': 3, 'color': '#68D42F'}, 'NOTFILLED': {'value': '', 'color': 'white'}, 'NOANSWER': {'value': '.', 'color': 'black'}, 'ABS': {'value': 'a', 'color': 'lightgray'}}, 'csv_fields': {'term': 'Trimestre', 'exam': 'Nom', 'date': 'Date', 'exercise': 'Exercice', 'question': 'Question', 'competence': 'Competence', 'theme': 'Domaine', 'comment': 'Commentaire', 'score_rate': 'Bareme', 'is_leveled': 'Est_nivele'}, 'id_templates': {'exam': '{name}_{tribe}', 'question': '{exam_id}_{exercise}_{question}_{comment}'}, 'output': './output', 'templates': 'templates/', 'tribes': {'Tribe1': {'name': 'Tribe1', 'type': 'Type1', 'students': 'tribe1.csv'}, 'Tribe2': {'name': 'Tribe2', 'students': 'tribe2.csv'}}}
|
{'source': './example', 'competences': {'Chercher': {'name': 'Chercher', 'abrv': 'Cher'}, 'Représenter': {'name': 'Représenter', 'abrv': 'Rep'}, 'Modéliser': {'name': 'Modéliser', 'abrv': 'Mod'}, 'Raisonner': {'name': 'Raisonner', 'abrv': 'Rai'}, 'Calculer': {'name': 'Calculer', 'abrv': 'Cal'}, 'Communiquer': {'name': 'Communiquer', 'abrv': 'Com'}}, 'scores': {'BAD': {'value': 0, 'numeric_value': 0, 'color': '#E7472B'}, 'FEW': {'value': 1, 'numeric_value': 1, 'color': '#FF712B'}, 'NEARLY': {'value': 2, 'numeric_value': 2, 'color': '#F2EC4C'}, 'GOOD': {'value': 3, 'numeric_value': 3, 'color': '#68D42F'}, 'NOTFILLED': {'value': '', 'numeric_value': 'None', 'color': 'white'}, 'NOANSWER': {'value': '.', 'numeric_value': 0, 'color': 'black'}, 'ABS': {'value': 'a', 'numeric_value': 'None', 'color': 'lightgray'}}, 'csv_fields': {'term': 'Trimestre', 'exam': 'Nom', 'date': 'Date', 'exercise': 'Exercice', 'question': 'Question', 'competence': 'Competence', 'theme': 'Domaine', 'comment': 'Commentaire', 'score_rate': 'Bareme', 'is_leveled': 'Est_nivele'}, 'id_templates': {'exam': '{name}_{tribe}', 'question': '{exam_id}_{exercise}_{question}_{comment}'}, 'output': './output', 'templates': 'templates/', 'tribes': {'Tribe1': {'name': 'Tribe1', 'type': 'Type1', 'students': 'tribe1.csv'}, 'Tribe2': {'name': 'Tribe2', 'students': 'tribe2.csv'}}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
CONFIG = DEFAULT_CONFIG
|
CONFIG = DEFAULT_CONFIG
|
||||||
|
@ -10,7 +10,7 @@ def score_to_mark(x, score_max, rounding=lambda x: round(x, 2)):
|
|||||||
if the item is leveled then the score is multiply by the score_rate
|
if the item is leveled then the score is multiply by the score_rate
|
||||||
otherwise it copies the score
|
otherwise it copies the score
|
||||||
|
|
||||||
:param x: dictionnary with "is_leveled", "score" and "score_rate" keys
|
:param x: dictionnary with "is_leveled", "score" (need to be number) and "score_rate" keys
|
||||||
:param score_max:
|
:param score_max:
|
||||||
:param rounding: rounding mark function
|
:param rounding: rounding mark function
|
||||||
:return: the mark
|
:return: the mark
|
||||||
@ -125,6 +125,10 @@ def score_to_level(x, level_max=3):
|
|||||||
return int(ceil(x["score"] / x["score_rate"] * level_max))
|
return int(ceil(x["score"] / x["score_rate"] * level_max))
|
||||||
|
|
||||||
|
|
||||||
|
def score_to_numeric_score(x, score_config):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# Reglages pour 'vim'
|
# Reglages pour 'vim'
|
||||||
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# encoding: utf-8
|
# encoding: utf-8
|
||||||
|
|
||||||
from .on_score_column import score_to_mark, score_to_level
|
from .on_score_column import score_to_mark, score_to_level
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
|
||||||
def compute_marks(df, score_max, rounding=lambda x: round(x, 2)):
|
def compute_marks(df, score_max, rounding=lambda x: round(x, 2)):
|
||||||
@ -9,7 +10,7 @@ def compute_marks(df, score_max, rounding=lambda x: round(x, 2)):
|
|||||||
|
|
||||||
apply score_to_mark to each row
|
apply score_to_mark to each row
|
||||||
|
|
||||||
:param df: DataFrame with "score", "is_leveled" and "score_rate" columns.
|
:param df: DataFrame with "score" (need to be number), "is_leveled" and "score_rate" columns.
|
||||||
|
|
||||||
>>> import pandas as pd
|
>>> import pandas as pd
|
||||||
>>> d = {"Eleve":["E1"]*6 + ["E2"]*6,
|
>>> d = {"Eleve":["E1"]*6 + ["E2"]*6,
|
||||||
@ -113,12 +114,12 @@ def compute_normalized(df, rounding=lambda x: round(x, 2)):
|
|||||||
>>> d = {"Eleve":["E1"]*6 + ["E2"]*6,
|
>>> d = {"Eleve":["E1"]*6 + ["E2"]*6,
|
||||||
... "score_rate":[1]*2+[2]*2+[2]*2 + [1]*2+[2]*2+[2]*2,
|
... "score_rate":[1]*2+[2]*2+[2]*2 + [1]*2+[2]*2+[2]*2,
|
||||||
... "is_leveled":[0]*4+[1]*2 + [0]*4+[1]*2,
|
... "is_leveled":[0]*4+[1]*2 + [0]*4+[1]*2,
|
||||||
... "score":[1, 0.33, 2, 1.5, 1, 3, 0.666, 1, 1.5, 1, 2, 3],
|
... "score":[0, 0.33, 2, 1.5, 1, 3, 0.666, 1, 1.5, 1, 2, 3],
|
||||||
... }
|
... }
|
||||||
>>> df = pd.DataFrame(d)
|
>>> df = pd.DataFrame(d)
|
||||||
>>> df["mark"] = compute_marks(df, 3)
|
>>> df["mark"] = compute_marks(df, 3)
|
||||||
>>> compute_normalized(df)
|
>>> compute_normalized(df)
|
||||||
0 1.00
|
0 0.00
|
||||||
1 0.33
|
1 0.33
|
||||||
2 1.00
|
2 1.00
|
||||||
3 0.75
|
3 0.75
|
||||||
@ -135,6 +136,60 @@ def compute_normalized(df, rounding=lambda x: round(x, 2)):
|
|||||||
return rounding(df["mark"] / df["score_rate"])
|
return rounding(df["mark"] / df["score_rate"])
|
||||||
|
|
||||||
|
|
||||||
|
def filter_none_score(df, score_config):
|
||||||
|
"""Filter rows where scores have None numeric values
|
||||||
|
|
||||||
|
:example:
|
||||||
|
|
||||||
|
>>> import pandas as pd
|
||||||
|
>>> d = {"Eleve":["E1"]*7,
|
||||||
|
... "score_rate": [1]*7,
|
||||||
|
... "is_leveled":[0]+[1]*6,
|
||||||
|
... "score":[0.33, "", ".", "a", 1, 2, 3],
|
||||||
|
... }
|
||||||
|
>>> score_config = {
|
||||||
|
... 'BAD': {'value': 0, 'numeric_value': 0},
|
||||||
|
... 'FEW': {'value': 1, 'numeric_value': 1},
|
||||||
|
... 'NEARLY': {'value': 2, 'numeric_value': 2},
|
||||||
|
... 'GOOD': {'value': 3, 'numeric_value': 3},
|
||||||
|
... 'NOTFILLED': {'value': '', 'numeric_value': 'None'},
|
||||||
|
... 'NOANSWER': {'value': '.', 'numeric_value': 0},
|
||||||
|
... 'ABS': {'value': 'a', 'numeric_value': 'None'}
|
||||||
|
... }
|
||||||
|
>>> df = pd.DataFrame(d)
|
||||||
|
>>> filter_none_score(df, score_config)
|
||||||
|
Eleve score_rate is_leveled score
|
||||||
|
0 E1 1 0 0.33
|
||||||
|
2 E1 1 1 .
|
||||||
|
4 E1 1 1 1
|
||||||
|
5 E1 1 1 2
|
||||||
|
6 E1 1 1 3
|
||||||
|
"""
|
||||||
|
not_leveled_df = df[df["is_leveled"] != 1]
|
||||||
|
leveled_df = df[df["is_leveled"] == 1]
|
||||||
|
|
||||||
|
not_none_values = [
|
||||||
|
v["value"]
|
||||||
|
for v in score_config.values()
|
||||||
|
if str(v["numeric_value"]).lower() != "none"
|
||||||
|
]
|
||||||
|
filtered_leveled_df = leveled_df[leveled_df["score"].isin(not_none_values)]
|
||||||
|
|
||||||
|
return pd.concat([not_leveled_df, filtered_leveled_df])
|
||||||
|
|
||||||
|
|
||||||
|
def score_to_numeric_score(df, score_config):
|
||||||
|
"""Transform a score to the corresponding numeric value
|
||||||
|
|
||||||
|
>>> d = {"Eleve":["E1"]*6 + ["E2"]*6,
|
||||||
|
... "score_rate":[1]*2+[2]*2+[2]*2 + [1]*2+[2]*2+[2]*2,
|
||||||
|
... "is_leveled":[0]*4+[1]*2 + [0]*4+[1]*2,
|
||||||
|
... "score":[0, 0.33, 2, 1.5, 1, 3, 0.666, 1, 1.5, 1, 2, 3],
|
||||||
|
... }
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# Reglages pour 'vim'
|
# Reglages pour 'vim'
|
||||||
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
||||||
|
Loading…
Reference in New Issue
Block a user