Colley Ratings#
Colley Ratings are a mathematically sound, unbiased method for ranking football teams, relying exclusively on match outcomes rather than scores or margins of victory.
Unlike some rating systems, the Colley method is specifically designed to be objective, using only wins, losses, and draws without subjective weighting.
Its mathematical simplicity and stability make it highly suitable for quickly evaluating team performance, objectively comparing team strengths, and identifying discrepancies between actual team quality and public perception or bookmaker odds.
[1]:
import penaltyblog as pb
[2]:
fbd = pb.scrapers.FootballData("ENG Premier League", "2021-2022")
df = fbd.get_fixtures()
df.head()
[2]:
date | datetime | season | competition | div | time | team_home | team_away | fthg | ftag | ... | b365_cahh | b365_caha | pcahh | pcaha | max_cahh | max_caha | avg_cahh | avg_caha | goals_home | goals_away | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | |||||||||||||||||||||
1628812800---brentford---arsenal | 2021-08-13 | 2021-08-13 20:00:00 | 2021-2022 | ENG Premier League | E0 | 20:00 | Brentford | Arsenal | 2 | 0 | ... | 1.75 | 2.05 | 1.81 | 2.13 | 2.05 | 2.17 | 1.80 | 2.09 | 2 | 0 |
1628899200---burnley---brighton | 2021-08-14 | 2021-08-14 15:00:00 | 2021-2022 | ENG Premier League | E0 | 15:00 | Burnley | Brighton | 1 | 2 | ... | 1.79 | 2.15 | 1.81 | 2.14 | 1.82 | 2.19 | 1.79 | 2.12 | 1 | 2 |
1628899200---chelsea---crystal_palace | 2021-08-14 | 2021-08-14 15:00:00 | 2021-2022 | ENG Premier League | E0 | 15:00 | Chelsea | Crystal Palace | 3 | 0 | ... | 2.05 | 1.75 | 2.12 | 1.81 | 2.16 | 1.93 | 2.06 | 1.82 | 3 | 0 |
1628899200---everton---southampton | 2021-08-14 | 2021-08-14 15:00:00 | 2021-2022 | ENG Premier League | E0 | 15:00 | Everton | Southampton | 3 | 1 | ... | 2.05 | 1.88 | 2.05 | 1.88 | 2.08 | 1.90 | 2.03 | 1.86 | 3 | 1 |
1628899200---leicester---wolves | 2021-08-14 | 2021-08-14 15:00:00 | 2021-2022 | ENG Premier League | E0 | 15:00 | Leicester | Wolves | 1 | 0 | ... | 2.02 | 1.91 | 2.01 | 1.92 | 2.05 | 1.95 | 1.99 | 1.89 | 1 | 0 |
5 rows × 111 columns
Colley ratings including tied scorelines#
[3]:
colley = pb.ratings.Colley(
df["goals_home"], df["goals_away"], df["team_home"], df["team_away"]
)
colley.get_ratings()
[3]:
team | rating | |
---|---|---|
0 | Liverpool | 1.904762 |
1 | Man City | 1.892857 |
2 | Chelsea | 1.791667 |
3 | Tottenham | 1.708333 |
4 | Arsenal | 1.672619 |
5 | Man United | 1.654762 |
6 | Brighton | 1.64881 |
7 | Crystal Palace | 1.625 |
8 | West Ham | 1.619048 |
9 | Leicester | 1.607143 |
10 | Newcastle | 1.583333 |
11 | Wolves | 1.559524 |
12 | Southampton | 1.541667 |
13 | Brentford | 1.529762 |
14 | Aston Villa | 1.511905 |
15 | Burnley | 1.511905 |
16 | Leeds | 1.505952 |
17 | Everton | 1.464286 |
18 | Norwich | 1.339286 |
19 | Watford | 1.327381 |
Colley ratings excluding tied scorelines#
[4]:
colley = pb.ratings.Colley(
df["goals_home"],
df["goals_away"],
df["team_home"],
df["team_away"],
include_draws=False,
)
colley.get_ratings()
[4]:
team | rating | |
---|---|---|
0 | Liverpool | 0.809524 |
1 | Man City | 0.809524 |
2 | Chelsea | 0.678571 |
3 | Tottenham | 0.630952 |
4 | Arsenal | 0.607143 |
5 | Man United | 0.547619 |
6 | West Ham | 0.52381 |
7 | Brighton | 0.511905 |
8 | Leicester | 0.5 |
9 | Crystal Palace | 0.488095 |
10 | Newcastle | 0.47619 |
11 | Wolves | 0.47619 |
12 | Brentford | 0.440476 |
13 | Aston Villa | 0.428571 |
14 | Southampton | 0.416667 |
15 | Leeds | 0.392857 |
16 | Burnley | 0.380952 |
17 | Everton | 0.380952 |
18 | Norwich | 0.25 |
19 | Watford | 0.25 |