Jackson Angell
A platform built on my own League of Legends match history: a Riot API pipeline into Snowflake, five from-scratch models predicting my next ranked champion, and this site to show it all. This page covers the "why".
What this is
A pipeline that pulls every match I play from the Riot Games API into Snowflake, then layers models and a dashboard on top. Prediction guesses my next champion (ranked games only); Statistics and Playstyle cover the social and stylistic side across every game.
Why the "fun" model is on the front page
All five models train on ranked games only. That's where I actually try to pick my best champion, so it's the only history worth predicting from; normals and ARAMs are just me messing around.
The front page runs the two-step sampler. Instead of always naming my most likely champion (my main, most days), it draws a pick from its odds, so it changes game to game and sometimes lands on a pocket pick. It's less accurate than just naming the favourite, and measuring that trade-off is the interesting bit: four other models run alongside it for exactly that reason. The Models page has the numbers.
How it fits together
Every run polls Riot for new match IDs into a match_ids discovery log (so re-runs are
idempotent), fetches anything new into Snowflake, then predicts, scores, and publishes. The
Pipeline page walks through all seven stages in order.
Stack
| Layer | Choice |
|---|---|
| Warehouse | Snowflake, key-pair authenticated |
| Pipeline | Python, scheduled on GitHub Actions (requests, pandas, scikit-learn, XGBoost) |
| Website | Flask + gunicorn |
| Deployment | Docker container (slim Python base, non-root), deployed on Render |
| Assets | Champion art pre-fetched from Data Dragon, served as static files |
| AI summaries | Claude API, called on demand and rate-limited per visitor |
Contact
Happy to talk about the pipeline, the models, or anything else here.