"""Calculate student grades by combining data from many sources. Using Pandas, this script combines data from the: * Roster * Homework & Exam grades * Quiz grades to calculate final grades for a class. """ from pathlib import Path import pandas as pd HERE = Path(__file__).parent DATA_FOLDER = HERE / "data" # ---------------------- # 01 - LOADING THE DATA # ---------------------- roster = pd.read_csv( DATA_FOLDER / "roster.csv", converters={"NetID": str.lower, "Email Address": str.lower}, usecols=["Section", "Email Address", "NetID"], index_col="NetID", ) hw_exam_grades = pd.read_csv( DATA_FOLDER / "hw_exam_grades.csv", converters={"SID": str.lower}, usecols=lambda x: "Submission" not in x, index_col="SID", ) quiz_grades = pd.DataFrame() for file_path in DATA_FOLDER.glob("quiz_*_grades.csv"): quiz_name = " ".join(file_path.stem.title().split("_")[:2]) quiz = pd.read_csv( file_path, converters={"Email": str.lower}, index_col=["Email"], usecols=["Email", "Grade"], ).rename(columns={"Grade": quiz_name}) quiz_grades = pd.concat([quiz_grades, quiz], axis=1) # ------------------------ # 02 - MERGING DATAFRAMES # ------------------------ final_data = pd.merge( roster, hw_exam_grades, left_index=True, right_index=True, ) final_data = pd.merge( final_data, quiz_grades, left_on="Email Address", right_index=True ) final_data = final_data.fillna(0)