James McCool commited on
Commit
b5c6df7
·
1 Parent(s): 8015573

segmented controllers rather than tabs

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +185 -140
src/streamlit_app.py CHANGED
@@ -25,6 +25,42 @@ freq_format = {'Exposure': '{:.2%}', 'Proj Own': '{:.2%}', 'Edge': '{:.2%}'}
25
  dk_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
26
  fd_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  @st.cache_data(ttl = 600)
29
  def init_DK_seed_frames(sharp_split):
30
 
@@ -183,146 +219,17 @@ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
183
 
184
  return Sim_Winners
185
 
186
- tab1, tab2 = st.tabs(['Contest Sims', 'Data Export'])
187
- with tab2:
188
- col1, col2 = st.columns([1, 7])
189
- with col1:
190
- if st.button("Load/Reset Data", key='reset1'):
191
- st.cache_data.clear()
192
- for key in st.session_state.keys():
193
- del st.session_state[key]
194
- DK_seed = init_DK_seed_frames(10000)
195
- FD_seed = init_FD_seed_frames(10000)
196
- dk_raw, fd_raw = init_baselines('Main Slate')
197
- dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
198
- fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
199
-
200
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'))
201
- site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
202
- sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
203
-
204
- if site_var1 == 'Draftkings':
205
 
206
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
207
- if team_var1 == 'Specific Teams':
208
- dk_raw, fd_raw = init_baselines('Main Slate')
209
- team_var2 = st.multiselect('Which teams do you want?', options = dk_raw['Team'].unique())
210
- elif team_var1 == 'Full Slate':
211
- dk_raw, fd_raw = init_baselines('Main Slate')
212
- team_var2 = dk_raw.Team.values.tolist()
213
-
214
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
215
- if stack_var1 == 'Specific Stack Sizes':
216
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
217
- elif stack_var1 == 'Full Slate':
218
- stack_var2 = [5, 4, 3, 2, 1, 0]
219
-
220
- elif site_var1 == 'Fanduel':
221
-
222
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
223
- if team_var1 == 'Specific Teams':
224
- dk_raw, fd_raw = init_baselines('Main Slate')
225
- team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique())
226
- elif team_var1 == 'Full Slate':
227
- dk_raw, fd_raw = init_baselines('Main Slate')
228
- team_var2 = fd_raw.Team.values.tolist()
229
-
230
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
231
- if stack_var1 == 'Specific Stack Sizes':
232
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
233
- elif stack_var1 == 'Full Slate':
234
- stack_var2 = [5, 4, 3, 2, 1, 0]
235
-
236
-
237
- if st.button("Prepare data export", key='data_export'):
238
- if 'working_seed' in st.session_state:
239
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
240
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
241
- elif 'working_seed' not in st.session_state:
242
- if site_var1 == 'Draftkings':
243
- if slate_var1 == 'Main Slate':
244
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
245
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
246
- elif slate_var1 == 'Secondary Slate':
247
- st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
248
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
249
-
250
- raw_baselines = dk_raw
251
- column_names = dk_columns
252
-
253
- elif site_var1 == 'Fanduel':
254
- if slate_var1 == 'Main Slate':
255
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
256
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
257
- elif slate_var1 == 'Secondary Slate':
258
- st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
259
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
260
-
261
- raw_baselines = fd_raw
262
- column_names = fd_columns
263
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
264
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
265
- data_export = st.session_state.working_seed.copy()
266
- for col in range(9):
267
- data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])
268
- st.download_button(
269
- label="Export optimals set",
270
- data=convert_df(data_export),
271
- file_name='NFL_optimals_export.csv',
272
- mime='text/csv',
273
- )
274
-
275
- with col2:
276
- if st.button("Load Data", key='load_data'):
277
- if site_var1 == 'Draftkings':
278
- if 'working_seed' in st.session_state:
279
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
280
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
281
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
282
- elif 'working_seed' not in st.session_state:
283
- if slate_var1 == 'Main Slate':
284
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
285
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
286
- dk_raw, fd_raw = init_baselines('Main Slate')
287
-
288
- elif slate_var1 == 'Secondary Slate':
289
- st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
290
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
291
- dk_raw, fd_raw = init_baselines('Secondary Slate')
292
-
293
- raw_baselines = dk_raw
294
- column_names = dk_columns
295
-
296
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
297
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
298
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
299
-
300
- elif site_var1 == 'Fanduel':
301
- if 'working_seed' in st.session_state:
302
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
303
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
304
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
305
- elif 'working_seed' not in st.session_state:
306
- if slate_var1 == 'Main Slate':
307
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
308
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
309
- dk_raw, fd_raw = init_baselines('Main Slate')
310
- elif slate_var1 == 'Secondary Slate':
311
- st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
312
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
313
- dk_raw, fd_raw = init_baselines('Secondary Slate')
314
-
315
- raw_baselines = fd_raw
316
- column_names = fd_columns
317
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
318
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
319
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
320
-
321
- with st.container():
322
- if 'data_export_display' in st.session_state:
323
- st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True)
324
-
325
- with tab1:
326
  col1, col2 = st.columns([1, 7])
327
  with col1:
328
  if st.button("Load/Reset Data", key='reset2'):
@@ -799,4 +706,142 @@ with tab1:
799
  file_name='team_freq.csv',
800
  mime='text/csv',
801
  key='team'
802
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  dk_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
26
  fd_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']
27
 
28
+ st.markdown("""
29
+ <style>
30
+ /* Tab styling */
31
+ .stElementContainer [data-baseweb="button-group"] {
32
+ gap: 8px;
33
+ padding: 4px;
34
+ }
35
+ .stElementContainer [kind="segmented_control"] {
36
+ height: 45px;
37
+ white-space: pre-wrap;
38
+ background-color: #DAA520;
39
+ color: white;
40
+ border-radius: 10px;
41
+ gap: 1px;
42
+ padding: 10px 20px;
43
+ font-weight: bold;
44
+ transition: all 0.3s ease;
45
+ }
46
+ .stElementContainer [kind="segmented_controlActive"] {
47
+ height: 50px;
48
+ background-color: #DAA520;
49
+ border: 3px solid #FFD700;
50
+ color: white;
51
+ }
52
+ .stElementContainer [kind="segmented_control"]:hover {
53
+ background-color: #FFD700;
54
+ cursor: pointer;
55
+ }
56
+
57
+ div[data-baseweb="select"] > div {
58
+ background-color: #DAA520;
59
+ color: white;
60
+ }
61
+
62
+ </style>""", unsafe_allow_html=True)
63
+
64
  @st.cache_data(ttl = 600)
65
  def init_DK_seed_frames(sharp_split):
66
 
 
219
 
220
  return Sim_Winners
221
 
222
+ selected_tab = st.segmented_control(
223
+ "Select Tab",
224
+ options=["Contest Sims", "Data Export"],
225
+ selection_mode='single',
226
+ default='Contest Sims',
227
+ width='stretch',
228
+ label_visibility='collapsed',
229
+ key='tab_selector'
230
+ )
 
 
 
 
 
 
 
 
 
 
231
 
232
+ if selected_tab == "Contest Sims":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  col1, col2 = st.columns([1, 7])
234
  with col1:
235
  if st.button("Load/Reset Data", key='reset2'):
 
706
  file_name='team_freq.csv',
707
  mime='text/csv',
708
  key='team'
709
+ )
710
+
711
+ if selected_tab == "Data Export":
712
+ col1, col2 = st.columns([1, 7])
713
+ with col1:
714
+ if st.button("Load/Reset Data", key='reset1'):
715
+ st.cache_data.clear()
716
+ for key in st.session_state.keys():
717
+ del st.session_state[key]
718
+ DK_seed = init_DK_seed_frames(10000)
719
+ FD_seed = init_FD_seed_frames(10000)
720
+ dk_raw, fd_raw = init_baselines('Main Slate')
721
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
722
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
723
+
724
+ slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'))
725
+ site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
726
+ sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
727
+
728
+ if site_var1 == 'Draftkings':
729
+
730
+ team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
731
+ if team_var1 == 'Specific Teams':
732
+ dk_raw, fd_raw = init_baselines('Main Slate')
733
+ team_var2 = st.multiselect('Which teams do you want?', options = dk_raw['Team'].unique())
734
+ elif team_var1 == 'Full Slate':
735
+ dk_raw, fd_raw = init_baselines('Main Slate')
736
+ team_var2 = dk_raw.Team.values.tolist()
737
+
738
+ stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
739
+ if stack_var1 == 'Specific Stack Sizes':
740
+ stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
741
+ elif stack_var1 == 'Full Slate':
742
+ stack_var2 = [5, 4, 3, 2, 1, 0]
743
+
744
+ elif site_var1 == 'Fanduel':
745
+
746
+ team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
747
+ if team_var1 == 'Specific Teams':
748
+ dk_raw, fd_raw = init_baselines('Main Slate')
749
+ team_var2 = st.multiselect('Which teams do you want?', options = fd_raw['Team'].unique())
750
+ elif team_var1 == 'Full Slate':
751
+ dk_raw, fd_raw = init_baselines('Main Slate')
752
+ team_var2 = fd_raw.Team.values.tolist()
753
+
754
+ stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
755
+ if stack_var1 == 'Specific Stack Sizes':
756
+ stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
757
+ elif stack_var1 == 'Full Slate':
758
+ stack_var2 = [5, 4, 3, 2, 1, 0]
759
+
760
+
761
+ if st.button("Prepare data export", key='data_export'):
762
+ if 'working_seed' in st.session_state:
763
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
764
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
765
+ elif 'working_seed' not in st.session_state:
766
+ if site_var1 == 'Draftkings':
767
+ if slate_var1 == 'Main Slate':
768
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
769
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
770
+ elif slate_var1 == 'Secondary Slate':
771
+ st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
772
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
773
+
774
+ raw_baselines = dk_raw
775
+ column_names = dk_columns
776
+
777
+ elif site_var1 == 'Fanduel':
778
+ if slate_var1 == 'Main Slate':
779
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
780
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
781
+ elif slate_var1 == 'Secondary Slate':
782
+ st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
783
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
784
+
785
+ raw_baselines = fd_raw
786
+ column_names = fd_columns
787
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
788
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
789
+ data_export = st.session_state.working_seed.copy()
790
+ for col in range(9):
791
+ data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])
792
+ st.download_button(
793
+ label="Export optimals set",
794
+ data=convert_df(data_export),
795
+ file_name='NFL_optimals_export.csv',
796
+ mime='text/csv',
797
+ )
798
+
799
+ with col2:
800
+ if st.button("Load Data", key='load_data'):
801
+ if site_var1 == 'Draftkings':
802
+ if 'working_seed' in st.session_state:
803
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
804
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
805
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
806
+ elif 'working_seed' not in st.session_state:
807
+ if slate_var1 == 'Main Slate':
808
+ st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
809
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
810
+ dk_raw, fd_raw = init_baselines('Main Slate')
811
+
812
+ elif slate_var1 == 'Secondary Slate':
813
+ st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
814
+ dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
815
+ dk_raw, fd_raw = init_baselines('Secondary Slate')
816
+
817
+ raw_baselines = dk_raw
818
+ column_names = dk_columns
819
+
820
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
821
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
822
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
823
+
824
+ elif site_var1 == 'Fanduel':
825
+ if 'working_seed' in st.session_state:
826
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
827
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
828
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
829
+ elif 'working_seed' not in st.session_state:
830
+ if slate_var1 == 'Main Slate':
831
+ st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
832
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
833
+ dk_raw, fd_raw = init_baselines('Main Slate')
834
+ elif slate_var1 == 'Secondary Slate':
835
+ st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
836
+ fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
837
+ dk_raw, fd_raw = init_baselines('Secondary Slate')
838
+
839
+ raw_baselines = fd_raw
840
+ column_names = fd_columns
841
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
842
+ st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
843
+ st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
844
+
845
+ with st.container():
846
+ if 'data_export_display' in st.session_state:
847
+ st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True)