James McCool commited on
Commit
92d6486
·
1 Parent(s): 19c2796

Refactor app.py to enhance data handling and user input. Updated seed frame initialization to accept a dynamic lineup limit, improved data export functionality, and streamlined session state management for contest simulations. Removed unnecessary imports and optimized data retrieval processes.

Browse files
Files changed (1) hide show
  1. app.py +70 -32
app.py CHANGED
@@ -2,9 +2,7 @@ import streamlit as st
2
  st.set_page_config(layout="wide")
3
  import numpy as np
4
  import pandas as pd
5
- import gspread
6
  import pymongo
7
- import time
8
 
9
  @st.cache_resource
10
  def init_conn():
@@ -23,10 +21,10 @@ dk_columns = ['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'FLEX', 'G', 'salary', '
23
  fd_columns = ['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
24
 
25
  @st.cache_data(ttl = 600)
26
- def init_DK_seed_frames():
27
 
28
  collection = db["DK_NHL_seed_frame"]
29
- cursor = collection.find()
30
 
31
  raw_display = pd.DataFrame(list(cursor))
32
  raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'FLEX', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
@@ -35,10 +33,10 @@ def init_DK_seed_frames():
35
  return DK_seed
36
 
37
  @st.cache_data(ttl = 599)
38
- def init_FD_seed_frames():
39
 
40
  collection = db["FD_NHL_seed_frame"]
41
- cursor = collection.find()
42
 
43
  raw_display = pd.DataFrame(list(cursor))
44
  raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
@@ -87,11 +85,10 @@ def calculate_FD_value_frequencies(np_array):
87
  return combined_array
88
 
89
  @st.cache_data
90
- def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
91
  SimVar = 1
92
  Sim_Winners = []
93
- fp_array = seed_frame[:sharp_split, :]
94
-
95
  # Pre-vectorize functions
96
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
97
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
@@ -118,9 +115,9 @@ def sim_contest(Sim_size, seed_frame, maps_dict, sharp_split, Contest_Size):
118
 
119
  return Sim_Winners
120
 
121
- DK_seed = init_DK_seed_frames()
122
- FD_seed = init_FD_seed_frames()
123
  dk_raw, fd_raw = init_baselines()
 
 
124
 
125
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
126
  with tab2:
@@ -130,15 +127,17 @@ with tab2:
130
  st.cache_data.clear()
131
  for key in st.session_state.keys():
132
  del st.session_state[key]
133
- DK_seed = init_DK_seed_frames()
134
- FD_seed = init_FD_seed_frames()
135
  dk_raw, fd_raw = init_baselines()
 
 
136
 
137
  slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'))
138
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
 
 
139
  if site_var1 == 'Draftkings':
140
- raw_baselines = dk_raw
141
- column_names = dk_columns
142
 
143
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
144
  if team_var1 == 'Specific Teams':
@@ -153,8 +152,6 @@ with tab2:
153
  stack_var2 = [5, 4, 3, 2, 1, 0]
154
 
155
  elif site_var1 == 'Fanduel':
156
- raw_baselines = fd_raw
157
- column_names = fd_columns
158
 
159
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
160
  if team_var1 == 'Specific Teams':
@@ -170,7 +167,30 @@ with tab2:
170
 
171
 
172
  if st.button("Prepare data export", key='data_export'):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  data_export = st.session_state.working_seed.copy()
 
 
174
  st.download_button(
175
  label="Export optimals set",
176
  data=convert_df(data_export),
@@ -186,7 +206,13 @@ with tab2:
186
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
187
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
188
  elif 'working_seed' not in st.session_state:
189
- st.session_state.working_seed = DK_seed.copy()
 
 
 
 
 
 
190
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
191
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
192
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
@@ -197,7 +223,12 @@ with tab2:
197
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
198
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
199
  elif 'working_seed' not in st.session_state:
200
- st.session_state.working_seed = FD_seed.copy()
 
 
 
 
 
201
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
202
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
203
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
@@ -213,17 +244,14 @@ with tab1:
213
  st.cache_data.clear()
214
  for key in st.session_state.keys():
215
  del st.session_state[key]
216
- DK_seed = init_DK_seed_frames()
217
- FD_seed = init_FD_seed_frames()
218
  dk_raw, fd_raw = init_baselines()
 
 
 
219
  sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
220
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
221
- if sim_site_var1 == 'Draftkings':
222
- raw_baselines = dk_raw
223
- column_names = dk_columns
224
- elif sim_site_var1 == 'Fanduel':
225
- raw_baselines = fd_raw
226
- column_names = fd_columns
227
 
228
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
229
  if contest_var1 == 'Small':
@@ -258,7 +286,7 @@ with tab1:
258
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
259
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
260
  }
261
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
262
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
263
 
264
  #st.table(Sim_Winner_Frame)
@@ -285,10 +313,18 @@ with tab1:
285
 
286
  else:
287
  if sim_site_var1 == 'Draftkings':
288
- st.session_state.working_seed = DK_seed.copy()
 
 
 
 
289
  elif sim_site_var1 == 'Fanduel':
290
- st.session_state.working_seed = FD_seed.copy()
291
- maps_dict = {
 
 
 
 
292
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
293
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
294
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
@@ -296,7 +332,7 @@ with tab1:
296
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
297
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
298
  }
299
- Sim_Winners = sim_contest(1000, st.session_state.working_seed, maps_dict, sharp_split, Contest_Size)
300
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
301
 
302
  #st.table(Sim_Winner_Frame)
@@ -317,6 +353,8 @@ with tab1:
317
 
318
  # Data Copying
319
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
 
 
320
 
321
  # Data Copying
322
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
 
2
  st.set_page_config(layout="wide")
3
  import numpy as np
4
  import pandas as pd
 
5
  import pymongo
 
6
 
7
  @st.cache_resource
8
  def init_conn():
 
21
  fd_columns = ['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
22
 
23
  @st.cache_data(ttl = 600)
24
+ def init_DK_seed_frames(sharp_split):
25
 
26
  collection = db["DK_NHL_seed_frame"]
27
+ cursor = collection.find().limit(sharp_split)
28
 
29
  raw_display = pd.DataFrame(list(cursor))
30
  raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'W3', 'D1', 'D2', 'FLEX', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
33
  return DK_seed
34
 
35
  @st.cache_data(ttl = 599)
36
+ def init_FD_seed_frames(sharp_split):
37
 
38
  collection = db["FD_NHL_seed_frame"]
39
+ cursor = collection.find().limit(sharp_split)
40
 
41
  raw_display = pd.DataFrame(list(cursor))
42
  raw_display = raw_display[['C1', 'C2', 'W1', 'W2', 'D1', 'D2', 'FLEX1', 'FLEX2', 'G', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
 
85
  return combined_array
86
 
87
  @st.cache_data
88
+ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
89
  SimVar = 1
90
  Sim_Winners = []
91
+ fp_array = seed_frame.copy()
 
92
  # Pre-vectorize functions
93
  vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
94
  vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
 
115
 
116
  return Sim_Winners
117
 
 
 
118
  dk_raw, fd_raw = init_baselines()
119
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
120
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
121
 
122
  tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
123
  with tab2:
 
127
  st.cache_data.clear()
128
  for key in st.session_state.keys():
129
  del st.session_state[key]
130
+ DK_seed = init_DK_seed_frames(10000)
131
+ FD_seed = init_FD_seed_frames(10000)
132
  dk_raw, fd_raw = init_baselines()
133
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
134
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
135
 
136
  slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'))
137
  site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
138
+ sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
139
+
140
  if site_var1 == 'Draftkings':
 
 
141
 
142
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
143
  if team_var1 == 'Specific Teams':
 
152
  stack_var2 = [5, 4, 3, 2, 1, 0]
153
 
154
  elif site_var1 == 'Fanduel':
 
 
155
 
156
  team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
157
  if team_var1 == 'Specific Teams':
 
167
 
168
 
169
  if st.button("Prepare data export", key='data_export'):
170
+ if 'working_seed' in st.session_state:
171
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
172
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
173
+ elif 'working_seed' not in st.session_state:
174
+ if site_var1 == 'Draftkings':
175
+ if slate_var1 == 'Main Slate':
176
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
177
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_id))
178
+
179
+ raw_baselines = dk_raw
180
+ column_names = dk_columns
181
+
182
+ elif site_var1 == 'Fanduel':
183
+ if slate_var1 == 'Main Slate':
184
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
185
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_id))
186
+
187
+ raw_baselines = fd_raw
188
+ column_names = fd_columns
189
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
190
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
191
  data_export = st.session_state.working_seed.copy()
192
+ for col in range(9):
193
+ data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])
194
  st.download_button(
195
  label="Export optimals set",
196
  data=convert_df(data_export),
 
206
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
207
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
208
  elif 'working_seed' not in st.session_state:
209
+ if slate_var1 == 'Main Slate':
210
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
211
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_id))
212
+
213
+ raw_baselines = dk_raw
214
+ column_names = dk_columns
215
+
216
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
217
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
218
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
223
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
224
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
225
  elif 'working_seed' not in st.session_state:
226
+ if slate_var1 == 'Main Slate':
227
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
228
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_id))
229
+
230
+ raw_baselines = fd_raw
231
+ column_names = fd_columns
232
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
233
  st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
234
  st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
244
  st.cache_data.clear()
245
  for key in st.session_state.keys():
246
  del st.session_state[key]
247
+ DK_seed = init_DK_seed_frames(10000)
248
+ FD_seed = init_FD_seed_frames(10000)
249
  dk_raw, fd_raw = init_baselines()
250
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_id))
251
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_id))
252
+
253
  sim_slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Other Main Slate'), key='sim_slate_var1')
254
  sim_site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var1')
 
 
 
 
 
 
255
 
256
  contest_var1 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large', 'Custom'))
257
  if contest_var1 == 'Small':
 
286
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
287
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
288
  }
289
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)
290
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
291
 
292
  #st.table(Sim_Winner_Frame)
 
313
 
314
  else:
315
  if sim_site_var1 == 'Draftkings':
316
+ if sim_slate_var1 == 'Main Slate':
317
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split)
318
+
319
+ raw_baselines = dk_raw
320
+ column_names = dk_columns
321
  elif sim_site_var1 == 'Fanduel':
322
+ if sim_slate_var1 == 'Main Slate':
323
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split)
324
+
325
+ raw_baselines = fd_raw
326
+ column_names = fd_columns
327
+ st.session_state.maps_dict = {
328
  'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
329
  'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
330
  'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
 
332
  'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
333
  'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev))
334
  }
335
+ Sim_Winners = sim_contest(1000, st.session_state.working_seed, st.session_state.maps_dict, Contest_Size)
336
  Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
337
 
338
  #st.table(Sim_Winner_Frame)
 
353
 
354
  # Data Copying
355
  st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
356
+ for col in st.session_state.Sim_Winner_Export.iloc[:, 0:9].columns:
357
+ st.session_state.Sim_Winner_Export[col] = st.session_state.Sim_Winner_Export[col].map(dk_id_dict)
358
 
359
  # Data Copying
360
  st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()