premier-league-data

Open, pip-installable English Premier League match results with every bookmaker's odds kept intact — opening and closing lines — from 1993-94 to the present.

Python 3.9+ MIT code license CSV & Parquet data: football-data.co.uk
12,700+
matches
1993-94→
every season
183
odds columns
2
tidy tables

Most public "Premier League results" datasets throw away the betting odds. This one keeps them all — including opening and closing prices — which is what makes closing-line and market-efficiency analysis possible. Everything is cleaned into two tidy tables, shipped as CSV and Parquet, and bundled inside the package so they load in one line of Python — no download or scraping required.

Data source: football-data.co.uk. This project only fetches, cleans, and reshapes their freely published files. If you use this data, please credit football-data.co.uk. Pipeline code is MIT licensed; the project claims no ownership over the underlying data.
Line chart of English Premier League average goals per game by season, from 1993-94 to the present, built from this dataset

Install

pip install git+https://github.com/AnishKhetani/premier-league-data

Quickstart

import premier_league_data as pl

results = pl.load_results()                    # 12,700+ matches, all seasons
table   = results[results.season == "2023-24"] # slice a single season
odds    = pl.load_results_with_odds("2023-24") # same rows + every bookmaker's odds
print(pl.available_seasons()[:3])              # ['1993-94', '1994-95', '1995-96']

The data

Two tables, each shipped as CSV and Parquet and bundled inside the package:

results — core match results

One row per match, standardized across every era: season, date, teams, full-time and half-time goals and results, referee, and a stable match_id.

results_with_odds — results + all bookmaker odds

The match-identity keys plus 183 odds columns — 1X2, over/under 2.5, and Asian-handicap prices, with opening and _close (closing-line) values across bet365, Pinnacle, William Hill, Bwin, Ladbrokes, Betfair and more. Odds are sparse: a column is empty for seasons where that bookmaker or market wasn't quoted.

Reproducible

The data is reproducible end-to-end — nothing is hand-edited. A GitHub Actions workflow re-runs the pipeline weekly during the season and opens a PR when the current-season data changes. Full column specification is in SPEC.md.

Cite / license