File size: 8,530 Bytes
1878852 aa8c500 1878852 aa8c500 1878852 aa8c500 1878852 5a091d7 7e210ab aa8c500 9226fa7 5a091d7 aa8c500 1c80a22 9226fa7 48bfcaa aa8c500 7e210ab 5a091d7 1878852 aa8c500 1878852 aa8c500 1878852 aa8c500 908952d dd00607 908952d aa8c500 dd00607 aa8c500 dd00607 aa8c500 |
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 |
import streamlit as st
st.set_page_config(layout="wide")
for name in dir():
if not name.startswith('_'):
del globals()[name]
import numpy as np
import pandas as pd
import streamlit as st
import gspread
import plotly.express as px
import random
import gc
@st.cache_resource
def init_conn():
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
credentials = {
"type": "service_account",
"project_id": "dfsnew",
"private_key_id": "2432f6c3771f70a410c5c878d1359869fc9dddc8",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDBNBDU2aJuEr6n\ne0o7pDY8gjg1+g1e3oHlpyY/CHMByZuEwfXewsZYP/TApfr8zxXDNG9X31CloWXH\n6ef8H0h6TjhRppE/2YCUZlbgtvpwlDg+1aKTKY5Lc/L937I6V512mgMDhDmTwX+p\noV0vhPuJnyFy+Fuo+xu8D9A46lhTTIK4EZhHc04SUBxUI3pDdfvuMbjciD/Pskn2\nMwBSEG/FQoe4GYrSmm7jzYdSHItVBakr26xl117m8BrIuceU7IEWrnJGDza8TtTZ\n+4Wp7PY9v6DgVt2+rnnDaF/g7kocLqoj2xWp1eS7OALwmqaIPFljIUkL5AJJiLC1\n+/ve6iwVAgMBAAECggEADTFsPdCvwBL9HGw1nT2BK6AbzQnKfHI2zhMcMD04N0TI\nXygsjT3hM/kIElizOyy7+HS97rLz65+KFvzwx71uIlXxkBfO/txwJJIZeCZeky33\n6kiF3cU+b4YXL4FlRwkhGk55irWuhdm2iUOY3KwYziTE8LgncDJXij/NMPnFtshZ\n/2Dc/7sKLi1tna5tfXr5v4N7LhyFOfHme8ZSZIhnpV+WnFM/VAVghwi+3vfzeV+a\nVgvv+QwRUBF+MYpoW8aDw3Y1jKuKKxcG0qHR1mQQTDK6eAymy28lJ9LfgKkZBLS3\nVEGH8O+gLQj2l8VR8koRxA1FETJ9BnIiV4OF+uLQQQKBgQDyYkeBnpPKnw3MXKgy\nxtpt7hLdrrQiR69PHEvHj9z6b60KTH9jDMKcbCU/ouwbTtLQnvtwta2RoWD/1xk+\n3uaeQv/jOtgKGE+Sa0FvJuDWZwBfUORnyqb+s5G9MpVlqNLLkUmE5myyrDbFdxei\nwzisIjvQxtJDLB3pucTRyd6a1QKBgQDMDoWUfNpQI/up3r0RWVCl3odpwOMnpN0S\nhf8uLyvEvtbcMnpxCQCl+4KWnOiX4GH4N9sZGF8YTPazO2Kd85/GioUoNo5u6vJo\ncxD0BTvg5meyUjfZsmuU620/eVQBa88TRdo3isLmBqUp7SAC+g4vTHpgxn00dRYv\neSfZN0dsQQKBgQDkxR34mVOkyrqbSFj4k/dWCn6D/YDHWiF86ZgcowxO01jff5Q8\nSK7mNKxzg7KVk7Amd+eaWd+YtFh5IOwTCw9gEJy0O7Xs0UVJTTJVVryfoFgZnp/1\n1rAHdjT3/eZELTPILzjU1yeA/Eo11lHYramvzh/mzcFm5RzWnR/HYmFYgQKBgFOy\nbSX/pAgVCkedvc0c5lBymvZMkJ+VJrxPS+Ckpn43jKea6M/uUl7Cb8jZKSoKdgS6\n3FpJvc+Y2eOgKw4AfHuSG5Xn8roaEj23XK/KacoQl130DUZ0wV2+xvuvBz7h+ni8\nQQphFxoEhcBRq7ys1h6ebt+86mQW1ne4aRjWbKxBAoGARA+rBNIC9Z1vyRzMAXfj\nnQ9/wShd/NGpVRNrm7sdUastfoyK8Ip3HkJac3xE1ARpQTvxAz742mdeDxPWI8wZ\nHDsjIrRqGLKMN7tSIoM720y6PY/Tsg89SdY4y0h6M75rrEi4Lv5b7s4EmqAZdfKT\nbEyuT7sCPCLeOX/RLy/lCpA=\n-----END PRIVATE KEY-----\n",
"client_email": "[email protected]",
"client_id": "105107448378741046480",
"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/dfsapps%40dfsnew.iam.gserviceaccount.com",
"universe_domain": "googleapis.com"
}
header= {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) '
'AppleWebKit/537.11 (KHTML, like Gecko) '
'Chrome/23.0.1271.64 Safari/537.11',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Accept-Encoding': 'none',
'Accept-Language': 'en-US,en;q=0.8',
'Connection': 'keep-alive'}
gc_con = gspread.service_account_from_dict(credentials, scope)
return gc_con
gcservice_account = init_conn()
NBAGetGameData = 'https://docs.google.com/spreadsheets/d/1tRQrF_I5rS7Q0g9vE8NrENDZ2P3_DvtbBZzKEakwOI0/edit#gid=1373653837'
NCAAMensBasketball = 'https://docs.google.com/spreadsheets/d/1flWwlx1T7Xu68AjOkeq7u4Y7nWzukZzKTEI17RJ6MfE/edit#gid=1975368022'
NBABettingModel = 'https://docs.google.com/spreadsheets/d/1WBnvOHQi_zVTGF63efejK5ho02AY00HiYrMHnMJXY1E/edit#gid=1157978351'
game_format = {'Injury and Rotation Adjusted Win %': '{:.2%}'}
percentages_format = {'Playoff Odds': '{:.2%}', 'Division Odds': '{:.2%}', 'Top 4 Seed Odds': '{:.2%}', '1 Seed Odds': '{:.2%}', 'Win 1st Round': '{:.2%}',
'Win 2nd Round': '{:.2%}', 'Win Conference': '{:.2%}', 'Win Title': '{:.2%}', '1': '{:.2%}', '2': '{:.2%}', '3': '{:.2%}',
'4': '{:.2%}', '5': '{:.2%}', '6': '{:.2%}', '7': '{:.2%}', '8': '{:.2%}', '9': '{:.2%}', '10': '{:.2%}', '11': '{:.2%}',
'12': '{:.2%}', '13': '{:.2%}', '14': '{:.2%}', '15': '{:.2%}'}
@st.cache_resource(ttl = 300)
def init_baselines():
sh = gcservice_account.open_by_url(NCAAMensBasketball)
worksheet = sh.worksheet('ActiveBets')
raw_display = pd.DataFrame(worksheet.get_values())
raw_display.columns = raw_display.iloc[0]
raw_display = raw_display[1:]
raw_display = raw_display.reset_index(drop=True)
raw_display.replace('', np.nan, inplace=True)
raw_display['Edge for Moneyline'] = np.where(raw_display['Home Win Edge'] > raw_display['Road Win Edge'], raw_display['Home Win Edge'], raw_display['Road Win Edge'])
game_model = raw_display[['date', 'gameid', 'HomeTeam', 'HomeDiv', 'HomeConf', 'AwayTeam', 'AwayDiv', 'AwayConf',
'total', 'mlHome', 'mlAway', 'spreadHome', 'spreadAway', 'booksid', 'inconf', 'Neutral', 'Home Team PM',
'Road Team PM', 'HCA', 'Home Team Margin', 'Home Team Win', 'Home ML Break Even %',
'Road ML Break Even %', 'Home Win Edge', 'Road Win Edge', 'Moneyline Bet Rec', 'Edge for Moneyline', 'Home Spread Edge',
'Road Team Edge', 'Home Spread HKelly', 'Away Spread HKelly', 'Spread Bet Rec', 'Edge for Spread']]
data_cols = ['gameid', 'total', 'mlHome', 'mlAway', 'spreadHome', 'spreadAway', 'Neutral', 'Home Team PM',
'Road Team PM', 'HCA', 'Home Team Margin', 'Home Team Win', 'Home ML Break Even %',
'Road ML Break Even %', 'Home Win Edge', 'Road Win Edge', 'Edge for Moneyline', 'Home Spread Edge',
'Road Team Edge', 'Home Spread HKelly', 'Away Spread HKelly', 'Edge for Spread']
game_model[data_cols] = game_model[data_cols].apply(pd.to_numeric, errors='coerce')
game_model = game_model[game_model['date'] != ""]
just_win_probs = game_model[['date', 'HomeTeam', 'AwayTeam', 'booksid', 'total', 'mlHome', 'mlAway', 'spreadHome', 'spreadAway',
'Moneyline Bet Rec', 'Edge for Moneyline', 'Spread Bet Rec', 'Edge for Spread']]
timestamp = raw_display['Time'].head(1)[0]
return game_model, just_win_probs, timestamp
def convert_df_to_csv(df):
return df.to_csv().encode('utf-8')
game_model, just_win_probs, timestamp = init_baselines()
t_stamp = f"Last Update: " + str(timestamp) + f" EST"
st.info(t_stamp)
col1, col2 = st.columns([1, 9])
with col1:
if st.button("Reset Data", key='reset1'):
st.cache_data.clear()
game_model, just_win_probs, timestamp = init_baselines()
t_stamp = f"Last Update: " + str(timestamp) + f" EST"
view_var1 = st.radio("Would you like to view math and stuff or just the win percentages and margins?", ('Just win probs', 'Gimme details'), key='view_var1')
view_var2 = st.radio("Would you like to view all books or specific ones?", ('All Books', 'Specific Books'), key='view_var2')
if view_var2 == 'All Books':
site_view = game_model.booksid.unique()
elif view_var2 == 'Specific Books':
site_view = st.multiselect("What books would you like included?", options = game_model.booksid.unique(), key='site_view')
with col2:
if view_var1 == 'Just win probs':
game_display = just_win_probs[just_win_probs['booksid'].isin(site_view)]
st.dataframe(game_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
st.download_button(
label="Export Game Model",
data=convert_df_to_csv(game_model),
file_name='AmericanNumbers_Game_Model_export.csv',
mime='text/csv',
)
elif view_var1 == 'Gimme details':
game_display = game_model[game_model['booksid'].isin(site_view)]
st.dataframe(game_display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
st.download_button(
label="Export Game Model",
data=convert_df_to_csv(game_model),
file_name='AmericanNumbers_NCAA_BBall_export.csv',
mime='text/csv',
) |