Methodology

If you’re just interested in the code:

If you’d like more detail, including on the definition of key metrics and the data’s limitations, read on!

How it’s made

This site relies on a processed version of OC Transpo’s GTFS data. The version of the GTFS data available on April 18, 2025 included both the previous schedule and the (now-)current schedule (the NWTB schedule). This GTFS data undergoes some transformation to create the data used for this site.

Briefly, that data transformation:

  1. Filters the data to focus on trips scheduled to occur on six “representative days”, one for each of “Weekday”, “Saturday”, and “Sunday” for each of the two schedules
    • 2019–2025 (previous): April 11, 12, and 13, 2025
    • NWTB: May 9, 10, and 11, 2025
    • (These days were chosen to avoid holidays and other changes to service, and shopper routes that only occur on other days of the week were manually added to the “weekday” schedules, so they should be reasonably representative.)
  2. Adds some information to each “stop time”, including the “service window” during which it occurs (one of six, based on the O-Train’s service frequency windows)
  3. Normalizes stop information, reducing multi-platform stops (like Tunney’s Pasture and others on the Transitway) to a single item, based on the stop’s code.

(This leads to a few important limitations—see below!)

From there, the site‘s own code takes over. It does a few things:

  1. Generates subsets of the data for each ward, route, and stop (this dramatically increases the number of files enabling the site, but decreases the amount of data and computed per page, making it much speedier on mobile).
  2. Uses Observable Framework (and Plot) to generate the pages you can browse here.

It’s all served by Netlify.

Key metrics

The site reports a few key metrics:

“A particular geography”, depending on the context, could mean “anywhere within a ward”, “across an entire route”, or “at a single stop”. The specific meaning is (hopefully!) always clearly indicated in the chart or table where the metric is reported.

Limitations

Ah, now for the most important part of any data project: what are the limitations of what’s presented here?

Can you use this site or its data to make categorical statements about the change to OC Transpo service levels? Maybe!

I’d encourage you to validate any high-level figures you produce against material OC Transpo itself has put out, certainly for high-level numbers. (See, e.g., Transit Commission meetings from 2024 or 2025. Check the minutes page for each meeting to find the documents used or referenced during those sessions by clicking on the little paperclip beside each item.)

That said, transit providers sometimes use metrics that don’t quite make sense for your day-to-day life, like service hours. This site’s humble contribution is to offer some additional metrics, to broaden our understanding of these changes.


  1. This treats all trips for a given route / direction as equivalent, even if they’re not really—if, say, some trips for a route end at Tunney’s, while others go further, they’ll be treated as equivalent for wait time purposes. ↩︎

  2. This can be helpful to contrast with overall arrival frequency: maybe overall frequency is down, but the average arrival frequency at stops is up, implying that the average stop is “busier”, or better served, than it was previously. ↩︎