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()