Skip to content

Commit 685a228

Browse files
committed
Update gradebook scripts after TR
1 parent e5bc47d commit 685a228

10 files changed

+277
-317
lines changed

pandas-gradebook-project/01-loading-the-data.py

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,49 +14,31 @@
1414
HERE = Path(__file__).parent
1515
DATA_FOLDER = HERE / "data"
1616

17+
# ----------------------
18+
# 01 - LOADING THE DATA
19+
# ----------------------
20+
1721
roster = pd.read_csv(
1822
DATA_FOLDER / "roster.csv",
1923
converters={"NetID": str.lower, "Email Address": str.lower},
2024
usecols=["Section", "Email Address", "NetID"],
2125
index_col="NetID",
2226
)
2327

24-
# print(
25-
# roster.loc[["wxb12345", "mxl12345", "txj12345", "jgf12345"]].to_markdown()
26-
# )
27-
2828
hw_exam_grades = pd.read_csv(
2929
DATA_FOLDER / "hw_exam_grades.csv",
3030
converters={"SID": str.lower, "Email Address": str.lower},
3131
usecols=lambda x: "Submission" not in x,
3232
index_col="SID",
3333
)
34-
# print(
35-
# hw_exam_grades.loc[
36-
# hw_exam_grades["SID"].isin(
37-
# ["jgf12345", "mxl12345", "txj12345", "wxb12345"]
38-
# )
39-
# ].to_markdown()
40-
# )
4134

4235
quiz_grades = pd.DataFrame()
43-
for f in DATA_FOLDER.glob("quiz_*_grades.csv"):
44-
quiz_name = " ".join(f.stem.title().split("_")[:2])
36+
for file_path in DATA_FOLDER.glob("quiz_*_grades.csv"):
37+
quiz_name = " ".join(file_path.stem.title().split("_")[:2])
4538
quiz = pd.read_csv(
46-
f,
39+
file_path,
4740
converters={"Email": str.lower},
4841
index_col=["Email"],
4942
usecols=["Email", "Grade"],
5043
).rename(columns={"Grade": quiz_name})
5144
quiz_grades = pd.concat([quiz_grades, quiz], axis=1)
52-
53-
# print(
54-
# quiz_grades.loc[
55-
# [
56-
57-
58-
59-
60-
# ]
61-
# ].to_markdown()
62-
# )

pandas-gradebook-project/02-merging-dataframes.py

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
HERE = Path(__file__).parent
1515
DATA_FOLDER = HERE / "data"
1616

17+
# ----------------------
18+
# 01 - LOADING THE DATA
19+
# ----------------------
20+
1721
roster = pd.read_csv(
1822
DATA_FOLDER / "roster.csv",
1923
converters={"NetID": str.lower, "Email Address": str.lower},
@@ -29,40 +33,24 @@
2933
)
3034

3135
quiz_grades = pd.DataFrame()
32-
for f in DATA_FOLDER.glob("quiz_*_grades.csv"):
33-
quiz_name = " ".join(f.stem.title().split("_")[:2])
36+
for file_path in DATA_FOLDER.glob("quiz_*_grades.csv"):
37+
quiz_name = " ".join(file_path.stem.title().split("_")[:2])
3438
quiz = pd.read_csv(
35-
f,
39+
file_path,
3640
converters={"Email": str.lower},
3741
index_col=["Email"],
3842
usecols=["Email", "Grade"],
3943
).rename(columns={"Grade": quiz_name})
4044
quiz_grades = pd.concat([quiz_grades, quiz], axis=1)
4145

46+
# ------------------------
47+
# 02 - MERGING DATAFRAMES
48+
# ------------------------
49+
4250
final_data = pd.merge(
4351
roster, hw_exam_grades, left_index=True, right_index=True,
4452
)
45-
46-
# print(
47-
# final_data.loc[
48-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"]
49-
# ].to_markdown()
50-
# )
51-
5253
final_data = pd.merge(
5354
final_data, quiz_grades, left_on="Email Address", right_index=True
5455
)
55-
56-
# print(
57-
# final_data.loc[
58-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"]
59-
# ].to_markdown()
60-
# )
61-
6256
final_data = final_data.fillna(0)
63-
64-
# print(
65-
# final_data.loc[
66-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"]
67-
# ].to_markdown()
68-
# )

pandas-gradebook-project/03-calculating-grades.py

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
HERE = Path(__file__).parent
1616
DATA_FOLDER = HERE / "data"
1717

18+
# ----------------------
19+
# 01 - LOADING THE DATA
20+
# ----------------------
21+
1822
roster = pd.read_csv(
1923
DATA_FOLDER / "roster.csv",
2024
converters={"NetID": str.lower, "Email Address": str.lower},
@@ -30,80 +34,53 @@
3034
)
3135

3236
quiz_grades = pd.DataFrame()
33-
for f in DATA_FOLDER.glob("quiz_*_grades.csv"):
34-
quiz_name = " ".join(f.stem.title().split("_")[:2])
37+
for file_path in DATA_FOLDER.glob("quiz_*_grades.csv"):
38+
quiz_name = " ".join(file_path.stem.title().split("_")[:2])
3539
quiz = pd.read_csv(
36-
f,
40+
file_path,
3741
converters={"Email": str.lower},
3842
index_col=["Email"],
3943
usecols=["Email", "Grade"],
4044
).rename(columns={"Grade": quiz_name})
4145
quiz_grades = pd.concat([quiz_grades, quiz], axis=1)
4246

47+
# ------------------------
48+
# 02 - MERGING DATAFRAMES
49+
# ------------------------
50+
4351
final_data = pd.merge(
4452
roster, hw_exam_grades, left_index=True, right_index=True,
4553
)
46-
4754
final_data = pd.merge(
4855
final_data, quiz_grades, left_on="Email Address", right_index=True
4956
)
50-
5157
final_data = final_data.fillna(0)
5258

59+
# ------------------------
60+
# 03 - CALCULATING GRADES
61+
# ------------------------
62+
5363
n_exams = 3
5464
for n in range(1, n_exams + 1):
5565
final_data[f"Exam {n} Score"] = (
5666
final_data[f"Exam {n}"] / final_data[f"Exam {n} - Max Points"]
5767
)
5868

59-
# print(
60-
# final_data.loc[
61-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"],
62-
# [f"Exam {n} Score" for n in range(1, n_exams + 1)],
63-
# ].to_markdown()
64-
# )
65-
6669
homework_scores = final_data.filter(regex=r"^Homework \d\d?$", axis=1)
6770
homework_max_points = final_data.filter(regex=r"^Homework \d\d? -", axis=1)
6871

6972
sum_of_hw_scores = homework_scores.sum(axis=1)
7073
sum_of_hw_max = homework_max_points.sum(axis=1)
7174
final_data["Total Homework"] = sum_of_hw_scores / sum_of_hw_max
7275

73-
# print(
74-
# pd.concat(
75-
# [sum_of_hw_scores, sum_of_hw_max, final_data["Total Homework"]], axis=1
76-
# )
77-
# .set_axis(
78-
# ["Sum of Homework Scores", "Sum of Max Scores", "Total Homework"],
79-
# axis=1,
80-
# )
81-
# .loc[["wxb12345", "mxl12345", "txj12345", "jgf12345"]]
82-
# .to_markdown()
83-
# )
84-
8576
hw_max_renamed = homework_max_points.set_axis(homework_scores.columns, axis=1)
8677
average_hw_scores = (homework_scores / hw_max_renamed).sum(axis=1)
8778
final_data["Average Homework"] = average_hw_scores / homework_scores.shape[1]
8879

89-
# print(
90-
# pd.concat([average_hw_scores, final_data["Average Homework"]], axis=1)
91-
# .set_axis(["Sum of Average Homework Scores", "Average Homework"], axis=1)
92-
# .loc[["wxb12345", "mxl12345", "txj12345", "jgf12345"]]
93-
# .to_markdown()
94-
# )
95-
9680
final_data["Homework Score"] = final_data[
9781
["Total Homework", "Average Homework"]
9882
].max(axis=1)
9983

100-
# print(
101-
# final_data.loc[
102-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"],
103-
# ["Total Homework", "Average Homework", "Homework Score"],
104-
# ].to_markdown()
105-
# )
106-
10784
quiz_scores = final_data.filter(regex=r"^Quiz \d$", axis=1)
10885
quiz_max_points = pd.Series(
10986
{"Quiz 1": 11, "Quiz 2": 15, "Quiz 3": 17, "Quiz 4": 14, "Quiz 5": 12}
@@ -120,13 +97,6 @@
12097
["Total Quizzes", "Average Quizzes"]
12198
].max(axis=1)
12299

123-
# print(
124-
# final_data.loc[
125-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"],
126-
# ["Total Quizzes", "Average Quizzes", "Quiz Score"],
127-
# ].to_markdown()
128-
# )
129-
130100
weightings = pd.Series(
131101
{
132102
"Exam 1 Score": 0.05,
@@ -142,13 +112,6 @@
142112
)
143113
final_data["Ceiling Score"] = np.ceil(final_data["Final Score"] * 100)
144114

145-
# print(
146-
# final_data.loc[
147-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"],
148-
# ["Final Score", "Ceiling Score"],
149-
# ].to_markdown()
150-
# )
151-
152115
grades = {
153116
90: "A",
154117
80: "B",
@@ -159,6 +122,7 @@
159122

160123

161124
def grade_mapping(value):
125+
"""Map numerical grade to letter grade."""
162126
for key, letter in grades.items():
163127
if value >= key:
164128
return letter
@@ -168,9 +132,3 @@ def grade_mapping(value):
168132
final_data["Final Grade"] = pd.Categorical(
169133
letter_grades, categories=grades.values(), ordered=True
170134
)
171-
172-
# print(
173-
# final_data.loc[
174-
# ["wxb12345", "mxl12345", "txj12345", "jgf12345"], ["Final Grade"],
175-
# ].to_markdown()
176-
# )

pandas-gradebook-project/04-grouping-the-data.py

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
HERE = Path(__file__).parent
1616
DATA_FOLDER = HERE / "data"
1717

18+
# ----------------------
19+
# 01 - LOADING THE DATA
20+
# ----------------------
21+
1822
roster = pd.read_csv(
1923
DATA_FOLDER / "roster.csv",
2024
converters={"NetID": str.lower, "Email Address": str.lower},
@@ -30,26 +34,32 @@
3034
)
3135

3236
quiz_grades = pd.DataFrame()
33-
for f in DATA_FOLDER.glob("quiz_*_grades.csv"):
34-
quiz_name = " ".join(f.stem.title().split("_")[:2])
37+
for file_path in DATA_FOLDER.glob("quiz_*_grades.csv"):
38+
quiz_name = " ".join(file_path.stem.title().split("_")[:2])
3539
quiz = pd.read_csv(
36-
f,
40+
file_path,
3741
converters={"Email": str.lower},
3842
index_col=["Email"],
3943
usecols=["Email", "Grade"],
4044
).rename(columns={"Grade": quiz_name})
4145
quiz_grades = pd.concat([quiz_grades, quiz], axis=1)
4246

47+
# ------------------------
48+
# 02 - MERGING DATAFRAMES
49+
# ------------------------
50+
4351
final_data = pd.merge(
4452
roster, hw_exam_grades, left_index=True, right_index=True,
4553
)
46-
4754
final_data = pd.merge(
4855
final_data, quiz_grades, left_on="Email Address", right_index=True
4956
)
50-
5157
final_data = final_data.fillna(0)
5258

59+
# ------------------------
60+
# 03 - CALCULATING GRADES
61+
# ------------------------
62+
5363
n_exams = 3
5464
for n in range(1, n_exams + 1):
5565
final_data[f"Exam {n} Score"] = (
@@ -64,14 +74,13 @@
6474
final_data["Total Homework"] = sum_of_hw_scores / sum_of_hw_max
6575

6676
hw_max_renamed = homework_max_points.set_axis(homework_scores.columns, axis=1)
67-
overall_hw_scores = (homework_scores / hw_max_renamed).sum(axis=1)
68-
final_data["Overall Homework"] = overall_hw_scores / homework_scores.shape[1]
77+
average_hw_scores = (homework_scores / hw_max_renamed).sum(axis=1)
78+
final_data["Average Homework"] = average_hw_scores / homework_scores.shape[1]
6979

7080
final_data["Homework Score"] = final_data[
71-
["Total Homework", "Overall Homework"]
81+
["Total Homework", "Average Homework"]
7282
].max(axis=1)
7383

74-
7584
quiz_scores = final_data.filter(regex=r"^Quiz \d$", axis=1)
7685
quiz_max_points = pd.Series(
7786
{"Quiz 1": 11, "Quiz 2": 15, "Quiz 3": 17, "Quiz 4": 14, "Quiz 5": 12}
@@ -81,11 +90,11 @@
8190
sum_of_quiz_max = quiz_max_points.sum()
8291
final_data["Total Quizzes"] = sum_of_hw_scores / sum_of_hw_max
8392

84-
overall_quiz_scores = (quiz_scores / quiz_max_points).sum(axis=1)
85-
final_data["Overall Quizzes"] = overall_quiz_scores / quiz_scores.shape[1]
93+
average_quiz_scores = (quiz_scores / quiz_max_points).sum(axis=1)
94+
final_data["Average Quizzes"] = average_quiz_scores / quiz_scores.shape[1]
8695

8796
final_data["Quiz Score"] = final_data[
88-
["Total Quizzes", "Overall Quizzes"]
97+
["Total Quizzes", "Average Quizzes"]
8998
].max(axis=1)
9099

91100
weightings = pd.Series(
@@ -113,6 +122,7 @@
113122

114123

115124
def grade_mapping(value):
125+
"""Map numerical grade to letter grade."""
116126
for key, letter in grades.items():
117127
if value >= key:
118128
return letter
@@ -123,8 +133,15 @@ def grade_mapping(value):
123133
letter_grades, categories=grades.values(), ordered=True
124134
)
125135

136+
# -----------------------
137+
# 04 - GROUPING THE DATA
138+
# -----------------------
139+
126140
for section, table in final_data.groupby("Section"):
127-
print(f"In Section {section} there are {table.shape[0]} students.")
128-
table.sort_values(by=["Last Name", "First Name"]).to_csv(
129-
DATA_FOLDER / f"Section {section} Grades.csv"
141+
section_file = DATA_FOLDER / f"Section {section} Grades.csv"
142+
num_students = table.shape[0]
143+
print(
144+
f"In Section {section} there are {num_students} students saved to "
145+
f"file {section_file}."
130146
)
147+
table.sort_values(by=["Last Name", "First Name"]).to_csv(section_file)

0 commit comments

Comments
 (0)