DEV Community

Cover image for Tracking the Spread of COVID-19 at Chicago Public Schools, the 3rd Largest Public School District in the United States
Jakob Ondrey
Jakob Ondrey

Posted on

Tracking the Spread of COVID-19 at Chicago Public Schools, the 3rd Largest Public School District in the United States

Some Background

The Chicago Public School District (CPS) is the 3rd largest school district in the United States [1] serving more than 355,000 students in 642 Schools [2]. On March 13, 2020, with 46 cases of COVID-19 being reported in Illinois, including cases at a CPS school [3], all on-site learning was halted and classes transitioned to a remote model.

As COVID-19 ravaged the United States and the world, the children remained home and everyone adjusted to this new way of learning. The 2020 school year completed remote, and the 2021 school year began remote with a plan for future hybrid learning in the works. With the coming of 2021, CPS pulled the trigger and opened their schools to students who opted in to in person learning with plans in place to make learning safe [4].

While CPS has maintained that they will prioritize the safety of students, teachers, and staff, many question the feasibility of this. Over the Summer, CPS surveyed parents, students, and staff to gauge their desire to return to in-person school. While parents remained relatively split, teachers and staff remain very united in their desire to continue teaching remotely, with only 10.5% of teachers wanting to return to their classrooms [5].

Two pie charts. Chart 1 shows that for parents of K-8th grade students opinions on returning to school, 28.1% say Yes, 40.8% say No, and 31.1% are not sure. Chart 2 shows Teachers opinions on returning to school, 10.5% say Yes, 69.9% say No, and 19.9% are not sure.

Since the Summer, community prevalence of COVID-19 in Chicago has risen [6] yet CPS remains certain of their ability to safely return to school. This transition started January 11, 2021 as CPS schools reopened their doors for Pre-K students who opted for to in-person learning. CPS also had plans to expand this to the elementary students (K-8th) on February 1, 2021, but that was delayed due to push back from the Chicago Teachers Union (CTU) which resulted in Pre-K students and teachers temporarily returning to remote learning.

CPS and the CTU have now agreed on a phased return plan which will have all (opt-in) elementary students returning by March 8 [7].

Grades Teachers Return Students Return
Pre-K February 11 February 11
K-5th February 22 March 1
6th-8th March 1 March 8

The perennially warring factions of parents, teachers, and administrators are unlikely to agree on the how effective CPS's safety interventions are in keeping students and staff safe. However, one thing we can use to measure efficacy and drive our decision making so to whether we think it is safe for our children to be in school is data.

To facilitate this, I have created a CPS COVID-19 dashboard that will display the COVID-19 case data made publicly available by CPS.

Obvious caveats to these data are that CPS will only share "actionable" cases that are reported to them. This means that if a parent doesn't report that their child has a positive test, that child's case will not be in CPS's numbers. It also means that CPS makes a determination as to whether a case is "actionable" suggesting that not all cases reported to CPS will meet a standard to warrant disclosure to their classroom and school and, therefore, will not be added to the case numbers. More information about potential caveats of the data and how to read the data can be found at the FAQ.

The live site can be found at



GitHub Repository

Image of back end architecture1

I built a serverless back-end using the AWS Serverless Application Model (SAM) and have hosted it on AWS. The application consists of:

  • An EventBridge Scheduled Event
  • A Lambda function written in Python that collects and parses new data using Pandas
  • A .csv file updated daily by the Lambda that contains all the data
  • A Cloudwatch alarm that will notify me via SNS if an update fails

Architecture with labels first phase

Every night the Lambda function is triggered by an EventBridge scheduled event. The Lambda function imports both historical data from my S3 bucket and updated data from the CPS spreadsheet into Pandas dataframes.

Architecture with labels second phase

Then the function updates the historical dataframe with a new date and any additional cases that were reported that date. The updated data is then exported back into the S3 bucket for requests by the front end.

In the event of Lambda failure, a CloudWatch alarm is triggered and will notify me via SNS.


GitHub Repository

I built a serverless front-end which is also hosted on AWS and consists of HTML, JavaScript, and CSS (with associated image and data assets) served out of an S3 bucket configured as a static website. DNS and CDN service are also provided by AWS via Route53 and CloudFront.

Image of Main District Page

I utilize both the PapaParse and D3.js JavaScript libraries to load and parse the .csv file serving as my database layer, and use the Leaflet and D3.js libraries for map and graph visualization respectively.

Because I had no interest in generating and maintaining 500+ pages for each school (code is a liability), I use one page for all schools and pass parameters into it through the url. This was my first time working with url parameters and they are pretty cool.

Image of an example of a school's page that is dynamically created by passing the school's name and coordinates into the url


I started this project due to an interest in the CPS COVID-19 numbers and how they will (maybe) respond to the reopening of schools. This all depends on how open the district is with their case data. I hope they continue to do the right thing.

It is also a belated entry for the Challenge run by Forrest Brazeal and the other fine folks at While this project is not at all what they had outlined (you can read that above) it certainly has the soul of an event-driven Python ETL pipeline for processing COVID-19 data.

I hope that it can serve as a tool for those in Chicago (and elsewhere) interested in how COVID-19 might spread following the reopening of a large and diverse school district. There are a number of features that I plan on adding after this initial release, but as with most projects, my interest will depend largely on the interest in the community in using it.

If you find this interesting or useful or want to tell me what I am missing, send me a note on twitter @CPSCovid or add an issue to the appropriate GitHub repository.


  1. List of the largest school districts in the United States by enrollment
  2. Chicago Public Schools - Stats & Facts
  3. Chicago Sun-Times: "Aide at CPS special education high school tests positive for coronavirus, officials say"
  4. Chicago Public Schools - Health & Safety Protocols
  5. Chicago Public Schools - Reopening Framework
  6. Illinois Dept. of Public Health COVID-19 County & School Metrics
  7. Chicago Public Schools - Reopening Home
  8. Chicago Public Schools is reopening after a bitter union fight. Now the hard part begins: Rebuilding trust, and making good on COVID-19 protection vows.
  9. AWS Serverless Application Model (SAM)
  10. Pandas
  11. PapaParse
  12. D3.js
  13. Leaflet

Top comments (0)