Coder Social home page Coder Social logo

patrick-5546 / ubc-course-explorer Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 3.0 20.08 MB

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

Python 41.23% HTML 46.37% CSS 8.83% JavaScript 1.44% Dockerfile 0.89% Shell 1.24%
aws django docker gunicorn nginx python website

ubc-course-explorer's People

Contributors

alvinkam33 avatar chrisfong604 avatar ichung08 avatar patrick-5546 avatar

Stargazers

 avatar

Watchers

 avatar

ubc-course-explorer's Issues

Refactor CSS and HTML architecture

Organize the architecture of the code front end HTML and CSS so that future changes/additions are more easily integrated.

E.g

  • Reorganizing stylesheets and bootstrap in the base template HTML so that no styles override each other.

Give credit to copied code and APIs used

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.

Fix Teaching Team Method

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, ...]

Visualize Prerequisite Data

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:

  • See #5 for details on the abstract representation of this field
  • Look at the nested_preq_helper() method in ubcexplorer.py for an example of how this field was recursively created in python
    • You can test the output of this method with different courses by un-commenting the code block under "To test nested prereq tree" and running test.py, or looking at the admin page after navigating to that course's details page
  • this website might be useful, but will have to recursively implement the tree I think
  • Need to fix recursive function to get the children to display on the tree as well (rn it's infinitely recursing)
  • Need to pass key values as URLs for the buttons

Locally store the rest of API data used

Lower priority, but will increase speed of Course object creation and reduce dependency on APIs (so site will still work if APIs change).

Locally stored Course fields:

From UBC Grades
  • course_name
  • average
  • five_year_average
  • standard_deviation
  • latest_grade_distribution
From Rate My Prof (also uses UBC Grades)
  • professors_info
From UBC Explorer
  • prerequisites
  • corequisites
  • dependencies
  • sub_name
  • number_of_credits
  • course_description
  • prerequisites_description
  • corequisites_description
  • course_link

Changes to Professors Info

It would be useful to know historically which sections a professor has taught. Steps:

  1. Add a method in 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
    • Will involve accessing the V1 API: see here for more info
    • The general idea is to cycle through all the year sessions of the course, search for each professors' name, and append the section they taught to their list in the dictionary if the section is not already in the list
      • This is an example output for a year session of a course
  2. Change profsList to profsDict and set it equal to the new method created
  3. Modify get_profs_info() accordingly
    • The parameter is now the output of the new method, so profsDict; profsList is the keyset of profsDict
    • For each professor in profs_info, add the corresponding value from profsDict to the list
  4. Modify the html files accordingly

Clean up Visuals of Course Details Page

Information is there, just needs to be formatted properly. Main issue is that there is not enough width to display all the information without scrolling.
image

Fix Get Nested Prerequisites Method

Uses recursion to get all the prerequisites required for a course, stored in the preq field of Course

Relevant code:

Example

Consider the tree:
image

What should be stored:

{child1: {}, child2: {child21: {}, child22: {}}, child3: {}}

Real Example

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: {}, ...}, ...}}

Visualize Rate My Prof Data

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).

Changes to Grade Profile

Things to consider:

  1. Adding more information; what other information would be useful to have? See available information here
    • Perhaps min and max average
    • Consider adding total number of students for that year
  2. Is historic average even useful? Maybe delete the field. Also move number of credits to grade profile section, and rename grade profile section
  3. Match text width to column. Right now, if the window is resized, text might go out of the column:
    image

Update homepage css design

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.

  • Adjust css styling between the homepage and course page.
  • Make background image completely fill screen
    image
  • Consider adding a preview of search results
    preview

How the homepage currently looks like:
homepage

Fix Profs Field of Course

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

Rewrite Graph Application

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'}]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.