Spaces:
Build error
Build error
| import streamlit as st | |
| import numpy as np | |
| import pandas as pd | |
| import pymongo | |
| import os | |
| import time | |
| st.set_page_config(layout="wide") | |
| def init_conn(): | |
| uri = os.getenv('mongo_uri') | |
| client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000) | |
| db = client["MLB_Database"] | |
| return db | |
| db = init_conn() | |
| 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; | |
| } | |
| div[data-baseweb="select"] > div { | |
| background-color: #DAA520; | |
| color: white; | |
| } | |
| div{ | |
| box-sizing: content-box !important; | |
| } | |
| </style>""", unsafe_allow_html=True) | |
| def paginate_dataframe(df, page_size): | |
| total_rows = len(df) | |
| total_pages = (total_rows + page_size -1) // page_size | |
| if 'current_page' not in st.session_state: | |
| st.session_state['current_page'] = 0 | |
| start_idx = st.session_state['current_page'] * page_size | |
| end_idx = start_idx + page_size | |
| current_page_data = df.iloc[start_idx:end_idx] | |
| return current_page_data, total_pages, total_rows | |
| def display_paginated_table(df, page_size): | |
| current_page_data, total_pages, total_rows = paginate_dataframe(df, page_size) | |
| st.dataframe(current_page_data.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True) | |
| col1, col2, col3, col4 = st.columns([1, 2, 2, 1]) | |
| with col1: | |
| if st.button('⏮️ First', disabled=st.session_state.current_page == 0): | |
| st.session_state.current_page = 0 | |
| st.rerun() | |
| with col2: | |
| if st.button('⬅️ Previous', disabled=st.session_state.current_page == 0): | |
| st.session_state.current_page -= 1 | |
| st.rerun() | |
| with col3: | |
| if st.button('Next ➡️', disabled=st.session_state.current_page >= total_pages - 1): | |
| st.session_state.current_page += 1 | |
| st.rerun() | |
| with col4: | |
| if st.button('Last ⏭️', disabled=st.session_state.current_page >= total_pages - 1): | |
| st.session_state.current_page = total_pages - 1 | |
| st.rerun() | |
| def init_baselines(): | |
| db_pulls = ['Bullpen_Data', 'Hitter_Agg_Merge', 'Hitter_Long_Merge', 'Hitter_Short_Merge', 'Pitcher_Agg_Merge', 'Pitcher_Long_Merge', 'Pitcher_Short_Merge', | |
| 'Slate_Hitters_Merge', 'Slate_Teams_Merge', 'Starting_Pitchers', 'True_AVG_Split', 'Pitcher_Info', 'Hitter_Info'] | |
| for table in db_pulls: | |
| collection = db[table] | |
| cursor = collection.find() | |
| df = pd.DataFrame(cursor) | |
| if table == 'Bullpen_Data': | |
| try: | |
| bp_data = df.drop(columns = ['_id']) | |
| except: | |
| bp_data = df | |
| elif table == 'Hitter_Agg_Merge': | |
| try: | |
| hitter_agg = df.drop(columns = ['_id']) | |
| except: | |
| hitter_agg = df | |
| elif table == 'Hitter_Long_Merge': | |
| try: | |
| hitter_long = df.drop(columns = ['_id']) | |
| except: | |
| hitter_long = df | |
| elif table == 'Hitter_Short_Merge': | |
| try: | |
| hitter_short = df.drop(columns = ['_id']) | |
| except: | |
| hitter_short = df | |
| elif table == 'Pitcher_Agg_Merge': | |
| try: | |
| pitcher_agg = df.drop(columns = ['_id']) | |
| except: | |
| pitcher_agg = df | |
| elif table == 'Pitcher_Long_Merge': | |
| try: | |
| pitcher_long = df.drop(columns = ['_id']) | |
| except: | |
| pitcher_long = df | |
| elif table == 'Pitcher_Short_Merge': | |
| try: | |
| pitcher_short = df.drop(columns = ['_id']) | |
| except: | |
| pitcher_short = df | |
| elif table == 'Slate_Hitters_Merge': | |
| try: | |
| slate_hitters = df.drop(columns = ['_id']) | |
| except: | |
| slate_hitters = df | |
| elif table == 'Slate_Teams_Merge': | |
| try: | |
| slate_team = df.drop(columns = ['_id']) | |
| except: | |
| slate_team = df | |
| elif table == 'Starting_Pitchers': | |
| try: | |
| starting_pitchers = df.drop(columns = ['_id']) | |
| except: | |
| starting_pitchers = df | |
| elif table == 'True_AVG_Split': | |
| try: | |
| true_avg_split = df.drop(columns = ['_id']) | |
| except: | |
| true_avg_split = df | |
| elif table == 'Pitcher_Info': | |
| try: | |
| pitcher_info = df.drop(columns = ['_id']) | |
| except: | |
| pitcher_info = df | |
| elif table == 'Hitter_Info': | |
| try: | |
| hitter_info = df.drop(columns = ['_id']) | |
| except: | |
| hitter_info = df | |
| return bp_data, hitter_agg, hitter_long, hitter_short, pitcher_agg, pitcher_long, pitcher_short, slate_hitters, slate_team, starting_pitchers, true_avg_split, pitcher_info, hitter_info | |
| bp_data, hitter_agg, hitter_long, hitter_short, pitcher_agg, pitcher_long, pitcher_short, slate_hitters, slate_team, starting_pitchers, true_avg_split, pitcher_info, hitter_info = init_baselines() | |
| pitcher_tab, hitter_tab, team_tab = st.tabs(['Pitchers', 'Hitters', 'Team']) | |
| with pitcher_tab: | |
| with st.container(border = True): | |
| st.info('Note: Splits options are available for all baseline tables, they do not apply to True AVG, HWSr, or the Overview tables') | |
| col1, col2, col3, col4, col5 = st.columns(5) | |
| with col1: | |
| site_var_sp = st.selectbox('Site', ['DraftKings', 'FanDuel'], key = 'site_var_sp') | |
| with col2: | |
| table_var_sp = st.selectbox('Table', ['True AVG Splits', 'HWSr Splits', 'Current Slate Overview', 'Active Baselines', 'League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines'], key = 'table_var_sp') | |
| with col3: | |
| splits_var_sp = st.selectbox('Splits', ['RHH', 'LHH', 'Overall'], key = 'splits_var_sp') | |
| with col4: | |
| team_type_sp = st.selectbox('Do you want to view all teams or Specific ones?', ['All', 'Specific'], key = 'team_type_sp') | |
| with col5: | |
| if team_type_sp == 'Specific': | |
| team_var_sp = st.multiselect('Select Teams', starting_pitchers['Team'].unique(), key = 'team_var_sp') | |
| else: | |
| team_var_sp = None | |
| st.write('All teams selected') | |
| if table_var_sp == 'True AVG Splits': | |
| disp_raw = true_avg_split | |
| if team_var_sp is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_sp)] | |
| disp_raw = disp_raw[['Player', 'Handedness', 'Team', 'Opp', 'Opp LHH', 'Opp RHH', 'True AVG (LHH)', 'True AVG (RHH)', 'True AVG (Overall)', 'Weighted True AVG']] | |
| elif table_var_sp == 'HWSr Splits': | |
| disp_raw = true_avg_split | |
| if team_var_sp is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_sp)] | |
| disp_raw = disp_raw[['Player', 'Handedness', 'Team', 'Opp', 'Opp LHH', 'Opp RHH', 'HWSr (LHH)', 'HWSr (RHH)', 'HWSr (Overall)', 'Weighted HWSr']] | |
| elif table_var_sp == 'Current Slate Overview': | |
| disp_raw = starting_pitchers | |
| disp_raw = disp_raw.drop(columns = ['DK Own Adj', 'Perf_Adj', 'Curr']) | |
| if team_var_sp is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_sp)] | |
| elif table_var_sp == 'Active Baselines': | |
| disp_raw = pitcher_info | |
| if splits_var_sp != 'Overall': | |
| disp_raw = disp_raw[disp_raw['Set'] == splits_var_sp] | |
| else: | |
| disp_raw = disp_raw[disp_raw['Set'] == 'RHH'] | |
| if team_var_sp is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_sp)] | |
| disp_raw = disp_raw[['Names', 'DK_Salary', 'FD_Salary', 'Team', 'Opp', 'Opp_TT', 'Hand', 'K%', 'BB%', 'True AVG', 'xSLG', 'xBA', 'Hits', 'xHRs', 'xHR/PA']] | |
| positive_set = ['K%'] | |
| elif table_var_sp == 'League Aggregate Baselines': | |
| disp_raw = pitcher_agg | |
| disp_raw = disp_raw[disp_raw['Set'] == splits_var_sp] | |
| disp_raw = disp_raw[['Player', 'PA', 'Hits', 'Singles', 'Doubles', 'Homeruns', 'Strikeoutper', 'Strikeouts', 'Walkper', 'Walks', 'xBA', 'xSLG', 'xwOBA', 'BABIP', 'AVG', 'FB%', 'True_AVG', 'xHits', 'xHRs', 'xHR/PA', 'HWSr']] | |
| elif table_var_sp == 'League Short Term Baselines': | |
| disp_raw = pitcher_short | |
| disp_raw = disp_raw[disp_raw['Set'] == splits_var_sp] | |
| disp_raw = disp_raw[['Player', 'PA', 'Hits', 'Singles', 'Doubles', 'Homeruns', 'Strikeoutper', 'Strikeouts', 'Walkper', 'Walks', 'xBA', 'xSLG', 'xwOBA', 'BABIP', 'AVG', 'FB%', 'True_AVG', 'xHits', 'xHRs', 'xHR/PA', 'HWSr']] | |
| elif table_var_sp == 'League Long Term Baselines': | |
| disp_raw = pitcher_long | |
| disp_raw = disp_raw[disp_raw['Set'] == splits_var_sp] | |
| disp_raw = disp_raw[['Player', 'PA', 'Hits', 'Singles', 'Doubles', 'Homeruns', 'Strikeoutper', 'Strikeouts', 'Walkper', 'Walks', 'xBA', 'xSLG', 'xwOBA', 'BABIP', 'AVG', 'FB%', 'True_AVG', 'xHits', 'xHRs', 'xHR/PA', 'HWSr']] | |
| st.session_state['sp_disp_frame'] = disp_raw | |
| page_var = len(st.session_state['sp_disp_frame']) / 2 | |
| sp_disp_container = st.container(border = True) | |
| sp_disp_container = sp_disp_container.empty() | |
| if table_var_sp in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']): | |
| with st.spinner("Full league baselines can take some time to load"): | |
| time.sleep(5) | |
| display_paginated_table(st.session_state['sp_disp_frame'], 50) | |
| else: | |
| with sp_disp_container: | |
| st.dataframe(st.session_state['sp_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn_r').format(precision=2), height = 500, use_container_width = True, hide_index = True) | |
| with hitter_tab: | |
| with st.container(border = True): | |
| st.info('Note: Splits options are available for all baseline tables') | |
| col1, col2, col3, col4, col5 = st.columns(5) | |
| with col1: | |
| site_var_hitter = st.selectbox('Site', ['Draftkings', 'Fanduel'], key = 'site_var_hitter') | |
| with col2: | |
| table_var_hitter = st.selectbox('Table', ['Current Slate Overview', 'Active Baselines', 'League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines'], key = 'table_var_hitter') | |
| with col3: | |
| splits_var_hitter = st.selectbox('Splits', ['Overall', 'RHP', 'LHP'], key = 'splits_var_hitter') | |
| with col4: | |
| position_type_hitter = st.selectbox('Do you want to view all Positions or Specific ones?', ['All', 'Specific'], key = 'position_type_hitter') | |
| if position_type_hitter == 'Specific': | |
| position_var_hitter = st.multiselect('Positions', ['C', '1B', '2B', '3B', 'SS', 'OF'], key = 'position_var_hitter') | |
| else: | |
| position_var_hitter = None | |
| st.write('All Positions selected') | |
| with col5: | |
| team_type_hitter = st.selectbox('Do you want to view all Teams or Specific ones?', ['All', 'Specific'], key = 'team_type_hitter') | |
| if team_type_hitter == 'Specific': | |
| team_var_hitter = st.multiselect('Select Teams', slate_hitters['Team'].unique(), key = 'team_var_hitter') | |
| else: | |
| team_var_hitter = None | |
| st.write('All Teams selected') | |
| if table_var_hitter == 'Current Slate Overview': | |
| disp_raw = slate_hitters | |
| if team_var_hitter is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_hitter)] | |
| if position_var_hitter: | |
| position_mask = disp_raw['Position'].apply(lambda x: any(pos in x for pos in position_var_hitter)) | |
| disp_raw = disp_raw[position_mask] | |
| disp_raw = disp_raw[disp_raw['Set'] == site_var_hitter] | |
| elif table_var_hitter == 'Active Baselines': | |
| disp_raw = hitter_info | |
| if team_var_hitter is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_hitter)] | |
| if position_var_hitter: | |
| position_mask = disp_raw['Position'].apply(lambda x: any(pos in x for pos in position_var_hitter)) | |
| disp_raw = disp_raw[position_mask] | |
| disp_raw = disp_raw.drop(columns = ['DK_SD_Salary', 'FD_SD_Salary', 'DK_Own', 'FD_Own', 'DK_player_ID', 'FD_player_ID', 'Opp_TT']) | |
| elif table_var_hitter == 'League Aggregate Baselines': | |
| disp_raw = hitter_agg | |
| if team_var_hitter is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_hitter)] | |
| elif table_var_hitter == 'League Short Term Baselines': | |
| disp_raw = hitter_short | |
| if team_var_hitter is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_hitter)] | |
| elif table_var_hitter == 'League Long Term Baselines': | |
| disp_raw = hitter_long | |
| if team_var_hitter is not None: | |
| disp_raw = disp_raw[disp_raw['Team'].isin(team_var_hitter)] | |
| st.session_state['hitter_disp_frame'] = disp_raw | |
| hitter_disp_container = st.container(border = True) | |
| hitter_disp_container = hitter_disp_container.empty() | |
| with hitter_disp_container: | |
| if table_var_hitter in (['League Aggregate Baselines', 'League Short Term Baselines', 'League Long Term Baselines']): | |
| with st.spinner("Full league baselines can take some time to load"): | |
| time.sleep(7) | |
| display_paginated_table(st.session_state['hitter_disp_frame'], 50) | |
| else: | |
| st.dataframe(st.session_state['hitter_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height = 750, use_container_width = True, hide_index = True) | |
| with team_tab: | |
| with st.container(border = True): | |
| col1, col2, col3 = st.columns(3) | |
| with col1: | |
| site_var_team= st.selectbox('Site', ['DraftKings', 'FanDuel'], key = 'site_var_team') | |
| with col2: | |
| table_var_team = st.selectbox('Table', ['Team Baselines', 'Bullpen Baselines'], key = 'table_var_team') | |
| if table_var_team == 'Team Baselines': | |
| st.session_state['team_disp_frame'] = slate_team | |
| elif table_var_team == 'Bullpen Baselines': | |
| st.session_state['team_disp_frame'] = bp_data | |
| team_disp_container = st.container(border = True) | |
| team_disp_container = team_disp_container.empty() | |
| with team_disp_container: | |
| st.dataframe(st.session_state['team_disp_frame'].style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), height = 750, use_container_width = True, hide_index = True) |