|
import pandas as pd |
|
import argparse |
|
|
|
def matlab_grader(report, accept_late=False): |
|
""" Extract grades from MATLAB Grader reports """ |
|
|
|
df = pd.read_csv(report) |
|
|
|
components = df['Problem Component ID'].unique() |
|
count = len(components) |
|
emails = df['Student Email'].unique() |
|
|
|
if accept_late: |
|
df_valid = df |
|
else: |
|
df_valid = df[df['Late Submission?'] == 'N'] |
|
|
|
columns = ['email'] + list(components) + ['total score'] |
|
df_out = pd.DataFrame(columns=columns) |
|
|
|
# loop over emails |
|
for j, email in enumerate(emails): |
|
|
|
# extract portion done by student |
|
df_student = df_valid[df_valid['Student Email'] == email] |
|
|
|
# loop over components |
|
scores = [] |
|
for i, component in enumerate(components): |
|
if component in df_student['Problem Component ID'].values: |
|
df_component = df_student[df_student['Problem Component ID'] == component] |
|
#score = df_component['% Score'].apply(lambda x: float(x.rstrip('%'))) |
|
score = df_component['Tests Passed']/df_component['Total Tests'] |
|
scores.append(100 * score.max()) |
|
else: |
|
scores.append(0.) |
|
scores.append(sum(scores)/count) |
|
|
|
df_out.loc[j] = [email] + scores |
|
|
|
return df_out |
|
|
|
def main(): |
|
""" |
|
Main function |
|
""" |
|
# set up argument parser |
|
parser = argparse.ArgumentParser( |
|
description='Extract MATLAB Grader scores') |
|
parser.add_argument( |
|
'report_file', |
|
help='MATLAB Grader Report as CSV file') |
|
parser.add_argument( |
|
'score_file', |
|
help='Scores as CSV file') |
|
parser.add_argument( |
|
"--late", |
|
action="store_true", |
|
default=False, |
|
help="Accept late work (default: False)") |
|
|
|
args = parser.parse_args() |
|
|
|
df = matlab_grader(args.report_file, args.late) |
|
df = df.sort_values('email') |
|
df.to_csv(args.score_file, index=False) |
|
|
|
|
|
if __name__ == '__main__': |
|
main() |