Skip to content

Commit

Permalink
changing elo calc for nba
Browse files Browse the repository at this point in the history
  • Loading branch information
matsonj authored Mar 6, 2024
1 parent 5c67736 commit c621bcc
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 10 deletions.
17 changes: 16 additions & 1 deletion data/nba/nba_results.csv
Original file line number Diff line number Diff line change
Expand Up @@ -906,4 +906,19 @@ Sun Mar 3 2024,6:00p,Detroit Pistons,91,Orlando Magic,113,Box Score,,19459,Amway
Sun Mar 3 2024,6:00p,Charlotte Hornets,106,Toronto Raptors,111,Box Score,,19512,Scotiabank Arena,
Sun Mar 3 2024,7:00p,New York Knicks,107,Cleveland Cavaliers,98,Box Score,,19432,Rocket Mortgage Fieldhouse,
Sun Mar 3 2024,7:00p,Indiana Pacers,105,San Antonio Spurs,117,Box Score,,18027,Frost Bank Center,
Sun Mar 3 2024,9:30p,Oklahoma City Thunder,118,Phoenix Suns,110,Box Score,,17071,Footprint Center,
Sun Mar 3 2024,9:30p,Oklahoma City Thunder,118,Phoenix Suns,110,Box Score,,17071,Footprint Center,
Mon Mar 4 2024,7:30p,Memphis Grizzlies,106,Brooklyn Nets,102,Box Score,,15847,Barclays Center,
Mon Mar 4 2024,8:00p,Los Angeles Clippers,106,Milwaukee Bucks,113,Box Score,,17875,Fiserv Forum,
Mon Mar 4 2024,8:00p,Portland Trail Blazers,114,Minnesota Timberwolves,119,Box Score,,18024,Target Center,
Mon Mar 4 2024,9:00p,Washington Wizards,115,Utah Jazz,127,Box Score,,18206,Delta Center,
Mon Mar 4 2024,10:00p,Chicago Bulls,113,Sacramento Kings,109,Box Score,,17832,Golden 1 Center,
Mon Mar 4 2024,10:30p,Oklahoma City Thunder,104,Los Angeles Lakers,116,Box Score,,18997,Crypto.com Arena,
Tue Mar 5 2024,7:00p,Orlando Magic,101,Charlotte Hornets,89,Box Score,,15928,Spectrum Center,
Tue Mar 5 2024,7:30p,Philadelphia 76ers,107,Brooklyn Nets,112,Box Score,,17086,Barclays Center,
Tue Mar 5 2024,7:30p,Boston Celtics,104,Cleveland Cavaliers,105,Box Score,,19432,Rocket Mortgage Fieldhouse,
Tue Mar 5 2024,7:30p,Detroit Pistons,110,Miami Heat,118,Box Score,,19724,Kaseya Center,
Tue Mar 5 2024,7:30p,Atlanta Hawks,116,New York Knicks,100,Box Score,,19812,Madison Square Garden (IV),
Tue Mar 5 2024,7:30p,New Orleans Pelicans,139,Toronto Raptors,98,Box Score,,18864,Scotiabank Arena,
Tue Mar 5 2024,8:00p,San Antonio Spurs,101,Houston Rockets,114,Box Score,,16734,Toyota Center,
Tue Mar 5 2024,8:30p,Indiana Pacers,137,Dallas Mavericks,120,Box Score,,20200,American Airlines Center,
Tue Mar 5 2024,10:00p,Phoenix Suns,117,Denver Nuggets,107,Box Score,OT,19589,Ball Arena,
2 changes: 1 addition & 1 deletion evidence/pages/nba/matchup_calc.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ queries:
SELECT
'Home Court Advantage',
game_id,
70 as hfa,
100 as hfa,
4
FROM ${filtered_future_games}
),
Expand Down
2 changes: 1 addition & 1 deletion evidence/pages/nba/predictions/[nba_games].md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ GROUP BY ALL
SELECT
'Home Court Advantage',
game_id,
70 as hfa,
100 as hfa,
4
FROM ${future_games}
),
Expand Down
2 changes: 1 addition & 1 deletion transform/dbt_project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ vars:
include_actuals: true # set to true to use actual game results, otherwise sim entire season
latest_ratings: true # set to true to use latest ELO ratings, otherwise use start of season ratings
sim_start_game_id: 0 # placeholder one multi-container is in place
nba_elo_offset: 70 # nba offset to ELO to get to ~12% home advantage
nba_elo_offset: 100 # nba offset to ELO to get to ~12% home advantage
nfl_elo_offset: 52 # nfl offset to ELO to get to 7.5% home advantage
ncaaf_elo_offset: 52 # ncaaf offset to ELO to get to 7.5% home advantage

Expand Down
18 changes: 12 additions & 6 deletions transform/models/nba/prep/nba_elo_rollforward.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,34 @@
import pandas as pd

def calc_elo_diff(game_result: float, home_elo: float, visiting_elo: float, home_adv: float) -> float:
def calc_elo_diff(margin: float, game_result: float, home_elo: float, visiting_elo: float, home_adv: float) -> float:
# just need to make sure i really get a game result that is float (annoying)
game_result = float(game_result)
return 25.0 * (( game_result ) - (1.0 / (10.0 ** (-(visiting_elo - home_elo - home_adv) / 400.0) + 1.0)))
elo_diff = -float((visiting_elo - home_elo - home_adv))
raw_elo = 20.0 * (( game_result ) - (1.0 / (10.0 ** ( elo_diff / 400.0) + 1.0)))
if game_result == 1:
elo_chg = raw_elo * ((margin + 3)** 0.8 ) / (7.5 + (0.006 * elo_diff ))
elif game_result == 0:
elo_chg = raw_elo * ((margin + 3)** 0.8 ) / (7.5 + (0.006 * -elo_diff ))
return elo_chg

def model(dbt, sess):
# get the existing elo ratings for the teams
home_adv = dbt.config.get("nba_elo_offset",70.0)
home_adv = dbt.config.get("nba_elo_offset",100.0)
team_ratings = dbt.ref("nba_raw_team_ratings").df()
original_elo = dict(zip(team_ratings["team_long"], team_ratings["elo_rating"].astype(float)))
working_elo = original_elo.copy()

# loop over the historical game data and update the elo ratings as we go
nba_elo_latest = (dbt.ref("nba_latest_results")
.project("game_id, visiting_team, home_team, winning_team, game_result_v2")
.project("game_id, visiting_team, home_team, winning_team, margin, game_result")
.order("game_id")
)
nba_elo_latest.execute()
columns = ["game_id", "visiting_team", "visiting_team_elo_rating", "home_team", "home_team_elo_rating", "winning_team", "elo_change"]
rows = []
for (game_id, vteam, hteam, winner, game_result) in nba_elo_latest.fetchall():
for (game_id, vteam, hteam, winner, margin, game_result) in nba_elo_latest.fetchall():
helo, velo = working_elo[hteam], working_elo[vteam]
elo_change = calc_elo_diff(game_result, helo, velo, home_adv)
elo_change = calc_elo_diff(margin, game_result, helo, velo, home_adv)
rows.append((game_id, vteam, velo, hteam, helo, winner, elo_change))
working_elo[hteam] -= elo_change
working_elo[vteam] += elo_change
Expand Down

0 comments on commit c621bcc

Please sign in to comment.