Spaces:
Running
Running
File size: 11,827 Bytes
30c3d8b 118ea5f 43b1cc0 30c3d8b 49f71b5 30c3d8b 45a2bd5 e85ca48 b855174 45a2bd5 e239116 45a2bd5 7e61f4f 45a2bd5 e85ca48 b855174 45a2bd5 e239116 45a2bd5 7e61f4f 45a2bd5 e85ca48 b855174 45a2bd5 e239116 45a2bd5 7e61f4f 45a2bd5 a667a07 30c3d8b e85ca48 b855174 a3c3cc3 e239116 a3c3cc3 f2193e9 30c3d8b 9a45b8f c8a4d47 7e61f4f 45a2bd5 43b1cc0 e483112 43b1cc0 4c14300 a92b1fc 192c49e 43b1cc0 a92b1fc 43b1cc0 30c3d8b 43b1cc0 45a2bd5 43b1cc0 30c3d8b 45a2bd5 43b1cc0 45a2bd5 118ea5f 45a2bd5 118ea5f 45a2bd5 43b1cc0 45a2bd5 118ea5f 45a2bd5 118ea5f 45a2bd5 43b1cc0 45a2bd5 118ea5f 45a2bd5 118ea5f 45a2bd5 43b1cc0 45a2bd5 118ea5f 45a2bd5 118ea5f 45a2bd5 |
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 |
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": "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)
st.set_page_config(layout="wide")
american_format = {'OwnAvg': '{:.2%}'}
stacks_format = {'Total Own': '{:.2%}'}
@st.cache_resource(ttl = 600)
def init_baselines():
sh = gc.open_by_url("https://docs.google.com/spreadsheets/d/17OAf4OAfW92-loMNUFvIubNmgF9111dsObybo6xhtYY/edit?gid=1468336051#gid=1468336051")
worksheet = sh.worksheet('QB')
all_values = worksheet.get_all_values()
cell_vals = [row[0:11] for row in all_values[2:500]]
frame_hold = pd.DataFrame(cell_vals, columns=['Player', 'Team', 'Salary', 'OwnAvg', 'PointsAvg', 'Points per $', 'blank', 'drop', 'drop2', 'drop3', 'GPP Rank'])
frame_hold['PointsAvg'] = frame_hold['PointsAvg'].astype(float)
frame_hold['OwnAvg'] = frame_hold['OwnAvg'].str.replace('%', '').astype(float)/100
frame_hold['Floor'] = frame_hold['PointsAvg'] * .15
frame_hold['Ceiling'] = frame_hold['PointsAvg'] * 1.85
qb_frame = frame_hold[['Player', 'Team', 'Salary', 'OwnAvg', 'Floor', 'PointsAvg', 'Ceiling', 'Points per $', 'GPP Rank']]
string_cols = ['Team']
qb_frame = qb_frame.drop_duplicates(subset='Player')
qb_frame = qb_frame.set_index('Player')
for col in qb_frame.columns:
if col not in string_cols:
try:
qb_frame[col] = pd.to_numeric(qb_frame[col], errors='coerce')
except ValueError:
pass # Ignore columns that cannot be converted
qb_frame = qb_frame.sort_values(by='GPP Rank', ascending=False)
worksheet = sh.worksheet('RB')
all_values = worksheet.get_all_values()
cell_vals = [row[0:11] for row in all_values[2:500]]
frame_hold = pd.DataFrame(cell_vals, columns=['Player', 'Team', 'Salary', 'OwnAvg', 'PointsAvg', 'Points per $', 'blank', 'drop', 'drop2', 'drop3', 'GPP Rank'])
frame_hold['PointsAvg'] = frame_hold['PointsAvg'].astype(float)
frame_hold['OwnAvg'] = frame_hold['OwnAvg'].str.replace('%', '').astype(float)/100
frame_hold['Floor'] = frame_hold['PointsAvg'] * .15
frame_hold['Ceiling'] = frame_hold['PointsAvg'] * 1.85
rb_frame = frame_hold[['Player', 'Team', 'Salary', 'OwnAvg', 'Floor', 'PointsAvg', 'Ceiling', 'Points per $', 'GPP Rank']]
string_cols = ['Team']
rb_frame = rb_frame.drop_duplicates(subset='Player')
rb_frame = rb_frame.set_index('Player')
for col in rb_frame.columns:
if col not in string_cols:
try:
rb_frame[col] = pd.to_numeric(rb_frame[col], errors='coerce')
except ValueError:
pass # Ignore columns that cannot be converted
rb_frame = rb_frame.sort_values(by='GPP Rank', ascending=False)
worksheet = sh.worksheet('WR')
all_values = worksheet.get_all_values()
cell_vals = [row[0:11] for row in all_values[2:500]]
frame_hold = pd.DataFrame(cell_vals, columns=['Player', 'Team', 'Salary', 'OwnAvg', 'PointsAvg', 'Points per $', 'blank', 'drop', 'drop2', 'drop3', 'GPP Rank'])
frame_hold['PointsAvg'] = frame_hold['PointsAvg'].astype(float)
frame_hold['OwnAvg'] = frame_hold['OwnAvg'].str.replace('%', '').astype(float)/100
frame_hold['Floor'] = frame_hold['PointsAvg'] * .15
frame_hold['Ceiling'] = frame_hold['PointsAvg'] * 1.85
wr_frame = frame_hold[['Player', 'Team', 'Salary', 'OwnAvg', 'Floor', 'PointsAvg', 'Ceiling', 'Points per $', 'GPP Rank']]
string_cols = ['Team']
wr_frame = wr_frame.drop_duplicates(subset='Player')
wr_frame = wr_frame.set_index('Player')
for col in wr_frame.columns:
if col not in string_cols:
try:
wr_frame[col] = pd.to_numeric(wr_frame[col], errors='coerce')
except ValueError:
pass # Ignore columns that cannot be converted
wr_frame = wr_frame.sort_values(by='GPP Rank', ascending=False)
worksheet = sh.worksheet('Flex')
all_values = worksheet.get_all_values()
cell_vals = [row[0:11] for row in all_values[2:500]]
frame_hold = pd.DataFrame(cell_vals, columns=['Player', 'Team', 'Salary', 'OwnAvg', 'PointsAvg', 'Points per $', 'blank', 'drop', 'drop2', 'drop3', 'GPP Rank'])
frame_hold['PointsAvg'] = frame_hold['PointsAvg'].astype(float)
frame_hold['OwnAvg'] = frame_hold['OwnAvg'].str.replace('%', '').astype(float)/100
frame_hold['Floor'] = frame_hold['PointsAvg'] * .15
frame_hold['Ceiling'] = frame_hold['PointsAvg'] * 1.85
flex_frame = frame_hold[['Player', 'Team', 'Salary', 'OwnAvg', 'Floor', 'PointsAvg', 'Ceiling', 'Points per $', 'GPP Rank']]
string_cols = ['Team']
flex_frame = flex_frame.drop_duplicates(subset='Player')
flex_frame = flex_frame.set_index('Player')
for col in flex_frame.columns:
if col not in string_cols:
try:
flex_frame[col] = pd.to_numeric(flex_frame[col], errors='coerce')
except ValueError:
pass # Ignore columns that cannot be converted
flex_frame = flex_frame.sort_values(by='GPP Rank', ascending=False)
worksheet = sh.worksheet('Stacks')
all_values = worksheet.get_all_values()
cell_vals = [row[0:29] for row in all_values[1:500]]
frame_hold = pd.DataFrame(cell_vals, columns=['Team', 'Opp', 'd1', 'd2', 'Game Stack', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'd10', 'd11', 'd12', 'd13', 'd14', 'Team Stack',
'15', '16', '17', '18', '19', '20', '21', 'Total Stack Cost', 'Total Own', 'Total Points', 'Points/$'])
frame_hold = frame_hold[frame_hold['Total Own'] != ""]
frame_hold['Total Own'] = frame_hold['Total Own'].str.replace('%', '').astype(float)/100
frame_hold['Total Stack Cost'] = frame_hold['Total Stack Cost'].str.replace(',', '').astype(float)
stack_frame = frame_hold[['Team', 'Opp', 'Game Stack', 'Team Stack', 'Total Stack Cost', 'Total Own', 'Total Points', 'Points/$']]
string_cols = ['Team', 'Opp']
stack_frame = stack_frame.drop_duplicates(subset='Team')
stack_frame = stack_frame.set_index('Team')
for col in stack_frame.columns:
if col not in string_cols:
try:
stack_frame[col] = pd.to_numeric(stack_frame[col], errors='coerce')
except ValueError:
pass # Ignore columns that cannot be converted
stack_frame = stack_frame.sort_values(by='Team Stack', ascending=False)
return qb_frame, rb_frame, wr_frame, flex_frame, stack_frame
@st.cache_resource()
def convert_df_to_csv(df):
return df.to_csv().encode('utf-8')
qb_frame, rb_frame, wr_frame, flex_frame, stack_frame = init_baselines()
tab1, tab2, tab3, tab4, tab5 = st.tabs(['Stacks data', 'QB data', 'RB data', 'WR data', 'Flex data'])
with tab1:
with st.container():
st.dataframe(stack_frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(stacks_format, precision=2), height = 1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(stack_frame),
file_name='NCAAF_Stacks_model_export.csv',
mime='text/csv',
)
with tab2:
with st.container():
st.dataframe(qb_frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(american_format, precision=2), height = 1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(qb_frame),
file_name='NCAAF_QB_model_export.csv',
mime='text/csv',
)
with tab3:
with st.container():
st.dataframe(rb_frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(american_format, precision=2), height = 1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(rb_frame),
file_name='NCAAF_RB_model_export.csv',
mime='text/csv',
)
with tab4:
with st.container():
st.dataframe(wr_frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(american_format, precision=2), height = 1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(wr_frame),
file_name='NCAAF_WR_model_export.csv',
mime='text/csv',
)
with tab5:
with st.container():
st.dataframe(flex_frame.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(american_format, precision=2), height = 1000, use_container_width = True)
st.download_button(
label="Export Tables",
data=convert_df_to_csv(flex_frame),
file_name='NCAAF_Flex_model_export.csv',
mime='text/csv',
) |