142 lines
3.6 KiB
Python
142 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
# encoding: utf-8
|
|
|
|
from .on_score_column import score_to_mark, score_to_level
|
|
|
|
|
|
def compute_marks(df, score_max, rounding=lambda x: round(x, 2)):
|
|
"""Compute the mark for the dataframe
|
|
|
|
apply score_to_mark to each row
|
|
|
|
:param df: DataFrame with "score", "is_leveled" and "score_rate" columns.
|
|
|
|
>>> import pandas as pd
|
|
>>> 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":[1, 0.33, 2, 1.5, 1, 3, 0.666, 1, 1.5, 1, 2, 3],
|
|
... }
|
|
>>> df = pd.DataFrame(d)
|
|
>>> df
|
|
Eleve score_rate is_leveled score
|
|
0 E1 1 0 1.000
|
|
1 E1 1 0 0.330
|
|
2 E1 2 0 2.000
|
|
3 E1 2 0 1.500
|
|
4 E1 2 1 1.000
|
|
5 E1 2 1 3.000
|
|
6 E2 1 0 0.666
|
|
7 E2 1 0 1.000
|
|
8 E2 2 0 1.500
|
|
9 E2 2 0 1.000
|
|
10 E2 2 1 2.000
|
|
11 E2 2 1 3.000
|
|
>>> compute_marks(df, 3)
|
|
0 1.00
|
|
1 0.33
|
|
2 2.00
|
|
3 1.50
|
|
4 0.67
|
|
5 2.00
|
|
6 0.67
|
|
7 1.00
|
|
8 1.50
|
|
9 1.00
|
|
10 1.33
|
|
11 2.00
|
|
dtype: float64
|
|
>>> from .on_value import round_half_point
|
|
>>> compute_marks(df, 3, round_half_point)
|
|
0 1.0
|
|
1 0.5
|
|
2 2.0
|
|
3 1.5
|
|
4 0.5
|
|
5 2.0
|
|
6 0.5
|
|
7 1.0
|
|
8 1.5
|
|
9 1.0
|
|
10 1.5
|
|
11 2.0
|
|
dtype: float64
|
|
"""
|
|
return df[["score", "is_leveled", "score_rate"]].apply(
|
|
lambda x: score_to_mark(x, score_max, rounding), axis=1
|
|
)
|
|
|
|
|
|
def compute_level(df, level_max=3):
|
|
"""Compute level for the dataframe
|
|
|
|
Applies score_to_level to each row
|
|
|
|
:param df: DataFrame with "score", "is_leveled" and "score_rate" columns.
|
|
:return: Columns with level
|
|
|
|
>>> import pandas as pd
|
|
>>> import numpy as np
|
|
>>> 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],
|
|
... }
|
|
>>> df = pd.DataFrame(d)
|
|
>>> compute_level(df)
|
|
0 0
|
|
1 1
|
|
2 3
|
|
3 3
|
|
4 1
|
|
5 3
|
|
6 2
|
|
7 3
|
|
8 3
|
|
9 2
|
|
10 2
|
|
11 3
|
|
dtype: int64
|
|
"""
|
|
return df[["score", "is_leveled", "score_rate"]].apply(
|
|
lambda x: score_to_level(x, level_max), axis=1
|
|
)
|
|
|
|
|
|
def compute_normalized(df, rounding=lambda x: round(x, 2)):
|
|
"""Compute the normalized mark (Mark / score_rate)
|
|
|
|
:param df: DataFrame with "Mark" and "score_rate" columns
|
|
:return: column with normalized mark
|
|
|
|
>>> import pandas as pd
|
|
>>> 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":[1, 0.33, 2, 1.5, 1, 3, 0.666, 1, 1.5, 1, 2, 3],
|
|
... }
|
|
>>> df = pd.DataFrame(d)
|
|
>>> df["mark"] = compute_marks(df, 3)
|
|
>>> compute_normalized(df)
|
|
0 1.00
|
|
1 0.33
|
|
2 1.00
|
|
3 0.75
|
|
4 0.34
|
|
5 1.00
|
|
6 0.67
|
|
7 1.00
|
|
8 0.75
|
|
9 0.50
|
|
10 0.66
|
|
11 1.00
|
|
dtype: float64
|
|
"""
|
|
return rounding(df["mark"] / df["score_rate"])
|
|
|
|
|
|
# -----------------------------
|
|
# Reglages pour 'vim'
|
|
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:
|
|
# cursor: 16 del
|