At a K-12 online learning provider, 2025 to now
Forecasts that keep score
Every Friday I predicted how much student work would still be waiting to be graded on Monday, and wrote down in advance what result would prove me wrong. On Monday I checked, and kept a scorecard of hits and misses.
- Role
- Wrote and scored every forecast
- Time
- September 2026 to now
- Tools
- Python
- Outcome
- Two of five forecasts landed inside their range, and each miss improved the method
Problem
I work at a K-12 online learning provider: schools in the US and abroad partner with us so their students can take courses online. When students hand in assignments, a team of staff grades them, and we aim to grade each one within a set time. Handed-in work waits in a shared list, a “queue”, until someone grades it.
Weekends are the hardest stretch to plan: students keep handing in work, but fewer people are grading. The team’s leads wanted to know on Friday how much would still be waiting on Monday morning, so they could plan who grades what.
Constraints
- I had only one count of the queue per day, taken at slightly different times.
- How much the team grades over a weekend changes from week to week.
- The prediction had to be ready before Friday ended, and honest about how sure it was.
What I built
A Friday forecast, written in Python. It starts from one simple fact: anything waiting on Friday that is not graded over the weekend will still be waiting on Monday. The hard part is predicting how much the weekend clears.
Each forecast gives a range rather than one number, lists its assumptions, and states in advance which Monday result would prove it wrong. My first forecast broke two of my own rules: I typed its numbers in by hand, and I narrowed its range, which made it look more certain than it was. After that, every number came straight from the saved daily counts, every range was widened rather than narrowed, and every forecast was a script. On Monday, the check first re-runs Friday’s script to confirm it gives exactly the same answer, and only then scores it.
Before the forecasts, I did the analysis behind a one-week push, co-led with a manager on my team, to bring the weekend workload down.
The diagram in words
- Daily queue snapshot, Saved copy, Forecast script, Range plus the rule that would prove it wrong, then "Friday" to Team leads.
- Monday snapshot, Inside the range?
- Solid path: Scorecard: hit.
- Dashed path: Scorecard: miss, Model change, then back to Forecast script.
- Scorecard, five weekends: miss above, hit, hit, miss below, miss above.
How I proved it worked, and where it did not
Every Monday I took the first morning count and scored Friday’s forecast against its own rule. The scorecard keeps every miss.
- First idea: the weekend clears a fixed amount. The first forecast assumed the team grades about the same amount every weekend. I already knew this was shaky: two past weekends fit three different explanations equally well, and those explanations disagreed by a factor of three. Monday came in far above the range, which ruled the idea out.
- Second idea: the weekend clears a fixed share. I switched to assuming the weekend clears a steady share of whatever is waiting on Friday. That held twice, missed once just below its range, and missed once well above it, right after the biggest Friday total since I adopted it.
- A miss I had warned about in advance. That weekend, the amount graded stayed flat while Friday’s total grew by more than half, so more was still waiting on Monday. The forecast’s written rule had said this would happen if weekend grading does not grow with the workload.
Outcome
- Two of five forecasts landed inside their range. The record is shown as it is.
- Each miss improved the method: the fixed-amount idea was dropped first, then the fixed-share rule was marked unsafe after a big Friday.
- Every forecast can be re-run from its saved numbers, so any disagreement is about the method, never about which numbers were used.
What I would do next
- Forecast each subject team separately: spare time on the math team cannot grade a science assignment.
- Publish a chart showing how often each forecast range held.
The demo it pairs with
Workload forecaster. Set how many people grade over the weekend and how much new work arrives, pick “fixed amount” or “fixed share”, then reveal Monday and see the forecast scored. A scorecard of past weekends shows the hits and the misses.
Friday's pile is in: 191 pieces of work. Set the weekend, pick an idea of how much it will clear, and the forecast gives Monday as a band with the rule that would prove it wrong. Then reveal Monday.
The sliders and Reveal Monday need JavaScript. The forecast, the chart, the table and the scorecard below read without it.
This weekend
With JavaScript off, the forecast below is for 4 graders, 25 pieces of work and the fixed amount idea.
Band for Monday147 to 162
- Assumption
- With 4 graders, the weekend clears about 54 to 69 pieces of work, however big the pile is.
- What would prove it wrong
- Wrong if Monday is below 147 or above 162. Below would mean a bigger pile got more done than the usual amount. Above would mean less got done than usual.
Monday is hidden. Set the weekend, then reveal it.
Every weekend so far
Chart of 5 past weekends and this one. Each shows the Friday pile, the band forecast for Monday and the Monday reading. 3 of 5 past Mondays landed inside their band. The table has the same numbers.
| Weekend | Idea | Friday pile | Graders | New work | Band for Monday | Monday | Result |
|---|---|---|---|---|---|---|---|
| Weekend 1 | Fixed amount | 146 | 4 | 28 | 112 to 127 | 121 | Hit |
| Weekend 2 | Fixed amount | 241 | 4 | 26 | 206 to 222 | 200 | Miss, below by 6 |
| Weekend 3 | Fixed share | 144 | 5 | 26 | 103 to 120 | 105 | Hit |
| Weekend 4 | Fixed share | 131 | 4 | 25 | 108 to 119 | 108 | Hit |
| Weekend 5 | Fixed share | 276 | 4 | 26 | 197 to 221 | 227 | Miss, above by 6 |
| This weekend | Fixed amount | 191 | 4 | 25 | 147 to 162 | Not revealed | Not scored |
Scorecard of past weekends
-
Weekend 1
Fixed amountHit
Band 112 to 127. Monday came in at 121. Inside the band.
-
Weekend 2
Fixed amountMiss, below by 6
Band 206 to 222. Monday came in at 200. This came after the biggest Friday pile so far. With more waiting, the team got more done than its usual amount. Its rule said in advance what a miss this way would mean.
-
Weekend 3
Fixed shareHit
Band 103 to 120. Monday came in at 105. Inside the band.
-
Weekend 4
Fixed shareHit
Band 108 to 119. Monday came in at 108. On the edge of the band, which counts as inside.
-
Weekend 5
Fixed shareMiss, above by 6
Band 197 to 221. Monday came in at 227. This came after the biggest Friday pile so far. The team did not speed up to match the bigger pile, so it cleared a smaller share. Its rule said in advance what a miss this way would mean.