File size: 3,824 Bytes
d45ec63
 
 
 
 
 
 
fac5a9c
d45ec63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2eee45f
fac5a9c
2eee45f
d45ec63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from dataclasses import dataclass
import streamlit as st

from config import DEFAULT_ICON
from shared_page import common_page_config

from queries.nflverse.github_data import get_weekly_rosters
from login import check_password


@dataclass
class PlayerOption:
    full_name: str
    gsis_id: str
    headshot_url: str
    position: str
    team: str

    @classmethod
    def from_series(cls, input_series):
        return cls(
            full_name=input_series.full_name,
            gsis_id=input_series.gsis_id,
            headshot_url=input_series.headshot_url,
            position=input_series.position,
            team=input_series.team,
        )

    @classmethod
    def empty_player(cls):
        return cls(
            full_name="",
            gsis_id="",
            headshot_url="",
            position="",
            team="",
        )


def player_options_from_df(df_options, position_filter: str) -> list[PlayerOption]:
    empty_first_option_list = [PlayerOption.empty_player()]
    return (
        empty_first_option_list
        + df_options[df_options.position == position_filter].apply(PlayerOption.from_series, axis=1).tolist()
    )


# @st.cache_data(ttl=60 * 60 * 24)
def load_options():
    # filter active only
    df_rosters = get_weekly_rosters()
    df_rosters = df_rosters[df_rosters.status == "ACT"]
    # select latest
    sort_by_cols = ["position", "week", "fantasy_points"]
    df_rosters = df_rosters.sort_values(sort_by_cols, ascending=False).drop_duplicates(subset="gsis_id")
    qb_options = player_options_from_df(df_rosters, "QB")
    wr_options = player_options_from_df(df_rosters, "WR")
    rb_options = player_options_from_df(df_rosters, "RB")
    te_options = player_options_from_df(df_rosters, "TE")
    k_options = player_options_from_df(df_rosters, "K")
    return qb_options, wr_options, rb_options, te_options, k_options, df_rosters


def format_player_option(player_opt: PlayerOption) -> str:
    return f"{player_opt.team} - {player_opt.full_name}"


def display_player(player_opt: PlayerOption | None):
    if player_opt:
        if player_opt.headshot_url:
            st.image(player_opt.headshot_url, caption=player_opt.full_name)


def get_page():
    page_title = "Select Your Team"
    st.set_page_config(page_title=page_title, page_icon=DEFAULT_ICON, layout="wide")
    common_page_config()
    st.title(page_title)
    if not check_password():
        st.write("Sorry, you must be logged in first to play")
        st.stop()

    qb_options, wr_options, rb_options, te_options, k_options, df_rosters = load_options()

    selection_cols = st.columns(8)

    with selection_cols[0]:
        qb_1 = st.selectbox("QB", options=qb_options, format_func=format_player_option)
        display_player(qb_1)
    with selection_cols[1]:
        rb_1 = st.selectbox("RB1", options=rb_options, format_func=format_player_option)
        display_player(rb_1)
    with selection_cols[2]:
        rb_2 = st.selectbox("RB2", options=rb_options, format_func=format_player_option)
        display_player(rb_2)
    with selection_cols[3]:
        wr_1 = st.selectbox("WR1", options=wr_options, format_func=format_player_option)
        display_player(wr_1)
    with selection_cols[4]:
        wr_2 = st.selectbox("WR2", options=wr_options, format_func=format_player_option)
        display_player(wr_2)
    with selection_cols[5]:
        te_1 = st.selectbox("TE", options=te_options, format_func=format_player_option)
        display_player(te_1)
    with selection_cols[6]:
        k_1 = st.selectbox("K", options=k_options, format_func=format_player_option)
        display_player(k_1)
    with selection_cols[7]:
        def_1 = st.selectbox("DEF", options=[], format_func=format_player_option)
        display_player(def_1)


if __name__ == "__main__":
    get_page()