File size: 2,819 Bytes
86f5e84
7a18dc2
f18ed57
7a18dc2
8bbcbe6
949a661
7a18dc2
f47916d
f18ed57
949a661
 
 
 
 
 
 
 
 
 
 
 
f47916d
2e0b4a6
8bbcbe6
 
 
 
 
7a18dc2
f47916d
f18ed57
e2b52d0
 
7a18dc2
c0c7d17
949a661
 
 
 
 
 
 
 
8bbcbe6
c0c7d17
7a18dc2
 
5509410
c0c7d17
 
 
949a661
 
286c902
949a661
 
 
 
 
 
 
8bbcbe6
949a661
8bbcbe6
949a661
 
 
 
c9e9696
949a661
c9e9696
a544bb0
286c902
c9e9696
7a18dc2
 
f18ed57
 
93b83fd
f18ed57
5509410
 
 
 
 
 
b7f4f75
f18ed57
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
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
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)

    show_columns = [
        "team_name",
        "headshot_url",
        "name",
        "team",
        "position",
        "keeper_cost",
        "years_eligible",
        "eligible",
        "ecr_1qb",
        "value_1qb",
        "ecr_2qb",
        "value_2qb",
        "ecr_pos",
    ]

    filtered_data = data.loc[teams_filter, show_columns]
    st.dataframe(
        filter_dataframe(filtered_data),
        hide_index=True,
        use_container_width=True,
        column_config={"headshot_url": st.column_config.ImageColumn(label="img")},
    )


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