Spaces:
Running
Running
File size: 10,647 Bytes
6046583 97fb8ce 6046583 755d752 6046583 755d752 97fb8ce 755d752 6046583 cc94f0d 6046583 78ac3ba 00f90b0 78ac3ba 6a2c013 78ac3ba 00f90b0 78ac3ba 7936494 6046583 755d752 8e78c15 6046583 755d752 8e78c15 6046583 7499a50 755d752 8e78c15 755d752 6046583 11362fa 6046583 11362fa 6046583 80de24e 11362fa 6046583 78ac3ba 5236120 6046583 78ac3ba 6046583 c42b330 11362fa 71f0d1e 11362fa 71f0d1e 78ac3ba 5236120 78ac3ba 5236120 78ac3ba 6046583 78ac3ba 5236120 6046583 11362fa 6046583 c42b330 5bb8e91 78ac3ba 5236120 80de24e 5236120 80de24e 5236120 78ac3ba 5236120 78ac3ba 6046583 78ac3ba 5236120 6046583 11362fa 6046583 c42b330 5bb8e91 6046583 78ac3ba 5236120 80de24e 5236120 80de24e 5236120 78ac3ba 5236120 78ac3ba |
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 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
import streamlit as st
st.set_page_config(layout="wide")
for name in dir():
if not name.startswith('_'):
del globals()[name]
import pulp
import numpy as np
import pandas as pd
import streamlit as st
import gspread
import pymongo
from itertools import combinations
@st.cache_resource
def init_conn():
uri = st.secrets['mongo_uri']
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
db = client["NHL_Database"]
return db
db = init_conn()
player_roo_format = {'Top_finish': '{:.2%}','Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '2x%': '{:.2%}', '3x%': '{:.2%}',
'4x%': '{:.2%}'}
st.markdown("""
<style>
/* Tab styling */
.stTabs [data-baseweb="tab-list"] {
gap: 8px;
padding: 4px;
}
.stTabs [data-baseweb="tab"] {
height: 50px;
white-space: pre-wrap;
background-color: #DAA520;
color: white;
border-radius: 10px;
gap: 1px;
padding: 10px 20px;
font-weight: bold;
transition: all 0.3s ease;
}
.stTabs [aria-selected="true"] {
background-color: #DAA520;
border: 3px solid #FFD700;
color: white;
}
.stTabs [data-baseweb="tab"]:hover {
background-color: #FFD700;
cursor: pointer;
}
</style>""", unsafe_allow_html=True)
@st.cache_resource(ttl=200)
def player_stat_table():
collection = db["Player_Level_ROO"]
cursor = collection.find()
player_frame = pd.DataFrame(cursor)
player_frame = player_frame[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own',
'Small Field Own%', 'Large Field Own%', 'Cash Own%', 'CPT_Own', 'Site', 'Type', 'Slate', 'player_id', 'timestamp']]
collection = db["Player_Lines_ROO"]
cursor = collection.find()
line_frame = pd.DataFrame(cursor)
line_frame = line_frame[['Player', 'SK1', 'SK2', 'SK3', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '50+%', '2x%', '3x%', '4x%', 'Own', 'Site', 'Type', 'Slate']]
collection = db["Player_Powerplay_ROO"]
cursor = collection.find()
pp_frame = pd.DataFrame(cursor)
pp_frame = pp_frame[['Player', 'SK1', 'SK2', 'SK3', 'SK4', 'SK5', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '75+%', '2x%', '3x%', '4x%', 'Own', 'Site', 'Type', 'Slate']]
timestamp = player_frame['timestamp'].values[0]
return player_frame, line_frame, pp_frame, timestamp
@st.cache_data
def convert_df_to_csv(df):
return df.to_csv().encode('utf-8')
player_frame, line_frame, pp_frame, timestamp = player_stat_table()
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
view_var1 = st.radio("View Type", ("Simple", "Advanced"), key='view_var1')
tab1, tab2, tab3 = st.tabs(["Player Range of Outcomes", "Line Combo Range of Outcomes", "Power Play Range of Outcomes"])
with tab1:
with st.expander("Info and Filters"):
with st.container():
st.info("Advanced view includes all stats and thresholds, simple includes just basic columns for ease of use on mobile")
st.info(t_stamp)
if st.button("Load/Reset Data", key='reset1'):
st.cache_data.clear()
player_frame, line_frame, pp_frame, timestamp = player_stat_table()
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
site_var1 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var1')
main_var1 = st.radio("Main slate or secondary slate?", ('Main Slate', 'Secondary Slate'), key='main_var1')
split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1')
if split_var1 == 'Specific Games':
team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = player_frame['Team'].unique(), key='team_var1')
elif split_var1 == 'Full Slate Run':
team_var1 = player_frame.Team.values.tolist()
pos_split1 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split1')
if pos_split1 == 'Specific Positions':
pos_var1 = st.multiselect('What Positions would you like to view?', options = ['C', 'W', 'D', 'G'])
elif pos_split1 == 'All Positions':
pos_var1 = 'All'
sal_var1 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 20000), key='sal_var1')
final_Proj = player_frame[player_frame['Site'] == str(site_var1)]
final_Proj = final_Proj[final_Proj['Type'] == 'Basic']
final_Proj = final_Proj[final_Proj['Slate'] == main_var1]
final_Proj = final_Proj[player_frame['Team'].isin(team_var1)]
final_Proj = final_Proj[final_Proj['Salary'] >= sal_var1[0]]
final_Proj = final_Proj[final_Proj['Salary'] <= sal_var1[1]]
if pos_var1 != 'All':
final_Proj = final_Proj[final_Proj['Position'].str.contains('|'.join(pos_var1))]
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
if pos_var1 == 'All':
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
if view_var1 == 'Advanced':
display_proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
'Own', 'Small Field Own%', 'Large Field Own%', 'Cash Own%', 'CPT_Own']]
elif view_var1 == 'Simple':
display_proj = final_Proj[['Player', 'Position', 'Salary', 'Median', '3x%', 'Own']]
st.dataframe(display_proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True, hide_index=True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(display_proj),
file_name='NHL_player_export.csv',
mime='text/csv',
)
with tab2:
with st.expander("Info and Filters"):
with st.container():
st.info("Advanced view includes all stats and thresholds, simple includes just basic columns for ease of use on mobile")
st.info(t_stamp)
if st.button("Load/Reset Data", key='reset2'):
st.cache_data.clear()
player_frame, line_frame, pp_frame, timestamp = player_stat_table()
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
site_var2 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var2')
main_var2 = st.radio("Main slate or secondary slate?", ('Main Slate', 'Secondary Slate'), key='main_var2')
sal_var2 = st.slider("Is there a certain price range you want to view?", 5000, 40000, (5000, 40000), key='sal_var2')
final_line_combos = line_frame[line_frame['Site'] == str(site_var2)]
final_line_combos = final_line_combos[final_line_combos['Type'] == 'Basic']
final_line_combos = final_line_combos[final_line_combos['Slate'] == main_var2]
final_line_combos = final_line_combos[final_line_combos['Salary'] >= sal_var2[0]]
final_line_combos = final_line_combos[final_line_combos['Salary'] <= sal_var2[1]]
final_line_combos = final_line_combos.drop_duplicates(subset=['Player'])
final_line_combos = final_line_combos.sort_values(by='Median', ascending=False)
if view_var1 == 'Advanced':
display_proj_lines = final_line_combos[['Player', 'SK1', 'SK2', 'SK3', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '50+%', '2x%', '3x%', '4x%',
'Own']]
elif view_var1 == 'Simple':
display_proj_lines = final_line_combos[['SK1', 'SK2', 'SK3', 'Salary', 'Median', '3x%', 'Own']]
st.dataframe(display_proj_lines.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True, hide_index=True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(display_proj_lines),
file_name='NHL_linecombos_export.csv',
mime='text/csv',
)
with tab3:
with st.expander("Info and Filters"):
with st.container():
st.info("Advanced view includes all stats and thresholds, simple includes just basic columns for ease of use on mobile")
st.info(t_stamp)
if st.button("Load/Reset Data", key='reset3'):
st.cache_data.clear()
player_frame, line_frame, pp_frame, timestamp = player_stat_table()
t_stamp = f"Last Update: " + str(timestamp) + f" CST"
site_var3 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var3')
main_var3 = st.radio("Main slate or secondary slate?", ('Main Slate', 'Secondary Slate'), key='main_var3')
sal_var3 = st.slider("Is there a certain price range you want to view?", 5000, 40000, (5000, 40000), key='sal_var3')
final_pp_combos = pp_frame[pp_frame['Site'] == str(site_var3)]
final_pp_combos = final_pp_combos[final_pp_combos['Type'] == 'Basic']
final_pp_combos = final_pp_combos[final_pp_combos['Slate'] == main_var3]
final_pp_combos = final_pp_combos[final_pp_combos['Salary'] >= sal_var3[0]]
final_pp_combos = final_pp_combos[final_pp_combos['Salary'] <= sal_var3[1]]
final_pp_combos = final_pp_combos.drop_duplicates(subset=['Player'])
final_pp_combos = final_pp_combos.sort_values(by='Median', ascending=False)
if view_var1 == 'Advanced':
display_proj_pp = final_pp_combos[['Player', 'SK1', 'SK2', 'SK3', 'SK4', 'SK5', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '75+%', '2x%', '3x%', '4x%',
'Own']]
elif view_var1 == 'Simple':
display_proj_pp = final_pp_combos[['SK1', 'SK2', 'SK3', 'SK4', 'SK5', 'Salary', 'Median', '3x%', 'Own']]
st.dataframe(display_proj_pp.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True, hide_index=True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(display_proj_pp),
file_name='NHL_powerplay_export.csv',
mime='text/csv',
) |