Files
win-results/win-results.py
2025-10-15 20:33:30 +02:00

73 lines
2.2 KiB
Python

import json
from prettytable import PrettyTable
def load_data(path="results.json"):
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def is_counted(item):
# Exclude courses not passed or explicitly marked as "Passed" in result field
# Treat empty grade or passed==False as not counted
if not item.get("WH_hasresult", False):
return False
# Do not include pass/fail only results in average
if (item.get("result") or "").strip().lower() == "pass":
return False
grade = (item.get("grade") or "").strip()
if grade == "":
return False
return True
def to_float_grade(g):
try:
return float(g)
except Exception:
return None
def main():
data = load_data()
rows = []
total_weighted = 0.0
total_ects = 0.0
for entry in data:
course = entry.get("course", {})
code = course.get("abbr") or course.get("abbr") or entry.get("id")
name = course.get("name") or course.get("abbr") or entry.get("id")
ects = course.get("ects") or 0
grade_raw = (entry.get("grade") or "").strip()
passed_flag = entry.get("passed")
result_field = entry.get("result") or ""
counted = is_counted(entry)
grade = to_float_grade(grade_raw) if grade_raw else None
rows.append({
"Code": code,
"Course": name,
"ECTS": ects,
"Grade": grade_raw or "",
"Passed flag": passed_flag,
"Result": result_field,
"Counted in average": counted
})
if counted and grade is not None and ects > 0:
total_weighted += grade * ects
total_ects += ects
table = PrettyTable()
table.align = "l"
table.field_names = ["Code", "Course", "ECTS", "Grade", "Result", "Counted in average"]
for r in rows:
table.add_row([r["Code"], r["Course"], r["ECTS"], r["Grade"], r["Result"], "Yes" if r["Counted in average"] else "No"])
print(table)
if total_ects > 0:
average = total_weighted / total_ects
print(f"Weighted average (weighted by ECTS) = {average:.2f}")
else:
print("No counted courses with valid grades to compute an average.")
if __name__ == "__main__":
main()