def test_give_equal_weights_on_example(): # given columns = ["hw01", "hw02", "hw03", "lab01"] p1 = pd.Series(data=[1, 30, 90, 20], index=columns, name="A1") p2 = pd.Series(data=[2, 7, 15, 20], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([2, 50, 100, 20], index=columns) gradebook = gradelib.Gradebook(points, maximums) homeworks = gradebook.assignments.starting_with("hw") # when actual = gradebook.give_equal_weights(within=homeworks) # then assert actual.maximums.loc["hw01"] == 1 assert actual.maximums.loc["hw02"] == 1 assert actual.maximums.loc["hw03"] == 1 assert actual.maximums.loc["lab01"] == 20 assert actual.points.loc["A1", "hw01"] == 1 / 2 assert actual.points.loc["A1", "hw02"] == 30 / 50
def test_drop_lowest_counts_lates_as_zeros(): # given columns = ["hw01", "hw02"] p1 = pd.Series(data=[10, 5], index=columns, name="A1") p2 = pd.Series(data=[10, 10], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([10, 10], index=columns) gradebook = gradelib.Gradebook(points, maximums) gradebook.late.iloc[0, 0] = True # since A1's perfect homework is late, it should count as zero and be # dropped # when actual = gradebook.drop_lowest(1) # then assert actual.dropped.iloc[0, 0] assert list(actual.dropped.sum(axis=1)) == [1, 1] assert_gradebook_is_sound(actual)
def test_drop_lowest_on_simple_example_2(): # given columns = ["hw01", "hw02", "hw03", "lab01"] p1 = pd.Series(data=[1, 30, 90, 20], index=columns, name="A1") p2 = pd.Series(data=[2, 7, 15, 20], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([2, 50, 100, 20], index=columns) gradebook = gradelib.Gradebook(points, maximums) homeworks = gradebook.assignments.starting_with("hw") # if we are dropping 1 HW, the right strategy is to drop the 50 point HW # for A1 and to drop the 100 point homework for A2 # when actual = gradebook.drop_lowest(2, within=homeworks) # then assert not actual.dropped.iloc[0, 2] assert not actual.dropped.iloc[1, 0] assert list(actual.dropped.sum(axis=1)) == [2, 2] assert_gradebook_is_sound(actual)
def test_add_assignment_default_none_dropped_or_late(): # given columns = ["hw01", "hw01 - programming", "hw02", "lab01"] p1 = pd.Series(data=[1, 30, 90, 20], index=columns, name="A1") p2 = pd.Series(data=[2, 7, 15, 20], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([2, 50, 100, 20], index=columns) gradebook = gradelib.Gradebook(points, maximums) assignment_points = pd.Series([10, 20], index=["A1", "A2"]) assignment_max = 20 # when result = gradebook.add_assignment( "new", assignment_points, 20, ) # then assert result.late.loc["A1", "new"] == False assert result.dropped.loc["A1", "new"] == False
def test_drop_lowest_ignores_assignments_alread_dropped(): # given columns = ["hw01", "hw02", "hw03", "hw04"] p1 = pd.Series(data=[9, 0, 7, 0], index=columns, name="A1") p2 = pd.Series(data=[10, 10, 10, 10], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([10, 10, 10, 10], index=columns) gradebook = gradelib.Gradebook(points, maximums) gradebook.dropped.loc["A1", "hw02"] = True gradebook.dropped.loc["A1", "hw04"] = True # since A1's perfect homeworks are already dropped, we should drop a third # homework, too: this will be HW03 # when actual = gradebook.drop_lowest(1) # then assert actual.dropped.loc["A1", "hw04"] assert actual.dropped.loc["A1", "hw02"] assert actual.dropped.loc["A1", "hw03"] assert list(actual.dropped.sum(axis=1)) == [3, 1] assert_gradebook_is_sound(actual)
def test_unify_assignments(): """test that points / maximums are added across unified assignments""" # given columns = ["hw01", "hw01 - programming", "hw02", "lab01"] p1 = pd.Series(data=[1, 30, 90, 20], index=columns, name="A1") p2 = pd.Series(data=[2, 7, 15, 20], index=columns, name="A2") points = pd.DataFrame([p1, p2]) maximums = pd.Series([2, 50, 100, 20], index=columns) gradebook = gradelib.Gradebook(points, maximums) HOMEWORK_01_PARTS = gradebook.assignments.starting_with("hw01") # when result = gradebook.unify_assignments({"hw01": HOMEWORK_01_PARTS}) # then assert len(result.assignments) == 3 assert result.maximums["hw01"] == 52 assert result.points.loc["A1", "hw01"] == 31 assert result.maximums.shape[0] == 3 assert result.late.shape[1] == 3 assert result.dropped.shape[1] == 3 assert result.points.shape[1] == 3
import pytest import pandas as pd import numpy as np import gradelib EXAMPLES_DIRECTORY = pathlib.Path(__file__).parent / "examples" GRADESCOPE_EXAMPLE = gradelib.Gradebook.from_gradescope(EXAMPLES_DIRECTORY / "gradescope.csv") CANVAS_EXAMPLE = gradelib.Gradebook.from_canvas(EXAMPLES_DIRECTORY / "canvas.csv") # the canvas example has Lab 01, which is also in Gradescope. Let's remove it CANVAS_WITHOUT_LAB_EXAMPLE = gradelib.Gradebook( points=CANVAS_EXAMPLE.points.drop(columns="lab 01"), maximums=CANVAS_EXAMPLE.maximums.drop(index="lab 01"), late=CANVAS_EXAMPLE.late.drop(columns="lab 01"), dropped=CANVAS_EXAMPLE.dropped.drop(columns="lab 01"), ) # given ROSTER = gradelib.read_egrades_roster(EXAMPLES_DIRECTORY / "egrades.csv") def assert_gradebook_is_sound(gradebook): assert gradebook.points.shape == gradebook.dropped.shape == gradebook.late.shape assert (gradebook.points.columns == gradebook.dropped.columns).all() assert (gradebook.points.columns == gradebook.late.columns).all() assert (gradebook.points.index == gradebook.dropped.index).all() assert (gradebook.points.index == gradebook.late.index).all() assert (gradebook.points.columns == gradebook.maximums.index).all()