73 lines
2.2 KiB
Python
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()
|