Spaces:
Running
Running
Jon Solow
commited on
Commit
·
b71783b
1
Parent(s):
78f5251
Get functional luck table enabled
Browse files
src/analyze_yahoo.py
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
from typing import Optional
|
| 3 |
+
|
| 4 |
+
from yahoo_client import LeagueSettings
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
def calculate_luck(df: pd.DataFrame, as_of_week: Optional[int] = None) -> pd.DataFrame:
|
| 8 |
+
if as_of_week:
|
| 9 |
+
df_complete = df[df.week <= as_of_week]
|
| 10 |
+
else:
|
| 11 |
+
df_complete = df[df.matchup_status == "postevent"]
|
| 12 |
+
df_complete["actual_wins"] = df_complete["win_probability"].apply(lambda x: x > 0.5)
|
| 13 |
+
df_list = []
|
| 14 |
+
n_teams = df.team_name.nunique()
|
| 15 |
+
for week, df_week in df_complete.groupby("week"):
|
| 16 |
+
if len(df_week) != n_teams:
|
| 17 |
+
next
|
| 18 |
+
else:
|
| 19 |
+
df_week["against_all_wins"] = ((df_week.team_points.rank().astype("float") - 1) / n_teams).round(2)
|
| 20 |
+
df_week["against_all_losses"] = 1 - df_week["against_all_wins"]
|
| 21 |
+
df_week["half_wins"] = (df_week["against_all_wins"] >= 0.5) * 1.0
|
| 22 |
+
df_week["half_losses"] = 1 - df_week["half_wins"]
|
| 23 |
+
df_week["against_all_luck"] = df_week["actual_wins"] - df_week["against_all_wins"]
|
| 24 |
+
df_week["half_luck"] = df_week["actual_wins"] - df_week["half_wins"]
|
| 25 |
+
df_week["earned_wins"] = ((df_week["against_all_wins"] + df_week["half_wins"]) / 2).round(2)
|
| 26 |
+
df_week["luck_wins"] = df_week["actual_wins"] - df_week["earned_wins"]
|
| 27 |
+
df_list.append(df_week)
|
| 28 |
+
|
| 29 |
+
df_luck = pd.concat(df_list)
|
| 30 |
+
summ_cols = [
|
| 31 |
+
"team_name",
|
| 32 |
+
"team_points",
|
| 33 |
+
"against_all_wins",
|
| 34 |
+
"half_wins",
|
| 35 |
+
"actual_wins",
|
| 36 |
+
"earned_wins",
|
| 37 |
+
"luck_wins",
|
| 38 |
+
]
|
| 39 |
+
sort_by = "luck_wins"
|
| 40 |
+
return df_luck[summ_cols].groupby("team_name").sum().sort_values(sort_by, ascending=False)
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def summarize_remaining_wins_from_matches_map(matches_map):
|
| 44 |
+
"""
|
| 45 |
+
Return map for all teams to map of number remaining wins
|
| 46 |
+
to array of playoff and bye prob, respectively.
|
| 47 |
+
"""
|
| 48 |
+
remaining_map = {}
|
| 49 |
+
for team_name, team_matches_map in matches_map.items():
|
| 50 |
+
team_remaining_map = {}
|
| 51 |
+
for match_binary_str, prob_list in team_matches_map.items():
|
| 52 |
+
n_wins = sum([int(x) for x in match_binary_str])
|
| 53 |
+
if n_wins in team_remaining_map:
|
| 54 |
+
incr_obs, incr_playoff_prob, incr_bye_prob = prob_list
|
| 55 |
+
if incr_obs == 0:
|
| 56 |
+
continue
|
| 57 |
+
current_obs, current_playoff_prob, current_bye_prob = team_remaining_map[n_wins]
|
| 58 |
+
new_obs = current_obs + incr_obs
|
| 59 |
+
new_playoff_prob = round(
|
| 60 |
+
(current_obs * current_playoff_prob + incr_obs * incr_playoff_prob) / new_obs, 3
|
| 61 |
+
)
|
| 62 |
+
new_bye_prob = round((current_obs * current_bye_prob + incr_obs * incr_bye_prob) / new_obs, 3)
|
| 63 |
+
team_remaining_map[n_wins] = [new_obs, new_playoff_prob, new_bye_prob]
|
| 64 |
+
else:
|
| 65 |
+
team_remaining_map[n_wins] = prob_list
|
| 66 |
+
remaining_map[team_name] = team_remaining_map
|
| 67 |
+
return remaining_map
|
| 68 |
+
|
| 69 |
+
|
| 70 |
+
def analyze_league(df_scores: pd.DataFrame, league_settings: LeagueSettings) -> pd.DataFrame:
|
| 71 |
+
luck = calculate_luck(df_scores, as_of_week=league_settings.current_week - 1)
|
| 72 |
+
return luck
|
src/pages/51_League_Results_Summary.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
|
|
|
|
| 3 |
from config import DEFAULT_ICON, SEASON
|
| 4 |
from login_component import is_token_in_session
|
| 5 |
from shared_page import common_page_config
|
|
@@ -28,6 +29,10 @@ def get_page():
|
|
| 28 |
selected_league = st.selectbox("Select league", user_leagues, format_func=lambda x: x.name)
|
| 29 |
st.header(f"{selected_league.name} - {selected_league.season}")
|
| 30 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
if __name__ == "__main__":
|
| 33 |
get_page()
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
|
| 3 |
+
from analyze_yahoo import analyze_league
|
| 4 |
from config import DEFAULT_ICON, SEASON
|
| 5 |
from login_component import is_token_in_session
|
| 6 |
from shared_page import common_page_config
|
|
|
|
| 29 |
selected_league = st.selectbox("Select league", user_leagues, format_func=lambda x: x.name)
|
| 30 |
st.header(f"{selected_league.name} - {selected_league.season}")
|
| 31 |
|
| 32 |
+
df_weekly_results = st.session_state.yahoo_client.full_schedule_dataframe(selected_league.league_key)
|
| 33 |
+
df_luck = analyze_league(df_weekly_results, selected_league)
|
| 34 |
+
st.dataframe(df_luck)
|
| 35 |
+
|
| 36 |
|
| 37 |
if __name__ == "__main__":
|
| 38 |
get_page()
|