MLB_DFS_ROO / app.py
Multichem's picture
Update app.py
dc1bf8e verified
raw
history blame
29.3 kB
import pulp
import numpy as np
import pandas as pd
import streamlit as st
import gspread
from itertools import combinations
scope = ['https://www.googleapis.com/auth/spreadsheets',
"https://www.googleapis.com/auth/drive"]
credentials = {
"type": "service_account",
"project_id": "model-sheets-connect",
"private_key_id": "0e0bc2fdef04e771172fe5807392b9d6639d945e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDiu1v/e6KBKOcK\ncx0KQ23nZK3ZVvADYy8u/RUn/EDI82QKxTd/DizRLIV81JiNQxDJXSzgkbwKYEDm\n48E8zGvupU8+Nk76xNPakrQKy2Y8+VJlq5psBtGchJTuUSHcXU5Mg2JhQsB376PJ\nsCw552K6Pw8fpeMDJDZuxpKSkaJR6k9G5Dhf5q8HDXnC5Rh/PRFuKJ2GGRpX7n+2\nhT/sCax0J8jfdTy/MDGiDfJqfQrOPrMKELtsGHR9Iv6F4vKiDqXpKfqH+02E9ptz\nBk+MNcbZ3m90M8ShfRu28ebebsASfarNMzc3dk7tb3utHOGXKCf4tF8yYKo7x8BZ\noO9X4gSfAgMBAAECggEAU8ByyMpSKlTCF32TJhXnVJi/kS+IhC/Qn5JUDMuk4LXr\naAEWsWO6kV/ZRVXArjmuSzuUVrXumISapM9Ps5Ytbl95CJmGDiLDwRL815nvv6k3\nUyAS8EGKjz74RpoIoH6E7EWCAzxlnUgTn+5oP9Flije97epYk3H+e2f1f5e1Nn1d\nYNe8U+1HqJgILcxA1TAUsARBfoD7+K3z/8DVPHI8IpzAh6kTHqhqC23Rram4XoQ6\nzj/ZdVBjvnKuazETfsD+Vl3jGLQA8cKQVV70xdz3xwLcNeHsbPbpGBpZUoF73c65\nkAXOrjYl0JD5yAk+hmYhXr6H9c6z5AieuZGDrhmlFQKBgQDzV6LRXmjn4854DP/J\nI82oX2GcI4eioDZPRukhiQLzYerMQBmyqZIRC+/LTCAhYQSjNgMa+ZKyvLqv48M0\n/x398op/+n3xTs+8L49SPI48/iV+mnH7k0WI/ycd4OOKh8rrmhl/0EWb9iitwJYe\nMjTV/QxNEpPBEXfR1/mvrN/lVQKBgQDuhomOxUhWVRVH6x03slmyRBn0Oiw4MW+r\nrt1hlNgtVmTc5Mu+4G0USMZwYuOB7F8xG4Foc7rIlwS7Ic83jMJxemtqAelwOLdV\nXRLrLWJfX8+O1z/UE15l2q3SUEnQ4esPHbQnZowHLm0mdL14qSVMl1mu1XfsoZ3z\nJZTQb48CIwKBgEWbzQRtKD8lKDupJEYqSrseRbK/ax43DDITS77/DWwHl33D3FYC\nMblUm8ygwxQpR4VUfwDpYXBlklWcJovzamXpSnsfcYVkkQH47NuOXPXPkXQsw+w+\nDYcJzeu7F/vZqk9I7oBkWHUrrik9zPNoUzrfPvSRGtkAoTDSwibhoc5dAoGBAMHE\nK0T/ANeZQLNuzQps6S7G4eqjwz5W8qeeYxsdZkvWThOgDd/ewt3ijMnJm5X05hOn\ni4XF1euTuvUl7wbqYx76Wv3/1ZojiNNgy7ie4rYlyB/6vlBS97F4ZxJdxMlabbCW\n6b3EMWa4EVVXKoA1sCY7IVDE+yoQ1JYsZmq45YzPAoGBANWWHuVueFGZRDZlkNlK\nh5OmySmA0NdNug3G1upaTthyaTZ+CxGliwBqMHAwpkIRPwxUJpUwBTSEGztGTAxs\nWsUOVWlD2/1JaKSmHE8JbNg6sxLilcG6WEDzxjC5dLL1OrGOXj9WhC9KX3sq6qb6\nF/j9eUXfXjAlb042MphoF3ZC\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "100369174533302798535",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40model-sheets-connect.iam.gserviceaccount.com"
}
credentials2 = {
"type": "service_account",
"project_id": "sheets-api-connect-378620",
"private_key_id": "1005124050c80d085e2c5b344345715978dd9cc9",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCtKa01beXwc88R\nnPZVQTNPVQuBnbwoOfc66gW3547ja/UEyIGAF112dt/VqHprRafkKGmlg55jqJNt\na4zceLKV+wTm7vBu7lDISTJfGzCf2TrxQYNqwMKE2LOjI69dBM8u4Dcb4k0wcp9v\ntW1ZzLVVuwTvmrg7JBHjiSaB+x5wxm/r3FOiJDXdlAgFlytzqgcyeZMJVKKBQHyJ\njEGg/1720A0numuOCt71w/2G0bDmijuj1e6tH32MwRWcvRNZ19K9ssyDz2S9p68s\nYDhIxX69OWxwScTIHLY6J2t8txf/XMivL/636fPlDADvBEVTdlT606n8CcKUVQeq\npUVdG+lfAgMBAAECggEAP38SUA7B69eTfRpo658ycOs3Amr0JW4H/bb1rNeAul0K\nZhwd/HnU4E07y81xQmey5kN5ZeNrD5EvqkZvSyMJHV0EEahZStwhjCfnDB/cxyix\nZ+kFhv4y9eK+kFpUAhBy5nX6T0O+2T6WvzAwbmbVsZ+X8kJyPuF9m8ldcPlD0sce\ntj8NwVq1ys52eosqs7zi2vjt+eMcaY393l4ls+vNq8Yf27cfyFw45W45CH/97/Nu\n5AmuzlCOAfFF+z4OC5g4rei4E/Qgpxa7/uom+BVfv9G0DIGW/tU6Sne0+37uoGKt\nW6DzhgtebUtoYkG7ZJ05BTXGp2lwgVcNRoPwnKJDxQKBgQDT5wYPUBDW+FHbvZSp\nd1m1UQuXyerqOTA9smFaM8sr/UraeH85DJPEIEk8qsntMBVMhvD3Pw8uIUeFNMYj\naLmZFObsL+WctepXrVo5NB6RtLB/jZYxiKMatMLUJIYtcKIp+2z/YtKiWcLnwotB\nWdCjVnPTxpkurmF2fWP/eewZ+wKBgQDRMtJg7etjvKyjYNQ5fARnCc+XsI3gkBe1\nX9oeXfhyfZFeBXWnZzN1ITgFHplDznmBdxAyYGiQdbbkdKQSghviUQ0igBvoDMYy\n1rWcy+a17Mj98uyNEfmb3X2cC6WpvOZaGHwg9+GY67BThwI3FqHIbyk6Ko09WlTX\nQpRQjMzU7QKBgAfi1iflu+q0LR+3a3vvFCiaToskmZiD7latd9AKk2ocsBd3Woy9\n+hXXecJHPOKV4oUJlJgvAZqe5HGBqEoTEK0wyPNLSQlO/9ypd+0fEnArwFHO7CMF\nycQprAKHJXM1eOOFFuZeQCaInqdPZy1UcV5Szla4UmUZWkk1m24blHzXAoGBAMcA\nyH4qdbxX9AYrC1dvsSRvgcnzytMvX05LU0uF6tzGtG0zVlub4ahvpEHCfNuy44UT\nxRWW/oFFaWjjyFxO5sWggpUqNuHEnRopg3QXx22SRRTGbN45li/+QAocTkgsiRh1\nqEcYZsO4mPCsQqAy6E2p6RcK+Xa+omxvSnVhq0x1AoGAKr8GdkCl4CF6rieLMAQ7\nLNBuuoYGaHoh8l5E2uOQpzwxVy/nMBcAv+2+KqHEzHryUv1owOi6pMLv7A9mTFoS\n18B0QRLuz5fSOsVnmldfC9fpUc6H8cH1SINZpzajqQA74bPwELJjnzrCnH79TnHG\nJuElxA33rFEjbgbzdyrE768=\n-----END PRIVATE KEY-----\n",
"client_email": "gspread-connection@sheets-api-connect-378620.iam.gserviceaccount.com",
"client_id": "106625872877651920064",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40sheets-api-connect-378620.iam.gserviceaccount.com"
}
gc = gspread.service_account_from_dict(credentials)
gc2 = gspread.service_account_from_dict(credentials2)
st.set_page_config(layout="wide")
game_format = {'Win Percentage': '{:.2%}','First Inning Lead Percentage': '{:.2%}',
'Fifth Inning Lead Percentage': '{:.2%}', '8+ runs': '{:.2%}', 'DK LevX': '{:.2%}', 'FD LevX': '{:.2%}'}
player_roo_format = {'Top_finish': '{:.2%}','Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '2x%': '{:.2%}', '3x%': '{:.2%}',
'4x%': '{:.2%}','GPP%': '{:.2%}'}
wrong_acro = ['AZ', 'CHW']
right_acro = ['ARI', 'CWS']
dk_player_projections = 'https://docs.google.com/spreadsheets/d/1MdzPFqIT0MFid2IhegWf39VNR8IXUyo_Fb5dolOSt3o/edit#gid=340831852'
fd_player_projections = 'https://docs.google.com/spreadsheets/d/1MdzPFqIT0MFid2IhegWf39VNR8IXUyo_Fb5dolOSt3o/edit#gid=340831852'
secondary_dk_player_projections = 'https://docs.google.com/spreadsheets/d/1lP4t8N7UhjR94MEwPn6powRyLl_cQBDUMSCs6cbL9ms/edit#gid=340831852'
secondary_fd_player_projections = 'https://docs.google.com/spreadsheets/d/1lP4t8N7UhjR94MEwPn6powRyLl_cQBDUMSCs6cbL9ms/edit#gid=340831852'
all_dk_player_projections = 'https://docs.google.com/spreadsheets/d/1f42Ergav8K1VsOLOK9MUn7DM_MLMvv4GR2Fy7EfnZTc/edit#gid=500994479'
all_fd_player_projections = 'https://docs.google.com/spreadsheets/d/1f42Ergav8K1VsOLOK9MUn7DM_MLMvv4GR2Fy7EfnZTc/edit#gid=500994479'
final_Proj = 0
@st.cache_data
def load_time():
try:
sh = gc.open_by_url(dk_player_projections)
worksheet = sh.worksheet('Timestamp')
raw_stamp = worksheet.acell('a1').value
except:
sh = gc2.open_by_url(dk_player_projections)
worksheet = sh.worksheet('Timestamp')
raw_stamp = worksheet.acell('a1').value
t_stamp = f"Last update was at {raw_stamp}"
return t_stamp
@st.cache_data
def set_slate_teams():
try:
sh = gc.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet('Site_Info')
raw_display = pd.DataFrame(worksheet.get_all_records())
except:
sh = gc2.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet('Site_Info')
raw_display = pd.DataFrame(worksheet.get_all_records())
for checkVar in range(len(wrong_acro)):
raw_display['DK Main'] = raw_display['DK Main'].replace(wrong_acro, right_acro)
for checkVar in range(len(wrong_acro)):
raw_display['DK Secondary'] = raw_display['DK Secondary'].replace(wrong_acro, right_acro)
for checkVar in range(len(wrong_acro)):
raw_display['DK Overall'] = raw_display['DK Overall'].replace(wrong_acro, right_acro)
for checkVar in range(len(wrong_acro)):
raw_display['FD Main'] = raw_display['FD Main'].replace(wrong_acro, right_acro)
for checkVar in range(len(wrong_acro)):
raw_display['FD Secondary'] = raw_display['FD Secondary'].replace(wrong_acro, right_acro)
for checkVar in range(len(wrong_acro)):
raw_display['FD Overall'] = raw_display['FD Overall'].replace(wrong_acro, right_acro)
return raw_display
@st.cache_data
def load_dk_player_projections(URL):
try:
sh = gc.open_by_url(URL)
worksheet = sh.worksheet('DK_Projections')
except:
sh = gc2.open_by_url(URL)
worksheet = sh.worksheet('DK_Projections')
load_display = pd.DataFrame(worksheet.get_all_records())
load_display.replace('', np.nan, inplace=True)
load_display = load_display.drop_duplicates(subset='Player')
raw_display = load_display.dropna(subset=['Median'])
for checkVar in range(len(wrong_acro)):
raw_display['Team'] = raw_display['Team'].replace(wrong_acro, right_acro)
return raw_display
@st.cache_data
def load_fd_player_projections(URL):
try:
sh = gc.open_by_url(URL)
worksheet = sh.worksheet('FD_Projections')
except:
sh = gc2.open_by_url(URL)
worksheet = sh.worksheet('FD_Projections')
load_display = pd.DataFrame(worksheet.get_all_records())
load_display.replace('', np.nan, inplace=True)
load_display = load_display.drop_duplicates(subset='Player')
raw_display = load_display.dropna(subset=['Median'])
for checkVar in range(len(wrong_acro)):
raw_display['Team'] = raw_display['Team'].replace(wrong_acro, right_acro)
return raw_display
@st.cache_data
def load_dk_player_roo(tab):
try:
sh = gc.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet(tab)
except:
sh = gc2.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet(tab)
load_display = pd.DataFrame(worksheet.get_all_records())
raw_display = load_display
for checkVar in range(len(wrong_acro)):
raw_display['Team'] = raw_display['Team'].replace(wrong_acro, right_acro)
return raw_display
@st.cache_data
def load_fd_player_roo(tab):
try:
sh = gc.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet(tab)
except:
sh = gc2.open_by_url(all_dk_player_projections)
worksheet = sh.worksheet(tab)
load_display = pd.DataFrame(worksheet.get_all_records())
raw_display = load_display
for checkVar in range(len(wrong_acro)):
raw_display['Team'] = raw_display['Team'].replace(wrong_acro, right_acro)
return raw_display
@st.cache_data
def convert_df_to_csv(df):
return df.to_csv().encode('utf-8')
t_stamp = load_time()
site_slates = set_slate_teams()
col1, col2, col3, col4, col5 = st.columns([2, 2, 2, 2, 2])
#st.info(t_stamp)
if st.button("Load/Reset Data", key='reset30'):
t_stamp = load_time()
st.cache_data.clear()
with col1:
slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'All Games'), key='slate_var1')
with col2:
site_var1 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var1')
with col3:
custom_var1 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var1')
if custom_var1 == 'No':
if slate_var1 == 'Main Slate':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Main'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Main'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif slate_var1 == 'Secondary Slate':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Secondary'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Secondary'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif slate_var1 == 'All Games':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Overall'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Overall'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
if custom_var1 == 'Yes':
contest_var1 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1')
if slate_var1 == 'Main Slate':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Main'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Main'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif slate_var1 == 'Secondary Slate':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Secondary'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Secondary'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif slate_var1 == 'All Games':
if site_var1 == 'Draftkings':
slate_teams = site_slates['DK Overall'].values.tolist()
raw_baselines = load_dk_player_projections(all_dk_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
elif site_var1 == 'Fanduel':
slate_teams = site_slates['FD Overall'].values.tolist()
raw_baselines = load_fd_player_projections(all_fd_player_projections)
raw_baselines = raw_baselines[raw_baselines['Team'].isin(slate_teams)]
with col4:
split_var1 = st.radio("Are you running the full slate or certain 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 = raw_baselines['Team'].unique(), key='team_var1')
elif split_var1 == 'Full Slate Run':
team_var1 = raw_baselines.Team.values.tolist()
with col5:
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 = ['SP', 'P', 'C', '1B', '2B', '3B', 'SS', 'OF'])
elif pos_split1 == 'All Positions':
pos_var1 = 'All'
if custom_var1 == 'No':
if slate_var1 == 'Main Slate':
if site_var1 == 'Draftkings':
final_Proj = load_dk_player_roo('Main_ROO')
elif site_var1 == 'Fanduel':
final_Proj = load_fd_player_roo('Main_FD_ROO')
elif slate_var1 == 'Secondary Slate':
if site_var1 == 'Draftkings':
final_Proj = load_dk_player_roo('Secondary_ROO')
elif site_var1 == 'Fanduel':
final_Proj = load_fd_player_roo('Secondary_FD_ROO')
elif slate_var1 == 'All Games':
if site_var1 == 'Draftkings':
final_Proj = load_dk_player_roo('Merged_ROO')
elif site_var1 == 'Fanduel':
final_Proj = load_fd_player_roo('Merged_FD_ROO')
final_Proj = final_Proj[final_Proj['Team'].isin(team_var1)]
if pos_var1 != 'All':
final_Proj = final_Proj[final_Proj['Position'].str.contains('|'.join(pos_var1))]
st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(final_Proj),
file_name='Custom_MLB_export.csv',
mime='text/csv',
)
elif custom_var1 == 'Yes':
hold_container = st.empty()
if st.button('Create Range of Outcomes for Slate'):
with hold_container:
working_roo = raw_baselines
working_roo = working_roo[working_roo['Team'].isin(team_var1)]
own_dict = dict(zip(working_roo.Player, working_roo.Own))
team_dict = dict(zip(working_roo.Player, working_roo.Team))
total_sims = 1000
flex_file = working_roo[['Player', 'Position', 'Salary', 'Median', 'Ceiling_Var']]
flex_file['Floor'] = flex_file['Median']*.25
flex_file['Ceiling'] = np.where(flex_file['Position'] == 'SP', (flex_file['Median'] + (flex_file['Floor'])) + ((flex_file['Ceiling_Var'] * 10) * 3), (flex_file['Median'] + (flex_file['Floor'])) + ((flex_file['Ceiling_Var'] * 10)))
flex_file['STD'] = (flex_file['Median']/4)
flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
if pos_split1 == 'All Positions':
flex_file = flex_file
elif pos_split1 != 'All Positions':
if pos_var1 == 'Pitchers':
flex_file = flex_file[flex_file['Position'] == 'SP']
elif pos_var1 == 'Hitters':
flex_file = flex_file[flex_file['Position'] != 'SP']
elif pos_var1 not in ['Pitchers', 'Hitters']:
flex_file = flex_file[flex_file['Position'].str.contains('|'.join(pos_var1))]
hold_file = flex_file
overall_file = flex_file
salary_file = flex_file
overall_players = overall_file[['Player']]
for x in range(0,total_sims):
salary_file[x] = salary_file['Salary']
salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
salary_file.astype('int').dtypes
salary_file = salary_file.div(1000)
for x in range(0,total_sims):
overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
overall_file.astype('int').dtypes
players_only = hold_file[['Player']]
raw_lineups_file = players_only
for x in range(0,total_sims):
maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
players_only[x] = raw_lineups_file[x].rank(ascending=False)
players_only=players_only.drop(['Player'], axis=1)
players_only.astype('int').dtypes
salary_2x_check = (overall_file - (salary_file*2))
salary_3x_check = (overall_file - (salary_file*3))
salary_4x_check = (overall_file - (salary_file*4))
gpp_check = (overall_file - ((salary_file*2)+10))
players_only['Average_Rank'] = players_only.mean(axis=1)
players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
players_only['GPP%'] = gpp_check[gpp_check >= 1].count(axis=1)/float(total_sims)
players_only['Player'] = hold_file[['Player']]
final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'GPP%']]
final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'GPP%']]
final_Proj['Own'] = final_Proj['Player'].map(own_dict)
final_Proj['Team'] = final_Proj['Player'].map(team_dict)
final_Proj['Own'] = final_Proj['Own'].astype('float')
if contest_var1 == 'Small Field GPP':
if site_var1 == 'Draftkings':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (10 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
elif site_var1 == 'Fanduel':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (10 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean())/150) + final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
elif contest_var1 == 'Large Field GPP':
if site_var1 == 'Draftkings':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (2.5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
elif site_var1 == 'Fanduel':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (2.5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (5 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean())/150) + final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
elif contest_var1 == 'Cash':
if site_var1 == 'Draftkings':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (6 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'SP', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'SP') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean() >= 0), final_Proj['Own'] * (11 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] != 'SP', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
elif site_var1 == 'Fanduel':
final_Proj['Own%'] = np.where((final_Proj['Position'] == 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (6 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean())/100) + final_Proj.loc[final_Proj['Position'] == 'P', 'Own'].mean(), final_Proj['Own'])
final_Proj['Own%'] = np.where((final_Proj['Position'] != 'P') & (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean() >= 0), final_Proj['Own'] * (11 * (final_Proj['Own'] - final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean())/150) + final_Proj.loc[final_Proj['Position'] != 'P', 'Own'].mean(), final_Proj['Own%'])
final_Proj['Own%'] = np.where(final_Proj['Own%'] > 75, 75, final_Proj['Own%'])
final_Proj = final_Proj[['Player', 'Position', 'Team', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'GPP%', 'Own%']]
final_Proj = final_Proj.set_index('Player')
final_Proj = final_Proj.sort_values(by='Median', ascending=False)
with hold_container:
hold_container = st.empty()
final_Proj = final_Proj
st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), height=1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(final_Proj),
file_name='Custom_MLB_export.csv',
mime='text/csv',
)