Sourcing pre-tournament Elo ratings

data-cleaning
Author

Rene Valenzuela

Published

August 17, 2026

Modified

August 19, 2026

Introduction

The World Cup hosting premium analysis controls for each team’s strength going into a tournament via pre_elo_rating. That covariate isn’t part of the Kaggle matches dataset, so it’s sourced separately here, in its own post, for the same reason the match-cleaning steps live in their own post: it keeps the scrape traceable and reproducible independent of any downstream analysis.

NoteData attribution

All Elo ratings on this page are sourced from eloratings.net, the World Football Elo Ratings project. All credit for the underlying rating methodology and data collection belongs to that site — this post only documents how the publicly served data is downloaded and reshaped for analysis here.

Data source

eloratings.net publishes a “starting” Elo snapshot for every year, e.g. https://eloratings.net/2026_start. The page itself renders client-side (a JS grid) and has no public API, but the grid is populated from two plain TSV files that can be read directly:

  • https://eloratings.net/{year}_start.tsv — one row per team, ranked by rating, with 31 tab-separated columns: rank-change arrow, rank, team code, rating, highest/average/lowest rank and rating, rank/rating changes over the trailing 3 months, 6 months, 1, 2, 5, and 10 years, total matches played (home/away/neutral), wins/losses/draws, and goals for/against.
  • https://eloratings.net/en.teams.tsv — maps each 2-letter team code to its full country name.

Building the panel

Starting Elo ratings are pulled for every calendar year from 1930 through 2026 — not just World Cup years — and stacked into a single panel, so downstream posts can look up any team’s rating in any year without re-scraping. Years already present in the output file from a previous run are skipped, so re-running this post only hits eloratings.net for new years.

Normalizing country names

Output

The combined panel — sourced from eloratings.net — is written out for downstream use by the data-cleaning and hosting-premium posts:

Visual check

As a sanity check that the scrape actually worked, here’s Elo rating over time for two teams read straight back from the parquet file: