Gradebook: Manage student grades, calculate statistics, and export reports
from pytica.gradebook import Gradebook
Attendance: Track attendance records and summaries
from pytica.attendance import Attendance
Insights: Generate performance analytics
from pytica.insights import Insights
Visualizer: Create charts and graphs
from pytica.visualizer import Visualizer
Report: Generate comprehensive reports
from pytica.report import Report
Add Students
# add_students.py
from pytica.gradebook import Gradebook
gb = Gradebook()
gb.add_student("Alice")
gb.add_student("Bob")
print("Students added:", gb.get_students())
Expected Output:
Students added: ['Alice', 'Bob']
Explanation:
Gradebook() initializes an empty gradebook.
add_student("Alice") creates a new row in the data.
Add Grades
gb.add_grade("Alice", "Math", 95)
gb.add_grade("Alice", "Science", 90)
print("Alice's Grades:", gb.get_grades("Alice"))
Expected Output:
Alice's Grades: {'Math': 95, 'Science': 90}
Explanation:
add_grade(student, subject, grade) adds a grade under the given subject.
get_grades("Alice") returns a dictionary of subjects and grades.
Update a Grade
gb.update_grade("Alice", "Math", 98) #update grade
print("Updated Grades:", gb.get_grades("Alice"))
Expected Output:
Updated Grades: {'Math': 98}
Explanation:
update_grade checks if the student and subject exist, then updates the grade.
Remove Students
gb.remove_student("Alice") #remove student
print(gb.get_students())
Expected Output:
['Bob']
Explanation:
remove_student deletes the row corresponding to the student.
get_students() lists all students currently in the gradebook.
Class Average and Top Students
# top_students.py
from pytica.gradebook import Gradebook
gb = Gradebook()
gb.add_student("Alice")
gb.add_student("Charlie")
gb.add_grade("Alice", "Math", 98)
gb.add_grade("Alice", "English", 89)
gb.add_grade("Charlie", "Math", 80)
gb.add_grade("Charlie", "English", 70)
print(gb.class_average()) #Output: 84.25
print(gb.top_students(n=2)) #Output: ['Alice', 'Charlie']
Expected Output:
84.25
['Alice', 'Charlie']
Explanation:
class_average() calculates the average of all numeric grades.
top_students(n) sorts students by average grade and returns the top N students.
Student Progress
progress = gb.student_progress("Charlie")
print(progress)
Expected Output:
{'trend': 'downward', 'improvement': '-10'}
Explanation:
student_progress(student) checks the first and last grades.
Returns a dictionary with 'trend' (upward, downward, flat) and 'improvement' (numeric change).
Mark Attendance
# mark_attendance.py
from pytica.attendance import Attendance
att = Attendance()
att.add_student("Alice")
att.mark_present("Alice", "2025-09-01") #mark attendance
att.mark_absent("Alice", "2025-09-02")
print(att.present_report("Alice"))
Expected Output:
Alice was present 1 times
Explanation:
mark_present adds “P” for present, mark_absent adds “A” for absent.
present_report counts all “P” marks for the student.
Delete Mark
att.delete_mark("Alice", "2025-09-02")
print(att.absent_report("Alice"))
Expected Output:
Alice was absent 0 times
Explanation:
delete_mark removes a mark for a specific date.
absent_report counts all “A” marks for the student.
Attendance Percentage
#attendance_percentage.py
from pytica.attendance import Attendance
att = Attendance()
att.add_student("Alice")
att.mark_present("Alice", "2025-09-01") #1 present, 0 absent
def attendance_percentage(att, student):
row = att.data[att.data["Name"] == student].iloc[0,1:]
total = len(row)
present = row.eq("P").sum()
return round((present/total)*100, 2) if total>0 else 0
print(attendance_percentage(att, "Alice"))
Expected Output:
100.0
Explanation:
Converts attendance marks to a percentage.
Uses .eq("P").sum() to count present days.
Struggling Students
#struggling.py
from pytica.gradebook import Gradebook
from pytica.insights import Insights
gb = Gradebook()
gb.add_student("Alice")
gb.add_student("Charlie")
gb.add_grade("Alice", "Math", 98)
gb.add_grade("Alice", "English", 89)
gb.add_grade("Charlie", "Math", 80)
gb.add_grade("Charlie", "English", 70)
ins = Insights(data=gb.data)
print(ins.struggling_students(threshold=80))
Expected Output:
['Charlie']
Explanation:
Students with Average below 80 are returned.
Average is calculated automatically if missing.
Improving Students
ins = Insights(data=gb.data)
print(ins.improving_students()) #code for improving students
Expected Output:
[ ]
Explanation:
Compares first and last assessment for each student.
Returns students whose scores are increasing.
Declining Students
gb.update_grade("Charlie", "English", 60)
ins = Insights(data=gb.data)
print(ins.declining_students())
Expected Output:
['Charlie']
Explanation:
Compares first and last assessment.
Returns students whose scores are decreasing.
Student Progress Plot
# progress.py
from pytica.gradebook import Gradebook
from pytica.insights import Insights
from pytica.visualizer import Visualizer
from pytica.report import Report
from pytica.attendance import Attendance
att = Attendance()
gb = Gradebook()
gb.add_student("Alice")
gb.add_student("Charlie")
gb.add_grade("Alice", "Math", 98)
gb.add_grade("Alice", "English", 99)
gb.add_grade("Charlie", "Math", 80)
gb.add_grade("Charlie", "English", 70)
gb.update_grade("Charlie", "English", 60)
viz = Visualizer(data=gb.data)
viz.plot_student_progress("Alice")
Expected Output:
Explanation:
Plots a line chart of all grades for a single student.
Uses Matplotlib with markers, labels, and grid.
Class Average Plot
# class_average.py
viz = Visualizer(data=gb.data)
viz.plot_class_average()
Expected Output:
Explanation:
Plots average scores for all assessments.
Generate Excel Report
# generate_excel.py
from pytica.gradebook import Gradebook
from pytica.insights import Insights
from pytica.visualizer import Visualizer
from pytica.report import Report
from pytica.attendance import Attendance
att = Attendance()
gb = Gradebook()
gb.add_student("Alice")
gb.add_student("Charlie")
gb.add_grade("Alice", "Math", 98)
gb.add_grade("Alice", "English", 99)
gb.add_grade("Charlie", "Math", 80)
gb.add_grade("Charlie", "English", 70)
gb.update_grade("Charlie", "English", 60)
report = Report(data=gb.data, attendance=att)
report.generate_excel("grades_report.xlsx")
Explanation:
Exports combined grades and attendance to Excel.
Generate PDF Report
# generate_pdf.py
report = Report(data=gb.data, attendance=att)
report.generate_pdf("grades_report.pdf")
Explanation:
Generates a PDF with class average and student charts.
Generate Image Charts
# generate_image.py
report = Report(data=gb.data, attendance=att)
report.generate_images()
Explanation:
Saves PNG images for class average and each student's progress.
Can be used for web or presentations.