Tribe_NCAAF / app.py
Multichem's picture
Update app.py
b855174 verified
raw
history blame
9.95 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": "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%}'}
mma_format = {'ML_perc': '{:.2%}', 'Min_%': '{:.2%}', 'Med_%': '{:.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)
return qb_frame, rb_frame, wr_frame, flex_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 = init_baselines()
tab1, tab2, tab3, tab4 = st.tabs(['QB data', 'RB data', 'WR data', 'Flex data'])
with tab1:
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 tab2:
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 tab3:
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 tab4:
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',
)