YFDashboard / src /pages /1_Keepers.py
Jon Solow
Fix Eligible as checkbox and Years Eligible as number
f5c14f1
raw
history blame
5.07 kB
import os
import pandas as pd
import streamlit as st
from config import DEFAULT_ICON, LEAGUE_NAME, LEAGUE_NUMBER_TEAMS
from streamlit_filter import filter_dataframe
KEEPER_DATA_URL = "../../tests/mocks/2023_keepers.csv"
HEADSHOT_DATA_URL = "../../tests/mocks/2023_player_headshots.csv"
def load_player_ids() -> pd.DataFrame:
df = pd.read_csv(r"https://raw.githubusercontent.com/dynastyprocess/data/master/files/db_playerids.csv")
df["merge_id"] = df["yahoo_id"].combine_first(df["stats_id"])
return df
def load_adp() -> pd.DataFrame:
df = pd.read_csv(r"https://raw.githubusercontent.com/dynastyprocess/data/master/files/values-players.csv")
return df
def add_opinionated_keeper_value(df: pd.DataFrame):
for score_fmt in ["1qb", "2qb"]:
df[f"value_{score_fmt}"] = (df["keeper_cost"] - 0.5) * LEAGUE_NUMBER_TEAMS - df[f"ecr_{score_fmt}"]
@st.cache_data(ttl=60 * 60 * 24)
def load_data():
data = pd.read_csv(os.path.join(os.path.dirname(__file__), KEEPER_DATA_URL), index_col=0)
# Hack to get position, replace with better position from yahoo api in future
data["position"] = data["eligible_positions"].apply(lambda x: eval(x)[0])
data.columns = data.columns.str.lower()
teams_list = sorted(list(data["team_name"].unique()))
# Merge player ids
df_player_ids = load_player_ids()
data = data.merge(df_player_ids, how="left", left_on="player_id", right_on="merge_id", suffixes=("", "_ids"))
# Merge ADP
df_adp = load_adp()
data = data.merge(df_adp, how="left", left_on="fantasypros_id", right_on="fp_id", suffixes=("", "_adp"))
add_opinionated_keeper_value(data)
return data, teams_list
def filtered_keeper_dataframe(data: pd.DataFrame, teams_list: list[str]):
teams_selected = st.multiselect("Team:", teams_list)
teams_filter = data["team_name"].isin(teams_selected) if teams_selected else data["team_name"].isin(teams_list)
is_advanced = st.checkbox("Show Advanced View")
id_cols = [
"team_name",
"headshot_url",
"name",
]
id_cols_advanced = [
"team",
"position",
]
cost_cols = [
"keeper_cost",
"eligible",
]
cost_cols_advanced = [
"years_eligible",
]
adp_cols: list[str] = []
adp_cols_advanced = [
"ecr_1qb",
"value_1qb",
"ecr_2qb",
"value_2qb",
"ecr_pos",
]
if is_advanced:
show_columns = id_cols + id_cols_advanced + cost_cols + cost_cols_advanced + adp_cols + adp_cols_advanced
else:
show_columns = id_cols + cost_cols + adp_cols
filtered_data = filter_dataframe(data.loc[teams_filter, show_columns])
st.dataframe(
filtered_data,
hide_index=True,
height=35 * (len(filtered_data) + 1) + 12,
use_container_width=True,
column_config={
"team_name": st.column_config.TextColumn(label="League Team", help="Name of fantasy League team."),
"headshot_url": st.column_config.ImageColumn(label="", help="Player image"),
"name": st.column_config.TextColumn(label="Name", help="Player's name"),
"team": st.column_config.TextColumn(label="NFL Team"),
"position": st.column_config.TextColumn(label="Position", help="Player's position"),
"keeper_cost": st.column_config.NumberColumn(
label="Keeper Cost", help="Draft Round Cost to keep player. See Rules for details."
),
"eligible": st.column_config.CheckboxColumn(label="Eligible", help="Is player eligible to be keeper?"),
"years_eligible": st.column_config.NumberColumn(
label="Years Eligible",
help="Number of further consecutive seasons player can be kept (subject to maximum of 2)",
),
"ecr_1qb": st.column_config.NumberColumn(
label="ECR 1QB", help="Player's average Expert Consensus Rank (ECR) for 1 QB League"
),
"value_1qb": st.column_config.NumberColumn(
label="Value 1QB", help="Approx. number of draft picks of keeper value vs ECR 1QB"
),
"ecr_2qb": st.column_config.NumberColumn(
label="ECR 2QB", help="Player's average Expert Consensus Rank (ECR) for 2 QB League"
),
"value_2qb": st.column_config.NumberColumn(
label="Value 2QB", help="Approx. number of draft picks of keeper value vs ECR 2QB"
),
"ecr_pos": st.column_config.NumberColumn(
label="ECR Position", help="Player's average Expert Consensus Rank (ECR) at the player's position"
),
},
)
def get_keeper_app():
keeper_title = f"{LEAGUE_NAME} Keeper Options"
st.set_page_config(page_title=keeper_title, page_icon=DEFAULT_ICON, layout="wide")
st.title(keeper_title)
data, teams_list = load_data()
with st.container():
filtered_keeper_dataframe(data, teams_list)
if __name__ == "__main__":
get_keeper_app()