Feat: add competence fig and better error management

This commit is contained in:
Bertrand Benjamin 2021-01-15 13:48:57 +01:00
parent 0a5a931d01
commit 09ac9f01f8

View File

@ -75,7 +75,7 @@ app.layout = html.Div(
columns=[ columns=[
{"id": "Élève", "name": "Élève"}, {"id": "Élève", "name": "Élève"},
{"id": "Note", "name": "Note"}, {"id": "Note", "name": "Note"},
{"id": "Barème", "name": "Bareme"}, {"id": "Barème", "name": "Barème"},
], ],
data=[], data=[],
style_data_conditional=[ style_data_conditional=[
@ -99,11 +99,21 @@ app.layout = html.Div(
[ [
dash_table.DataTable( dash_table.DataTable(
id="final_score_describe", id="final_score_describe",
columns=[{"id": "count", "name": "count"},
{"id": "mean", "name": "mean"},
{"id": "std", "name": "std"},
{"id": "min", "name": "min"},
{"id": "25%", "name": "25%"},
{"id": "50%", "name": "50%"},
{"id": "75%", "name": "75%"},
{"id": "max", "name": "max"},
]
), ),
dcc.Graph( dcc.Graph(
id="fig_assessment_hist", id="fig_assessment_hist",
), ),
# dcc.Graph(id="fig_competences"), dcc.Graph(id="fig_competences"),
] ]
), ),
], ],
@ -156,42 +166,47 @@ def update_csvs(value):
def update_final_scores(data): def update_final_scores(data):
if not data: if not data:
raise PreventUpdate raise PreventUpdate
try:
scores = pd.DataFrame.from_records(data) scores = pd.DataFrame.from_records(data)
try:
if scores.iloc[0]["Commentaire"] == "commentaire":
scores.drop([0], inplace=True)
except KeyError:
pass
scores = flat_df_students(scores).dropna(subset=["Score"]) scores = flat_df_students(scores).dropna(subset=["Score"])
if scores.empty:
return [{}]
scores = pp_q_scores(scores) scores = pp_q_scores(scores)
assessment_scores = scores.groupby(["Eleve"]).agg( assessment_scores = scores.groupby(["Eleve"]).agg(
{"Note": "sum", "Bareme": "sum"} {"Note": "sum", "Bareme": "sum"}
) )
return [assessment_scores.reset_index().to_dict("records")] return [assessment_scores.reset_index().to_dict("records")]
except KeyError:
raise PreventUpdate
@app.callback( @app.callback(
[ [
dash.dependencies.Output("final_score_table", "columns"),
dash.dependencies.Output("final_score_table", "data"), dash.dependencies.Output("final_score_table", "data"),
], ],
[dash.dependencies.Input("final_score", "data")], [dash.dependencies.Input("final_score", "data")],
) )
def update_final_scores_table(data): def update_final_scores_table(data):
assessment_scores = pd.DataFrame.from_records(data) assessment_scores = pd.DataFrame.from_records(data)
return [ return [assessment_scores.to_dict("records")]
{"id": c, "name": c} for c in assessment_scores.columns
], assessment_scores.to_dict("records")
@app.callback( @app.callback(
[ [
dash.dependencies.Output("final_score_describe", "columns"),
dash.dependencies.Output("final_score_describe", "data"), dash.dependencies.Output("final_score_describe", "data"),
], ],
[dash.dependencies.Input("final_score", "data")], [dash.dependencies.Input("final_score", "data")],
) )
def update_final_scores_descr(data): def update_final_scores_descr(data):
desc = pd.DataFrame.from_records(data)["Note"].describe() scores = pd.DataFrame.from_records(data)
return [{"id": c, "name": c} for c in desc.keys()], [desc.to_dict()] if scores.empty:
return [[{}]]
desc = scores["Note"].describe().T
return [[desc.to_dict()]]
@app.callback( @app.callback(
@ -203,6 +218,9 @@ def update_final_scores_descr(data):
def update_final_scores_hist(data): def update_final_scores_hist(data):
assessment_scores = pd.DataFrame.from_records(data) assessment_scores = pd.DataFrame.from_records(data)
if assessment_scores.empty:
return [{}]
ranges = np.linspace( ranges = np.linspace(
0, assessment_scores.Bareme.max(), int(assessment_scores.Bareme.max() * 2 + 1) 0, assessment_scores.Bareme.max(), int(assessment_scores.Bareme.max() * 2 + 1)
) )
@ -230,51 +248,64 @@ def update_final_scores_hist(data):
return [fig] return [fig]
# @app.callback( @app.callback(
# [ [
# dash.dependencies.Output("fig_competences", "figure"), dash.dependencies.Output("fig_competences", "figure"),
# ], ],
# [dash.dependencies.Input("scores_table", "data")], [dash.dependencies.Input("scores_table", "data")],
# ) )
# def update_competence_fig(data): def update_competence_fig(data):
# scores = pd.DataFrame.from_records(data) scores = pd.DataFrame.from_records(data)
# scores = flat_df_students(scores).dropna(subset=["Score"]) try:
# scores = pp_q_scores(scores) if scores.iloc[0]["Commentaire"] == "commentaire":
# pt = pd.pivot_table( scores.drop([0], inplace=True)
# scores, except KeyError:
# index=["Exercice", "Question", "Commentaire"], pass
# columns="Score", scores = flat_df_students(scores).dropna(subset=["Score"])
# aggfunc="size",
# fill_value=0, if scores.empty:
# ) return [{}]
# for i in {i for i in pt.index.get_level_values(0)}:
# pt.loc[(str(i), "", ""), :] = "" scores = pp_q_scores(scores)
# pt.sort_index(inplace=True) pt = pd.pivot_table(
# index = ( scores,
# pt.index.get_level_values(0) index=["Exercice", "Question", "Commentaire"],
# + ":" columns="Score",
# + pt.index.get_level_values(1) aggfunc="size",
# + " " fill_value=0,
# + pt.index.get_level_values(2) )
# ) for i in {i for i in pt.index.get_level_values(0)}:
# pt.loc[(str(i), "", ""), :] = ""
# fig = go.Figure() pt.sort_index(inplace=True)
# bars = [ index = (
# {"score": -1, "name": "Pas de réponse", "color": COLORS["."]}, pt.index.get_level_values(0)
# {"score": 0, "name": "Faut", "color": COLORS[0]}, + ":"
# {"score": 1, "name": "Peu juste", "color": COLORS[1]}, + pt.index.get_level_values(1)
# {"score": 2, "name": "Presque juste", "color": COLORS[2]}, + " "
# {"score": 3, "name": "Juste", "color": COLORS[3]}, + pt.index.get_level_values(2)
# ] )
# for b in bars:
# try: fig = go.Figure()
# fig.add_bar( bars = [
# x=index, y=pt[b["score"]], name=b["name"], marker_color=b["color"] {"score": -1, "name": "Pas de réponse", "color": COLORS["."]},
# ) {"score": 0, "name": "Faut", "color": COLORS[0]},
# except KeyError: {"score": 1, "name": "Peu juste", "color": COLORS[1]},
# pass {"score": 2, "name": "Presque juste", "color": COLORS[2]},
# fig.update_layout(barmode="relative") {"score": 3, "name": "Juste", "color": COLORS[3]},
# return [fig] ]
for b in bars:
try:
fig.add_bar(
x=index, y=pt[b["score"]], name=b["name"], marker_color=b["color"]
)
except KeyError:
pass
fig.update_layout(barmode="relative")
fig.update_layout(
height=500,
margin=dict(l=5, r=5, b=5, t=5),
)
return [fig]
@app.callback( @app.callback(