Spaces:
Sleeping
Sleeping
File size: 6,021 Bytes
0ed8b3a dd9e6a9 0ed8b3a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
import json
import pandas as pd
import requests
import streamlit as st
from config import DEFAULT_ICON, SEASON
from login_component import is_token_in_session
from shared_page import common_page_config
from streamlit_filter import filter_dataframe
@st.cache_data(ttl=60 * 60 * 24)
def load_yahoo_to_fp_id_map() -> dict[str, str]:
df = pd.read_csv(r"https://raw.githubusercontent.com/dynastyprocess/data/master/files/db_playerids.csv")
for id_col in ["yahoo_id", "fantasypros_id"]:
df[id_col] = df[id_col].fillna(-9999).apply(lambda x: str(int(x)))
return df.set_index("yahoo_id")["fantasypros_id"].to_dict()
def extract_ecr_var_data(request_text_str, var_name: str):
start_str = f"""var {var_name} = """
end_str = """};"""
end_offset = 1 # include closing bracket
start_slice_pos = request_text_str.find(start_str) + len(start_str)
first_slice = request_text_str[start_slice_pos:]
end_slice_pos = first_slice.find(end_str) + end_offset
dom_str = first_slice[:end_slice_pos]
var_json = json.loads(dom_str)
return var_json
@st.cache_data(ttl=60 * 60 * 24)
def load_ecr_data():
request_text = get_ecr_request_text()
ecr_data = extract_ecr_var_data(request_text, "ecrData")
ecr_columns = [
"player_id",
"player_name",
"player_position_id",
"player_bye_week",
"rank_ecr",
"pos_rank",
"tier",
]
df_ecr = pd.DataFrame(ecr_data["players"])[ecr_columns]
df_ecr["player_id"] = df_ecr["player_id"].apply(lambda x: str(int(x)))
# sos_data = extract_ecr_var_data(request_text, "sosData")
# adp_data = extract_ecr_var_data(request_text, "adpData")
return df_ecr
@st.cache_data(ttl=60 * 60 * 24)
def get_ecr_request_text():
r = requests.get("https://www.fantasypros.com/nfl/rankings/half-point-ppr-cheatsheets.php")
return r.text
@st.cache_resource(ttl=60 * 60 * 24)
def get_league_settings_with_cache(selected_league):
return st.session_state.yahoo_client.parse_league_settings(selected_league)
def highlight_drafted(data_row_series):
return ["background-color: red" if data_row_series.is_drafted else "" for _ in range(len(data_row_series))]
def display_formatted_tiers(df):
st.dataframe(
df.style.apply(highlight_drafted, axis=1),
hide_index=True,
height=35 * (len(df) + 1) + 5,
column_order=[
"rank_ecr",
"player_name",
# "player_position_id",
"player_bye_week",
# "tier",
# "is_drafted",
],
column_config={
"player_name": st.column_config.TextColumn(label="Name", help="Player's name"),
"player_position_id": st.column_config.TextColumn(label="Position", help="Player's position"),
"player_bye_week": st.column_config.NumberColumn(label="Bye", help="Player's Bye Week"),
"rank_ecr": st.column_config.NumberColumn(label="Rank", help="Player ECR Rank"),
"tier": st.column_config.NumberColumn(label="Tier", help="Player Tier"),
"is_drafted": st.column_config.CheckboxColumn(label="Drafted", help="Has been drafted"),
},
)
def get_page():
page_title = "Yahoo Draft Live Summary"
st.set_page_config(page_title=page_title, page_icon=DEFAULT_ICON, layout="wide")
common_page_config()
st.title(page_title)
if not (is_token_in_session() and st.session_state.get("user_admin")):
st.write("Exclusive feature")
else:
selected_season = st.selectbox("Select Season", list(range(SEASON, 2012, -1)))
user_leagues = st.session_state.yahoo_client.find_all_leagues_for_logged_in_user(season=selected_season)
selected_league = st.selectbox("Select league", user_leagues)
league_settings = get_league_settings_with_cache(selected_league)
st.header(f"{league_settings.name} - {league_settings.season}")
with st.expander("Show Positions"):
st.dataframe(
pd.DataFrame(league_settings.roster_positions).set_index("position")["count"],
)
draft_result = pd.DataFrame(st.session_state.yahoo_client.get_draft(selected_league))
if st.button("Load / Refresh"):
draft_result = pd.DataFrame(st.session_state.yahoo_client.get_draft(selected_league))
if "player_key" in draft_result:
draft_result["player_id"] = draft_result["player_key"].apply(lambda x: x.rsplit(".", 1)[-1] if x else x)
else:
draft_result["player_id"] = ""
draft_result["fp_id"] = draft_result["player_id"].apply(lambda x: load_yahoo_to_fp_id_map().get(x))
if "team_key" not in draft_result:
draft_result["team_key"] = ""
with st.expander("Show Draft Results"):
st.dataframe(draft_result)
st.header("ECR Tiers")
ecr_data = load_ecr_data()
draft_result_merge_cols = [
"fp_id",
"team_key",
]
ecr_with_draft = ecr_data.merge(
draft_result[draft_result_merge_cols], how="left", left_on="player_id", right_on="fp_id"
)
ecr_with_draft["is_drafted"] = ecr_with_draft["fp_id"].notna()
with st.expander("Filters"):
filtered_data = filter_dataframe(
ecr_with_draft, force_on=True, force_on_columns=["is_drafted", "player_position_id"]
)
position_list = [
x for x in ["QB", "RB", "WR", "TE", "DST", "K"] if x in filtered_data.player_position_id.unique()
]
columns_list = st.columns(len(position_list))
for pos, col in zip(position_list, columns_list):
with col:
st.header(pos)
df_pos = filtered_data[filtered_data.player_position_id == pos]
for tier, df_tier in df_pos.groupby("tier"):
st.header(f"Tier {tier}")
display_formatted_tiers(df_tier)
if __name__ == "__main__":
get_page()
|