From f06cc9e3c712c0cdc90506644f91aadff2090dfd Mon Sep 17 00:00:00 2001 From: phowell Date: Thu, 20 Apr 2023 09:25:23 -0700 Subject: [PATCH] --- stats.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/stats.py b/stats.py index 62bcf53..32aed56 100644 --- a/stats.py +++ b/stats.py @@ -40,6 +40,7 @@ def num(s): return float(s) import json, csv, requests, sys, re +from multiprocessing import Semaphore from statistics import mean, median, stdev from pipelines import fetch, url from courses import getCoursesInTerm @@ -84,6 +85,95 @@ def grades(writer, sem, COURSE_ID, course_code): print("Exception:", e) +schedules = {} + +import codecs, os + +def load_schedules(): + global schedules + if not schedules: + for f in os.listdir('cache/schedule'): + m = re.search(r'(\w\w\d\d)_sched_expanded\.json', f) + if m: + sem = m.group(1) + schedules[sem] = json.loads( codecs.open('cache/schedule/' + f, 'r', 'utf-8').read() ) + +def to_crn_fallback(name): + #print(name) + name = name.lower() + try: + m1 = re.search(r'(\d\d\d\d\d)',name) + if m1: + crn = m1.group(1) + else: + return None,None + m2 = re.search(r'([wispufa][wispufa]\d\d)',name.lower()) + if m2: + sem = m2.group(1) + else: + return None, None + #print(name, crn, sem) + return crn, sem + except Exception as e: + #print("Exception: ", e, name) + return None, None + + + +def short_name_to_crn(name): + #print(name) + try: + parts = name.split(' ') + code = parts[0] + sem = parts[1] + crn = parts[2] + m_sem = re.search(r'^(\w\w\d\d)$',sem) + if not m_sem: + return to_crn_fallback(name) + m = re.search(r'^(\d\d\d\d\d)$',crn) + if m: + return crn,sem + else: + crn_parts = crn.split('/') + m = re.search(r'^(\d\d\d\d\d)$',crn_parts[0]) + if m: + return crn_parts[0],sem + #print("non standard course short name: ", code, sem, crn) + return to_crn_fallback(name) + except Exception as e: + #print("Exception: ", e, name) + return to_crn_fallback(name) + +def short_name_to_teacher(name): + load_schedules() + crn, sem = short_name_to_crn(name) + + try: + if sem: + sem = sem.lower() + if sem[0:2]=='wi': + sem = 'sp' + sem[2:] + for course in schedules[sem]: + if course['crn'] == crn: + return course['teacher'], course['type'] + except Exception as e: + return None + + return None + + + +def nametest(): + with open(all_courses_file) as csvfile: + csvreader = csv.reader(csvfile) + next(csvreader) + + for row in csvreader: + print(row[0], "-", short_name_to_teacher(row[0])) + next(csvreader) + + + def count_above_70(li): pass @@ -360,6 +450,7 @@ def externaltool(): # a list if __name__ == "__main__": options = { 1: ['get all historical grades from ilearn',get_all] , 2: ['process grades csv file',process_grades] , + 3: ['test shortname parse',nametest] , } print ('')