patrick-5546 / ubc-course-explorer Goto Github PK
View Code? Open in Web Editor NEWWeb application that aims to provide a one-stop interface for UBC students to find the course information necessary to plan their study path.
License: MIT License
Web application that aims to provide a one-stop interface for UBC students to find the course information necessary to plan their study path.
License: MIT License
Organize the architecture of the code front end HTML and CSS so that future changes/additions are more easily integrated.
E.g
First part is most essential, write comments above copied code linking source material.
Afterwards, we can make a basic credits page, with the APIs/sources used, our names, etc.
Modify teaching_team()
to return a list of professors' names.
Relevant code:
Example (MATH 220) of what teaching_team()
returns (information about each prof):
[{'campus': 'UBCV', 'course': '220', 'detail': '', 'name': '', 'subject': 'MATH', 'yearsessions': {'1996S': 1, '1996W': 4, '1997S': 1, '1997W': 4, '1998S': 1, '1998W': 4, '1999W': 3, '2000S': 1, '2000W': 4, '2001S': 1, '2001W': 4, '2002S': 1, '2003S': 1, '2004S': 1, '2004W': 3, '2005S': 1, '2006S': 1, '2007S': 1, '2008S': 1, '2008W': 3}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Alexandra Pettet', 'subject': 'MATH', 'yearsessions': {'2013W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Alma Sarai Hernandez Torres', 'subject': 'MATH', 'yearsessions': {'2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Amin Soofiani', 'subject': 'MATH', 'yearsessions': {'2018W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Amir Hossein Parvardi', 'subject': 'MATH', 'yearsessions': {'2018W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'An Ton Bui', 'subject': 'MATH', 'yearsessions': {'2002W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Andrew N Adler', 'subject': 'MATH', 'yearsessions': {'2002W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Andrew Rechnitzer', 'subject': 'MATH', 'yearsessions': {'2007W': 2, '2009W': 1, '2010W': 1, '2011W': 1, '2013W': 1, '2014W': 1, '2015S': 1, '2016S': 1, '2018W': 3}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Asaf Nachmias', 'subject': 'MATH', 'yearsessions': {'2013W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Ashvni Narayanan', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Benjamin Garbuz', 'subject': 'MATH', 'yearsessions': {'2019W': 4}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Boaz Elazar', 'subject': 'MATH', 'yearsessions': {'2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Brett Kolesnik', 'subject': 'MATH', 'yearsessions': {'2016W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Brian Chan', 'subject': 'MATH', 'yearsessions': {'2016W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Charlotte Trainor', 'subject': 'MATH', 'yearsessions': {'2018W': 1, '2019W': 4}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'David Steinberg', 'subject': 'MATH', 'yearsessions': {'2012W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Dragos Ghioca', 'subject': 'MATH', 'yearsessions': {'2010W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'EKATERINA YURASOVSKAYA', 'subject': 'MATH', 'yearsessions': {'2012S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Edwin Perkins', 'subject': 'MATH', 'yearsessions': {'2002W': 1, '2012W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Elyse Yeager', 'subject': 'MATH', 'yearsessions': {'2016W': 1, '2019S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Eric Rozon', 'subject': 'MATH', 'yearsessions': {'2019W': 4}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Ethan White', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Gabriel Emery Currier', 'subject': 'MATH', 'yearsessions': {'2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Gregory Martin', 'subject': 'MATH', 'yearsessions': {'2002W': 1, '2017W': 2, '2019W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Itay Londner', 'subject': 'MATH', 'yearsessions': {'2019W': 1, '2020S': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Izabella Laba', 'subject': 'MATH', 'yearsessions': {'2011W': 1, '2013W': 1, '2014W': 3, '2015W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Jamie Juul', 'subject': 'MATH', 'yearsessions': {'2018W': 2, '2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Jiahao Gong', 'subject': 'MATH', 'yearsessions': {'2020S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Jingyi Chen', 'subject': 'MATH', 'yearsessions': {'2005W': 2, '2006W': 1, '2009W': 1, '2013W': 1, '2014W': 2, '2015W': 3, '2016W': 6, '2017W': 6, '2019W': 8, '2020S': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Jongchon Kim', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Julia Yulia Gordon', 'subject': 'MATH', 'yearsessions': {'2012W': 1, '2015W': 4, '2016W': 1, '2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Jun Jie Jameson Zhu', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Keegan Boyle', 'subject': 'MATH', 'yearsessions': {'2020S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Keqin Liu', 'subject': 'MATH', 'yearsessions': {'2002W': 1, '2003W': 1, '2009W': 1, '2012W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Krishanu Sankar', 'subject': 'MATH', 'yearsessions': {'2017W': 1, '2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Kyle Macdonald', 'subject': 'MATH', 'yearsessions': {'2019S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Laura Scull', 'subject': 'MATH', 'yearsessions': {'2006W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Leo Rosales', 'subject': 'MATH', 'yearsessions': {'2007W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Mahta Khosravi', 'subject': 'MATH', 'yearsessions': {'2010S': 1, '2011W': 1, '2014W': 2, '2015W': 2, '2016W': 3, '2017S': 1, '2017W': 3}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Manuel Ruivo De Oliveira', 'subject': 'MATH', 'yearsessions': {'2019W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Martin Barlow', 'subject': 'MATH', 'yearsessions': {'2005W': 1, '2007W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Max Gheorghiu', 'subject': 'MATH', 'yearsessions': {'2019W': 5}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Maxime Bergeron', 'subject': 'MATH', 'yearsessions': {'2015W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Nathaniel Bade', 'subject': 'MATH', 'yearsessions': {'2016W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Nina Morishige', 'subject': 'MATH', 'yearsessions': {'2019W': 1, '2020S': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Niny Arcila Maya', 'subject': 'MATH', 'yearsessions': {'2017W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Omer Angel', 'subject': 'MATH', 'yearsessions': {'2010W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Patrick Brosnan', 'subject': 'MATH', 'yearsessions': {'2006W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Philip Loewen', 'subject': 'MATH', 'yearsessions': {'2009S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Prajeet Bajpai', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Rachel Ollivier', 'subject': 'MATH', 'yearsessions': {'2018S': 1, '2018W': 4, '2019W': 5}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Rajiv Gupta', 'subject': 'MATH', 'yearsessions': {'2003W': 2, '2010W': 1, '2011W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Samantha Dahlberg', 'subject': 'MATH', 'yearsessions': {'2016W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Sandra Merchant', 'subject': 'MATH', 'yearsessions': {'2013S': 1, '2015S': 1, '2016S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Santanil Jana', 'subject': 'MATH', 'yearsessions': {'2019W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Seckin Demirbas', 'subject': 'MATH', 'yearsessions': {'2016W': 1, '2017W': 2, '2018W': 2, '2019W': 2}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Simon Rose', 'subject': 'MATH', 'yearsessions': {'2011S': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Simone Coccia', 'subject': 'MATH', 'yearsessions': {'2019W': 5}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Simone Maletto', 'subject': 'MATH', 'yearsessions': {'2019W': 5}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Subhajit Jana', 'subject': 'MATH', 'yearsessions': {'2014W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Vedang Vyas', 'subject': 'MATH', 'yearsessions': {'2014W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Yu-Hsiang Liu', 'subject': 'MATH', 'yearsessions': {'2018W': 1}}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'name': 'Zoe Hamel', 'subject': 'MATH', 'yearsessions': {'2014W': 1}}]
What it should return (only the professors' names):
[Alexandra Pettet, Alma Sarai Hernandez Torres, Amin Soofiani, ...]
Use the preq
field of Course
to display a tree chart of prerequisites for a course in its details page.
Example of the prerequisites
field from MATH 256:
{'MATH 101': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 103': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 105': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 121': {'MATH 120': {}, 'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 180': {}, 'MATH 184': {}}, 'SCIE 001': {}, 'MATH 152': {}, 'MATH 221': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}, 'MATH 101': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 103': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 105': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 121': {'MATH 120': {}, 'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 180': {}, 'MATH 184': {}}, 'SCIE 001': {}}, 'MATH 223': {'MATH 121': {'MATH 120': {}, 'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 101': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 103': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'MATH 105': {'MATH 100': {}, 'MATH 102': {}, 'MATH 104': {}, 'MATH 110': {}, 'MATH 120': {}, 'MATH 180': {}, 'MATH 184': {}}, 'SCIE 001': {}}}
Use this dictionary to recursively create a binary tree in html:
nested_preq_helper()
method in ubcexplorer.py
for an example of how this field was recursively created in python
test.py
, or looking at the admin page after navigating to that course's details pageUpdate coursetracker
html templates to match the information that Course
stores (TBD). Note: will probably have to create another application for the "Course Professor" section. My idea is to have the list of professors for the course, and be able to sort by rating and number of ratings.
Relevant code:
Lower priority, but will increase speed of Course
object creation and reduce dependency on APIs (so site will still work if APIs change).
Course
fields:course_name
average
five_year_average
standard_deviation
latest_grade_distribution
professors_info
prerequisites
corequisites
dependencies
sub_name
number_of_credits
course_description
prerequisites_description
corequisites_description
course_link
It would be useful to know historically which sections a professor has taught. Steps:
ubcgrades
that takes the output of teaching_team()
(list of professor names) and returns a dictionary where the keys are the professor names and values are a list of sections they taught
profsList
to profsDict
and set it equal to the new method createdget_profs_info()
accordingly
profsDict
; profsList
is the keyset of profsDict
profs_info
, add the corresponding value from profsDict
to the listUses recursion to get all the prerequisites required for a course, stored in the preq
field of Course
Relevant code:
What should be stored:
{child1: {}, child2: {child21: {}, child22: {}}, child3: {}}
Immediate prerequisites of MATH 256 (under key preq
in dictionary that course_info()
returns):
['MATH 101', 'MATH 103', 'MATH 105', 'MATH 121', 'SCIE 001', 'MATH 152', 'MATH 221', 'MATH 223']
Prerequisites of MATH 223 include MATH 121. Prerequisites of MATH 121 include MATH 120 and MATH 100.
What course_info_with_prereq_tree("MATH", "256")
should return:
{..., MATH 223: {MATH 121: {MATH 120: {}, MATH 100: {}, ...}, ...}}
Whenever the information that Course
stores is changed, run a script that will replace the outdated model instances with ones that have the new changes.
As mentioned in #2 , the data from Rate My Prof is different from the first project.
Example of professors_info
field from CPEN 221:
[['Gabrielle Lam', '3.5', 4], ['Jonathan Verrett':, 4.7', 11], ['Naoko Ellis', '2.1', 21], ['Peter Ostafichuk', '4.5', 34], ['Sathish Gopalakrishnan', '3.5', 49]]
Use this list of lists to create a scrollable table in html, where you can sort by the fields (name, rating, and number of ratings).
Things to consider:
Homepage could use some update, especially in terms of the font styling and animations. Consider making the page responsive and could also look into setting it up for mobile phones too.
Write a method in ratemyprof.py
that returns the rating and number of ratings for each professor in a list.
Example input: list of professor names
[Alexandra Pettet, Alma Sarai Hernandez Torres, Amin Soofiani]
Example output: dictionary of professor names mapping to a list with their rating and number of ratings
[{'Alexandra Pettet': [3.1, 12]}, {'Alma Sarai Hernandez Torres': [4.5, 122]}, {'Amin Soofiani': [0.9, 9000]}]
Use this output to initialize the profs
field of Course
To get Rate My Prof data in a reasonable amount of time, will have to do something about this variable. Currently, if the variable is imported, initializing the server takes a long time. Exact method TBD.
Update the graph application, used to display grade distributions on a course's details page, to use the information that Course
stores. Consider adding the feature of toggling between different years.
Relevant code:
Example (MATH 220) of what Course
currently stores in distributions
:
[{'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 0, '30-39%': 0, '40-49%': 0, '50-54%': 1, '55-59%': 1, '60-63%': 5, '64-67%': 2, '68-71%': 2, '72-75%': 2, '76-79%': 2, '80-84%': 0, '85-89%': 3, '90-100%': 4, '<50%': 0}, 'session': 'S', 'subject': 'MATH', 'year': '1996'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 4, '10-19%': 1, '20-29%': 3, '30-39%': 8, '40-49%': 6, '50-54%': 10, '55-59%': 9, '60-63%': 17, '64-67%': 7, '68-71%': 8, '72-75%': 6, '76-79%': 2, '80-84%': 8, '85-89%': 5, '90-100%': 4, '<50%': 22}, 'session': 'W', 'subject': 'MATH', 'year': '1996'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 3, '10-19%': 0, '20-29%': 0, '30-39%': 2, '40-49%': 1, '50-54%': 1, '55-59%': 0, '60-63%': 2, '64-67%': 1, '68-71%': 3, '72-75%': 1, '76-79%': 0, '80-84%': 3, '85-89%': 0, '90-100%': 1, '<50%': 6}, 'session': 'S', 'subject': 'MATH', 'year': '1997'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 2, '20-29%': 3, '30-39%': 9, '40-49%': 14, '50-54%': 15, '55-59%': 7, '60-63%': 9, '64-67%': 13, '68-71%': 9, '72-75%': 12, '76-79%': 13, '80-84%': 12, '85-89%': 5, '90-100%': 6, '<50%': 29}, 'session': 'W', 'subject': 'MATH', 'year': '1997'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 0, '20-29%': 0, '30-39%': 2, '40-49%': 0, '50-54%': 3, '55-59%': 1, '60-63%': 1, '64-67%': 1, '68-71%': 2, '72-75%': 1, '76-79%': 1, '80-84%': 5, '85-89%': 2, '90-100%': 0, '<50%': 3}, 'session': 'S', 'subject': 'MATH', 'year': '1998'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 1, '20-29%': 2, '30-39%': 7, '40-49%': 4, '50-54%': 15, '55-59%': 7, '60-63%': 11, '64-67%': 7, '68-71%': 8, '72-75%': 14, '76-79%': 6, '80-84%': 11, '85-89%': 4, '90-100%': 5, '<50%': 15}, 'session': 'W', 'subject': 'MATH', 'year': '1998'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 0, '20-29%': 4, '30-39%': 6, '40-49%': 7, '50-54%': 16, '55-59%': 11, '60-63%': 21, '64-67%': 12, '68-71%': 16, '72-75%': 13, '76-79%': 6, '80-84%': 9, '85-89%': 12, '90-100%': 19, '<50%': 18}, 'session': 'W', 'subject': 'MATH', 'year': '1999'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 2, '10-19%': 0, '20-29%': 0, '30-39%': 1, '40-49%': 1, '50-54%': 1, '55-59%': 1, '60-63%': 2, '64-67%': 5, '68-71%': 3, '72-75%': 4, '76-79%': 2, '80-84%': 2, '85-89%': 5, '90-100%': 1, '<50%': 4}, 'session': 'S', 'subject': 'MATH', 'year': '2000'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 2, '10-19%': 4, '20-29%': 5, '30-39%': 8, '40-49%': 6, '50-54%': 24, '55-59%': 12, '60-63%': 14, '64-67%': 7, '68-71%': 13, '72-75%': 6, '76-79%': 4, '80-84%': 12, '85-89%': 8, '90-100%': 9, '<50%': 25}, 'session': 'W', 'subject': 'MATH', 'year': '2000'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 0, '20-29%': 1, '30-39%': 0, '40-49%': 1, '50-54%': 8, '55-59%': 2, '60-63%': 6, '64-67%': 5, '68-71%': 8, '72-75%': 4, '76-79%': 2, '80-84%': 6, '85-89%': 2, '90-100%': 3, '<50%': 3}, 'session': 'S', 'subject': 'MATH', 'year': '2001'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 3, '20-29%': 8, '30-39%': 20, '40-49%': 16, '50-54%': 19, '55-59%': 24, '60-63%': 9, '64-67%': 9, '68-71%': 11, '72-75%': 8, '76-79%': 6, '80-84%': 12, '85-89%': 2, '90-100%': 9, '<50%': 48}, 'session': 'W', 'subject': 'MATH', 'year': '2001'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 2, '10-19%': 1, '20-29%': 1, '30-39%': 0, '40-49%': 4, '50-54%': 7, '55-59%': 7, '60-63%': 4, '64-67%': 1, '68-71%': 0, '72-75%': 2, '76-79%': 3, '80-84%': 5, '85-89%': 4, '90-100%': 2, '<50%': 8}, 'session': 'S', 'subject': 'MATH', 'year': '2002'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 2, '20-29%': 5, '30-39%': 6, '40-49%': 10, '50-54%': 20, '55-59%': 14, '60-63%': 18, '64-67%': 10, '68-71%': 14, '72-75%': 5, '76-79%': 10, '80-84%': 14, '85-89%': 9, '90-100%': 11, '<50%': 24}, 'session': 'W', 'subject': 'MATH', 'year': '2002'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 0, '30-39%': 0, '40-49%': 2, '50-54%': 6, '55-59%': 8, '60-63%': 5, '64-67%': 6, '68-71%': 8, '72-75%': 8, '76-79%': 6, '80-84%': 4, '85-89%': 3, '90-100%': 1, '<50%': 2}, 'session': 'S', 'subject': 'MATH', 'year': '2003'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 9, '30-39%': 10, '40-49%': 20, '50-54%': 26, '55-59%': 25, '60-63%': 17, '64-67%': 9, '68-71%': 9, '72-75%': 8, '76-79%': 6, '80-84%': 14, '85-89%': 3, '90-100%': 7, '<50%': 39}, 'session': 'W', 'subject': 'MATH', 'year': '2003'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 2, '30-39%': 6, '40-49%': 9, '50-54%': 6, '55-59%': 9, '60-63%': 12, '64-67%': 3, '68-71%': 4, '72-75%': 6, '76-79%': 6, '80-84%': 0, '85-89%': 3, '90-100%': 2, '<50%': 17}, 'session': 'S', 'subject': 'MATH', 'year': '2004'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 1, '20-29%': 11, '30-39%': 13, '40-49%': 18, '50-54%': 19, '55-59%': 18, '60-63%': 14, '64-67%': 13, '68-71%': 18, '72-75%': 11, '76-79%': 4, '80-84%': 11, '85-89%': 5, '90-100%': 3, '<50%': 43}, 'session': 'W', 'subject': 'MATH', 'year': '2004'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 2, '30-39%': 4, '40-49%': 1, '50-54%': 7, '55-59%': 4, '60-63%': 0, '64-67%': 5, '68-71%': 2, '72-75%': 5, '76-79%': 2, '80-84%': 3, '85-89%': 3, '90-100%': 6, '<50%': 7}, 'session': 'S', 'subject': 'MATH', 'year': '2005'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 9, '30-39%': 16, '40-49%': 8, '50-54%': 30, '55-59%': 14, '60-63%': 11, '64-67%': 11, '68-71%': 15, '72-75%': 5, '76-79%': 5, '80-84%': 7, '85-89%': 2, '90-100%': 6, '<50%': 33}, 'session': 'W', 'subject': 'MATH', 'year': '2005'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 0, '20-29%': 1, '30-39%': 5, '40-49%': 6, '50-54%': 7, '55-59%': 4, '60-63%': 2, '64-67%': 2, '68-71%': 0, '72-75%': 2, '76-79%': 1, '80-84%': 5, '85-89%': 3, '90-100%': 5, '<50%': 13}, 'session': 'S', 'subject': 'MATH', 'year': '2006'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 1, '20-29%': 6, '30-39%': 18, '40-49%': 17, '50-54%': 30, '55-59%': 28, '60-63%': 14, '64-67%': 9, '68-71%': 15, '72-75%': 10, '76-79%': 5, '80-84%': 9, '85-89%': 4, '90-100%': 7, '<50%': 42}, 'session': 'W', 'subject': 'MATH', 'year': '2006'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 1, '20-29%': 1, '30-39%': 1, '40-49%': 5, '50-54%': 6, '55-59%': 2, '60-63%': 2, '64-67%': 5, '68-71%': 1, '72-75%': 6, '76-79%': 0, '80-84%': 3, '85-89%': 1, '90-100%': 6, '<50%': 8}, 'session': 'S', 'subject': 'MATH', 'year': '2007'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 1, '10-19%': 0, '20-29%': 4, '30-39%': 10, '40-49%': 24, '50-54%': 15, '55-59%': 30, '60-63%': 17, '64-67%': 16, '68-71%': 11, '72-75%': 11, '76-79%': 7, '80-84%': 15, '85-89%': 3, '90-100%': 8, '<50%': 39}, 'session': 'W', 'subject': 'MATH', 'year': '2007'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 2, '20-29%': 2, '30-39%': 5, '40-49%': 4, '50-54%': 2, '55-59%': 3, '60-63%': 3, '64-67%': 4, '68-71%': 7, '72-75%': 4, '76-79%': 1, '80-84%': 3, '85-89%': 0, '90-100%': 3, '<50%': 13}, 'session': 'S', 'subject': 'MATH', 'year': '2008'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 1, '20-29%': 5, '30-39%': 15, '40-49%': 21, '50-54%': 15, '55-59%': 21, '60-63%': 25, '64-67%': 10, '68-71%': 13, '72-75%': 11, '76-79%': 4, '80-84%': 9, '85-89%': 5, '90-100%': 3, '<50%': 42}, 'session': 'W', 'subject': 'MATH', 'year': '2008'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 3, '30-39%': 2, '40-49%': 8, '50-54%': 11, '55-59%': 4, '60-63%': 2, '64-67%': 1, '68-71%': 1, '72-75%': 5, '76-79%': 4, '80-84%': 1, '85-89%': 2, '90-100%': 5, '<50%': 13}, 'session': 'S', 'subject': 'MATH', 'year': '2009'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 2, '10-19%': 0, '20-29%': 6, '30-39%': 13, '40-49%': 21, '50-54%': 29, '55-59%': 28, '60-63%': 23, '64-67%': 14, '68-71%': 18, '72-75%': 13, '76-79%': 8, '80-84%': 7, '85-89%': 6, '90-100%': 7, '<50%': 42}, 'session': 'W', 'subject': 'MATH', 'year': '2009'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 4, '30-39%': 2, '40-49%': 5, '50-54%': 7, '55-59%': 5, '60-63%': 3, '64-67%': 3, '68-71%': 4, '72-75%': 1, '76-79%': 3, '80-84%': 4, '85-89%': 2, '90-100%': 5, '<50%': 11}, 'session': 'S', 'subject': 'MATH', 'year': '2010'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 10, '30-39%': 16, '40-49%': 25, '50-54%': 38, '55-59%': 31, '60-63%': 16, '64-67%': 18, '68-71%': 16, '72-75%': 19, '76-79%': 9, '80-84%': 10, '85-89%': 9, '90-100%': 13, '<50%': 51}, 'session': 'W', 'subject': 'MATH', 'year': '2010'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 1, '20-29%': 2, '30-39%': 0, '40-49%': 8, '50-54%': 5, '55-59%': 5, '60-63%': 4, '64-67%': 5, '68-71%': 6, '72-75%': 1, '76-79%': 1, '80-84%': 4, '85-89%': 2, '90-100%': 1, '<50%': 11}, 'session': 'S', 'subject': 'MATH', 'year': '2011'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 0, '30-39%': 7, '40-49%': 16, '50-54%': 24, '55-59%': 15, '60-63%': 19, '64-67%': 14, '68-71%': 25, '72-75%': 14, '76-79%': 20, '80-84%': 23, '85-89%': 18, '90-100%': 12, '<50%': 23}, 'session': 'W', 'subject': 'MATH', 'year': '2011'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 1, '30-39%': 5, '40-49%': 5, '50-54%': 4, '55-59%': 7, '60-63%': 4, '64-67%': 4, '68-71%': 1, '72-75%': 6, '76-79%': 0, '80-84%': 4, '85-89%': 4, '90-100%': 8, '<50%': 11}, 'session': 'S', 'subject': 'MATH', 'year': '2012'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 4, '30-39%': 6, '40-49%': 11, '50-54%': 18, '55-59%': 16, '60-63%': 24, '64-67%': 24, '68-71%': 23, '72-75%': 19, '76-79%': 10, '80-84%': 24, '85-89%': 15, '90-100%': 27, '<50%': 21}, 'session': 'W', 'subject': 'MATH', 'year': '2012'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 0, '10-19%': 0, '20-29%': 0, '30-39%': 0, '40-49%': 6, '50-54%': 2, '55-59%': 0, '60-63%': 2, '64-67%': 2, '68-71%': 3, '72-75%': 0, '76-79%': 2, '80-84%': 7, '85-89%': 2, '90-100%': 5, '<50%': 6}, 'session': 'S', 'subject': 'MATH', 'year': '2013'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': 3, '10-19%': 1, '20-29%': 3, '30-39%': 14, '40-49%': 29, '50-54%': 25, '55-59%': 24, '60-63%': 40, '64-67%': 43, '68-71%': 34, '72-75%': 50, '76-79%': 23, '80-84%': 39, '85-89%': 29, '90-100%': 36, '<50%': 50}, 'session': 'W', 'subject': 'MATH', 'year': '2013'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 38, '55-59%': 39, '60-63%': 27, '64-67%': 42, '68-71%': 45, '72-75%': 41, '76-79%': 26, '80-84%': 35, '85-89%': 31, '90-100%': 35, '<50%': 56}, 'session': 'W', 'subject': 'MATH', 'year': '2014'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 8, '55-59%': 5, '60-63%': '', '64-67%': '', '68-71%': 9, '72-75%': 9, '76-79%': '', '80-84%': 9, '85-89%': 7, '90-100%': '', '<50%': 7}, 'session': 'S', 'subject': 'MATH', 'year': '2015'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 47, '55-59%': 57, '60-63%': 50, '64-67%': 40, '68-71%': 54, '72-75%': 47, '76-79%': 34, '80-84%': 51, '85-89%': 36, '90-100%': 66, '<50%': 63}, 'session': 'W', 'subject': 'MATH', 'year': '2015'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 5, '55-59%': 6, '60-63%': '', '64-67%': '', '68-71%': '', '72-75%': 7, '76-79%': '', '80-84%': 7, '85-89%': '', '90-100%': '', '<50%': 7}, 'session': 'S', 'subject': 'MATH', 'year': '2016'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 64, '55-59%': 67, '60-63%': 53, '64-67%': 52, '68-71%': 57, '72-75%': 53, '76-79%': 29, '80-84%': 60, '85-89%': 36, '90-100%': 35, '<50%': 50}, 'session': 'W', 'subject': 'MATH', 'year': '2016'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': '', '55-59%': '', '60-63%': '', '64-67%': 6, '68-71%': 5, '72-75%': 5, '76-79%': '', '80-84%': 5, '85-89%': '', '90-100%': '', '<50%': ''}, 'session': 'S', 'subject': 'MATH', 'year': '2017'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 61, '55-59%': 53, '60-63%': 58, '64-67%': 55, '68-71%': 73, '72-75%': 63, '76-79%': 43, '80-84%': 55, '85-89%': 32, '90-100%': 30, '<50%': 60}, 'session': 'W', 'subject': 'MATH', 'year': '2017'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': '', '55-59%': 8, '60-63%': 7, '64-67%': 9, '68-71%': '', '72-75%': '', '76-79%': 6, '80-84%': '', '85-89%': '', '90-100%': '', '<50%': ''}, 'session': 'S', 'subject': 'MATH', 'year': '2018'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 88, '55-59%': 91, '60-63%': 50, '64-67%': 30, '68-71%': 76, '72-75%': 55, '76-79%': 37, '80-84%': 41, '85-89%': 17, '90-100%': 27, '<50%': 105}, 'session': 'W', 'subject': 'MATH', 'year': '2018'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 7, '55-59%': '', '60-63%': '', '64-67%': '', '68-71%': '', '72-75%': '', '76-79%': '', '80-84%': '', '85-89%': '', '90-100%': '', '<50%': 10}, 'session': 'S', 'subject': 'MATH', 'year': '2019'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 61, '55-59%': 55, '60-63%': 42, '64-67%': 62, '68-71%': 57, '72-75%': 69, '76-79%': 37, '80-84%': 82, '85-89%': 49, '90-100%': 47, '<50%': 48}, 'session': 'W', 'subject': 'MATH', 'year': '2019'}, {'campus': 'UBCV', 'course': '220', 'detail': '', 'grades': {'0-9%': '', '10-19%': '', '20-29%': '', '30-39%': '', '40-49%': '', '50-54%': 11, '55-59%': 10, '60-63%': 11, '64-67%': 13, '68-71%': 6, '72-75%': 12, '76-79%': 10, '80-84%': 13, '85-89%': 9, '90-100%': 8, '<50%': 15}, 'session': 'S', 'subject': 'MATH', 'year': '2020'}]
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.