File size: 5,058 Bytes
86f5e84
7a18dc2
f18ed57
7a18dc2
8bbcbe6
949a661
7a18dc2
f47916d
f18ed57
949a661
 
 
 
 
 
 
 
 
 
 
 
f47916d
2e0b4a6
8bbcbe6
 
 
 
 
297c9c5
f47916d
f18ed57
e2b52d0
 
7a18dc2
c0c7d17
949a661
 
 
 
 
 
 
 
8bbcbe6
c0c7d17
7a18dc2
 
5509410
c0c7d17
 
 
4fbbbf8
 
 
949a661
286c902
949a661
4fbbbf8
 
 
949a661
 
4fbbbf8
 
 
949a661
 
 
 
4fbbbf8
 
 
 
 
 
 
 
 
 
 
 
 
 
00e2e2c
4fbbbf8
 
 
00e2e2c
9ca89ad
c9e9696
9ca89ad
c9e9696
ed96343
a544bb0
3965984
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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
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.TextColumn(label="Eligible", help="Is player eligible to be keeper?"),
            "years_eligible": st.column_config.TextColumn(
                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()