James McCool commited on
Commit
fad8a64
·
1 Parent(s): a5f7ce7

Refactor app.py to integrate MongoDB for data storage and retrieval, replacing Google Sheets API calls. Added caching for connection initialization and improved tab styling in Streamlit.

Browse files
Files changed (1) hide show
  1. app.py +98 -60
app.py CHANGED
@@ -3,26 +3,37 @@ import pandas as pd
3
  import streamlit as st
4
  import gspread
5
  import plotly.figure_factory as ff
 
6
 
7
- scope = ['https://www.googleapis.com/auth/spreadsheets',
8
- "https://www.googleapis.com/auth/drive"]
9
 
10
- credentials = {
11
- "type": "service_account",
12
- "project_id": "sheets-api-connect-378620",
13
- "private_key_id": "1005124050c80d085e2c5b344345715978dd9cc9",
14
- "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",
15
- "client_email": "gspread-connection@sheets-api-connect-378620.iam.gserviceaccount.com",
16
- "client_id": "106625872877651920064",
17
- "auth_uri": "https://accounts.google.com/o/oauth2/auth",
18
- "token_uri": "https://oauth2.googleapis.com/token",
19
- "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
20
- "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40sheets-api-connect-378620.iam.gserviceaccount.com"
21
- }
22
 
23
- gc = gspread.service_account_from_dict(credentials)
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- st.set_page_config(layout="wide")
 
 
 
 
 
 
 
 
26
 
27
  game_format = {'Win Percentage': '{:.2%}','Cover Spread Percentage': '{:.2%}', 'First Inning Lead Percentage': '{:.2%}',
28
  'Fifth Inning Lead Percentage': '{:.2%}'}
@@ -30,52 +41,79 @@ american_format = {'First Inning Lead Percentage': '{:.2%}', 'Fifth Inning Lead
30
 
31
  master_hold = 'https://docs.google.com/spreadsheets/d/1f42Ergav8K1VsOLOK9MUn7DM_MLMvv4GR2Fy7EfnZTc/edit#gid=340831852'
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  @st.cache_resource(ttl = 300)
34
  def init_baselines():
35
- sh = gc.open_by_url(master_hold)
36
- worksheet = sh.worksheet('Pitcher_Stats')
37
- props_frame_hold = pd.DataFrame(worksheet.get_all_records())
38
- props_frame_hold.rename(columns={"Names": "Player"}, inplace = True)
39
- props_frame_hold = props_frame_hold[['Player', 'Team', 'BB', 'Hits', 'HRs', 'ERs', 'Ks', 'Outs', 'Fantasy', 'FD_Fantasy', 'PrizePicks']]
40
- pitcher_stats = props_frame_hold.drop_duplicates(subset='Player')
41
-
42
- worksheet = sh.worksheet('Timestamp')
43
- raw_stamp = worksheet.acell('a1').value
44
-
45
- t_stamp = f"Last update was at {raw_stamp}"
46
-
47
- worksheet = sh.worksheet('Hitter_Stats')
48
- props_frame_hold = pd.DataFrame(worksheet.get_all_records())
49
- props_frame_hold.rename(columns={"Names": "Player"}, inplace = True)
50
- props_frame_hold = props_frame_hold[['Player', 'Team', 'Walks', 'Steals', 'Hits', 'Singles', 'Doubles', 'HRs', 'RBIs', 'Runs', 'Fantasy', 'FD_Fantasy', 'PrizePicks']]
51
- props_frame_hold['Total Bases'] = props_frame_hold['Singles'] + (props_frame_hold['Doubles'] * 2) + (props_frame_hold['HRs'] * 4)
52
- props_frame_hold['Hits + Runs + RBIs'] = props_frame_hold['Hits'] + props_frame_hold['Runs'] + props_frame_hold['RBIs']
53
- hitter_stats = props_frame_hold.drop_duplicates(subset='Player')
54
-
55
- worksheet = sh.worksheet('Game_Betting_Model')
56
- team_frame = pd.DataFrame(worksheet.get_all_records())
57
- team_frame = team_frame.drop_duplicates(subset='Names')
58
- team_frame['Win Percentage'] = team_frame['Win Percentage'].str.replace('%', '').astype('float')/100
59
- team_frame['Cover Spread Percentage'] = team_frame['Cover Spread Percentage'].str.replace('%', '').astype('float')/100
60
- team_frame['ML_Value'] = team_frame['ML_Value'].str.replace('%', '').astype('float')/100
61
- team_frame['Spread_Value'] = team_frame['Spread_Value'].str.replace('%', '').astype('float')/100
62
-
63
- worksheet = sh.worksheet('prop_frame')
64
- raw_display = pd.DataFrame(worksheet.get_all_records())
65
- raw_display.replace('', np.nan, inplace=True)
66
- prop_frame = raw_display.dropna(subset='Team')
67
-
68
- worksheet = sh.worksheet('Prop_results')
69
- raw_display = pd.DataFrame(worksheet.get_all_records())
70
- raw_display.replace('', np.nan, inplace=True)
71
- betsheet_frame = raw_display.dropna(subset='proj')
72
-
73
- worksheet = sh.worksheet('Pick6_ingest')
74
- raw_display = pd.DataFrame(worksheet.get_all_records())
75
- raw_display.replace('', np.nan, inplace=True)
76
- pick_frame = raw_display.dropna(subset='Player')
77
-
78
- return pitcher_stats, hitter_stats, team_frame, prop_frame, betsheet_frame, pick_frame, t_stamp
79
 
80
  pitcher_stats, hitter_stats, team_frame, prop_frame, betsheet_frame, pick_frame, t_stamp = init_baselines()
81
 
 
3
  import streamlit as st
4
  import gspread
5
  import plotly.figure_factory as ff
6
+ import pymongo
7
 
8
+ st.set_page_config(layout="wide")
 
9
 
10
+ @st.cache_resource
11
+ def init_conn():
12
+ scope = ['https://www.googleapis.com/auth/spreadsheets',
13
+ "https://www.googleapis.com/auth/drive"]
 
 
 
 
 
 
 
 
14
 
15
+ credentials = {
16
+ "type": "service_account",
17
+ "project_id": "sheets-api-connect-378620",
18
+ "private_key_id": "1005124050c80d085e2c5b344345715978dd9cc9",
19
+ "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",
20
+ "client_email": "gspread-connection@sheets-api-connect-378620.iam.gserviceaccount.com",
21
+ "client_id": "106625872877651920064",
22
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
23
+ "token_uri": "https://oauth2.googleapis.com/token",
24
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
25
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40sheets-api-connect-378620.iam.gserviceaccount.com"
26
+ }
27
 
28
+ uri = st.secrets['mongo_uri']
29
+ client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000)
30
+ db = client["NHL_Database"]
31
+
32
+ gc = gspread.service_account_from_dict(credentials)
33
+
34
+ return db, gc
35
+
36
+ db, gc = init_conn()
37
 
38
  game_format = {'Win Percentage': '{:.2%}','Cover Spread Percentage': '{:.2%}', 'First Inning Lead Percentage': '{:.2%}',
39
  'Fifth Inning Lead Percentage': '{:.2%}'}
 
41
 
42
  master_hold = 'https://docs.google.com/spreadsheets/d/1f42Ergav8K1VsOLOK9MUn7DM_MLMvv4GR2Fy7EfnZTc/edit#gid=340831852'
43
 
44
+ st.markdown("""
45
+ <style>
46
+ /* Tab styling */
47
+ .stTabs [data-baseweb="tab-list"] {
48
+ gap: 8px;
49
+ padding: 4px;
50
+ }
51
+ .stTabs [data-baseweb="tab"] {
52
+ height: 50px;
53
+ white-space: pre-wrap;
54
+ background-color: #DAA520;
55
+ color: white;
56
+ border-radius: 10px;
57
+ gap: 1px;
58
+ padding: 10px 20px;
59
+ font-weight: bold;
60
+ transition: all 0.3s ease;
61
+ }
62
+ .stTabs [aria-selected="true"] {
63
+ background-color: #DAA520;
64
+ border: 3px solid #FFD700;
65
+ color: white;
66
+ }
67
+ .stTabs [data-baseweb="tab"]:hover {
68
+ background-color: #FFD700;
69
+ cursor: pointer;
70
+ }
71
+ </style>""", unsafe_allow_html=True)
72
+
73
  @st.cache_resource(ttl = 300)
74
  def init_baselines():
75
+ collection = db["Pitcher_Stats"]
76
+ cursor = collection.find()
77
+ raw_display = pd.DataFrame(cursor)
78
+ props_frame_hold.rename(columns={"Names": "Player"}, inplace = True)
79
+ props_frame_hold = props_frame_hold[['Player', 'Team', 'BB', 'Hits', 'HRs', 'ERs', 'Ks', 'Outs', 'Fantasy', 'FD_Fantasy', 'PrizePicks']]
80
+ pitcher_stats = props_frame_hold.drop_duplicates(subset='Player')
81
+
82
+ collection = db['Hitter_Stats']
83
+ cursor = collection.find()
84
+ raw_display = pd.DataFrame(cursor)
85
+ props_frame_hold.rename(columns={"Names": "Player"}, inplace = True)
86
+ props_frame_hold = props_frame_hold[['Player', 'Team', 'Walks', 'Steals', 'Hits', 'Singles', 'Doubles', 'HRs', 'RBIs', 'Runs', 'Fantasy', 'FD_Fantasy', 'PrizePicks']]
87
+ props_frame_hold['Total Bases'] = props_frame_hold['Singles'] + (props_frame_hold['Doubles'] * 2) + (props_frame_hold['HRs'] * 4)
88
+ props_frame_hold['Hits + Runs + RBIs'] = props_frame_hold['Hits'] + props_frame_hold['Runs'] + props_frame_hold['RBIs']
89
+ hitter_stats = props_frame_hold.drop_duplicates(subset='Player')
90
+
91
+ collection = db['Game_Betting_Model']
92
+ cursor = collection.find()
93
+ raw_display = pd.DataFrame(cursor)
94
+ team_frame = raw_display.drop_duplicates(subset='Names')
95
+ team_frame['Win Percentage'] = team_frame['Win Percentage'].str.replace('%', '').astype('float')/100
96
+ team_frame['Cover Spread Percentage'] = team_frame['Cover Spread Percentage'].str.replace('%', '').astype('float')/100
97
+ team_frame['ML_Value'] = team_frame['ML_Value'].str.replace('%', '').astype('float')/100
98
+ team_frame['Spread_Value'] = team_frame['Spread_Value'].str.replace('%', '').astype('float')/100
99
+
100
+ sh = gc.open_by_url(master_hold)
101
+ worksheet = sh.worksheet('prop_frame')
102
+ raw_display = pd.DataFrame(worksheet.get_all_records())
103
+ raw_display.replace('', np.nan, inplace=True)
104
+ prop_frame = raw_display.dropna(subset='Team')
105
+
106
+ worksheet = sh.worksheet('Prop_results')
107
+ raw_display = pd.DataFrame(worksheet.get_all_records())
108
+ raw_display.replace('', np.nan, inplace=True)
109
+ betsheet_frame = raw_display.dropna(subset='proj')
110
+
111
+ worksheet = sh.worksheet('Pick6_ingest')
112
+ raw_display = pd.DataFrame(worksheet.get_all_records())
113
+ raw_display.replace('', np.nan, inplace=True)
114
+ pick_frame = raw_display.dropna(subset='Player')
115
+
116
+ return pitcher_stats, hitter_stats, team_frame, prop_frame, betsheet_frame, pick_frame, t_stamp
 
 
117
 
118
  pitcher_stats, hitter_stats, team_frame, prop_frame, betsheet_frame, pick_frame, t_stamp = init_baselines()
119