James McCool commited on
Commit
814ee92
·
1 Parent(s): cced62b

beginning of refactor to include showdown, needs more work

Browse files
sim_func_hold/regular_functions.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import numpy as np
4
+ from pymongo import MongoClient
5
+
6
+ @st.cache_data(ttl = 600)
7
+ def init_DK_seed_frames(slate_var, sharp_split):
8
+
9
+ collection = db['DK_NFL_name_map']
10
+ cursor = collection.find()
11
+ raw_data = pd.DataFrame(list(cursor))
12
+ names_dict = dict(zip(raw_data['key'], raw_data['value']))
13
+ collection = db[f"DK_NFL_{slate_var}_seed_frame"]
14
+ cursor = collection.find().limit(sharp_split)
15
+
16
+ raw_display = pd.DataFrame(list(cursor))
17
+ raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
18
+ dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
19
+ for col in dict_columns:
20
+ raw_display[col] = raw_display[col].map(names_dict)
21
+ DK_seed = raw_display.to_numpy()
22
+
23
+ return DK_seed
24
+
25
+ @st.cache_data(ttl = 599)
26
+ def init_FD_seed_frames(slate_var, sharp_split):
27
+
28
+ collection = db['FD_NFL_name_map']
29
+ cursor = collection.find()
30
+ raw_data = pd.DataFrame(list(cursor))
31
+ names_dict = dict(zip(raw_data['key'], raw_data['value']))
32
+
33
+ collection = db[f"FD_NFL_{slate_var}_seed_frame"]
34
+ cursor = collection.find().limit(sharp_split)
35
+
36
+ raw_display = pd.DataFrame(list(cursor))
37
+ raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
38
+ dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
39
+ for col in dict_columns:
40
+ raw_display[col] = raw_display[col].map(names_dict)
41
+ FD_seed = raw_display.to_numpy()
42
+
43
+ return FD_seed
44
+
45
+ @st.cache_data(ttl = 599)
46
+ def init_baselines(slate_var):
47
+ collection = db["DK_NFL_ROO"]
48
+ cursor = collection.find()
49
+
50
+ raw_display = pd.DataFrame(list(cursor))
51
+ raw_display = raw_display[raw_display['slate'] == slate_var]
52
+ raw_display = raw_display[raw_display['version'] == 'overall']
53
+ dk_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
54
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
55
+ dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
56
+
57
+ collection = db["FD_NFL_ROO"]
58
+ cursor = collection.find()
59
+
60
+ raw_display = pd.DataFrame(list(cursor))
61
+ raw_display = raw_display[raw_display['slate'] == slate_var]
62
+ raw_display = raw_display[raw_display['version'] == 'overall']
63
+ fd_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
64
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
65
+ fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
66
+
67
+ return dk_raw, fd_raw
68
+
69
+ @st.cache_data
70
+ def convert_df(array):
71
+ array = pd.DataFrame(array, columns=column_names)
72
+ return array.to_csv().encode('utf-8')
73
+
74
+ @st.cache_data
75
+ def calculate_DK_value_frequencies(np_array):
76
+ unique, counts = np.unique(np_array[:, :9], return_counts=True)
77
+ frequencies = counts / len(np_array) # Normalize by the number of rows
78
+ combined_array = np.column_stack((unique, frequencies))
79
+ return combined_array
80
+
81
+ @st.cache_data
82
+ def calculate_FD_value_frequencies(np_array):
83
+ unique, counts = np.unique(np_array[:, :9], return_counts=True)
84
+ frequencies = counts / len(np_array) # Normalize by the number of rows
85
+ combined_array = np.column_stack((unique, frequencies))
86
+ return combined_array
87
+
88
+ @st.cache_data
89
+ def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
90
+ SimVar = 1
91
+ Sim_Winners = []
92
+ fp_array = seed_frame.copy()
93
+ # Pre-vectorize functions
94
+ vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
95
+ vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
96
+
97
+ st.write('Simulating contest on frames')
98
+
99
+ while SimVar <= Sim_size:
100
+ fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
101
+
102
+ sample_arrays1 = np.c_[
103
+ fp_random,
104
+ np.sum(np.random.normal(
105
+ loc=vec_projection_map(fp_random[:, :-7]),
106
+ scale=vec_stdev_map(fp_random[:, :-7])),
107
+ axis=1)
108
+ ]
109
+
110
+ sample_arrays = sample_arrays1
111
+
112
+ final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
113
+ best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
114
+ Sim_Winners.append(best_lineup)
115
+ SimVar += 1
116
+
117
+ return Sim_Winners
sim_func_hold/showdown_functions.py ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import numpy as np
4
+ from pymongo import MongoClient
5
+
6
+ @st.cache_data(ttl = 599)
7
+ def init_DK_SD_seed_frames(slate, split):
8
+ if slate == 'Main Slate':
9
+ collection = db[f"DK_NFL_SD_seed_frame"]
10
+ elif slate == 'Secondary Slate':
11
+ collection = db[f"DK_NFL_Secondary_SD_seed_frame"]
12
+ elif slate == 'Auxiliary Slate':
13
+ collection = db[f"DK_NFL_Auxiliary_SD_seed_frame"]
14
+
15
+ cursor = collection.find().limit(split)
16
+
17
+ raw_display = pd.DataFrame(list(cursor))
18
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
19
+ DK_seed = raw_display.to_numpy()
20
+
21
+ return DK_seed
22
+
23
+ @st.cache_data(ttl = 599)
24
+ def init_FD_SD_seed_frames(slate, split):
25
+ if slate == 'Main Slate':
26
+ collection = db[f"FD_NFL_SD_seed_frame"]
27
+ elif slate == 'Secondary Slate':
28
+ collection = db[f"FD_NFL_Secondary_SD_seed_frame"]
29
+ elif slate == 'Auxiliary Slate':
30
+ collection = db[f"FD_NFL_Auxiliary_SD_seed_frame"]
31
+
32
+ cursor = collection.find().limit(split)
33
+
34
+ raw_display = pd.DataFrame(list(cursor))
35
+ raw_display = raw_display[['CPT', 'FLEX1', 'FLEX2', 'FLEX3', 'FLEX4', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
36
+ FD_seed = raw_display.to_numpy()
37
+
38
+ return FD_seed
39
+
40
+ @st.cache_data(ttl = 599)
41
+ def init_SD_baselines(slate_var):
42
+ collection = db['DK_SD_NFL_ROO']
43
+ cursor = collection.find()
44
+
45
+ raw_display = pd.DataFrame(list(cursor))
46
+ raw_display = raw_display[raw_display['slate'] == slate_var]
47
+ raw_display = raw_display[raw_display['version'] == 'overall']
48
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
49
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
50
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
51
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
52
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
53
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
54
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
55
+ raw_display['STDev'] = raw_display['Median'] / 4
56
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
57
+
58
+ dk_raw = raw_display.dropna(subset=['Median'])
59
+
60
+ collection = db['FD_SD_NFL_ROO']
61
+ cursor = collection.find()
62
+
63
+ raw_display = pd.DataFrame(list(cursor))
64
+ raw_display = raw_display[raw_display['slate'] == slate_var]
65
+ raw_display = raw_display[raw_display['version'] == 'overall']
66
+ raw_display = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
67
+ 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_id', 'site']]
68
+ raw_display['Small_Field_Own'] = raw_display['Large_Field_Own']
69
+ raw_display['small_CPT_Own_raw'] = (raw_display['Small_Field_Own'] / 2) * ((100 - (100-raw_display['Small_Field_Own']))/100)
70
+ small_cpt_own_var = 300 / raw_display['small_CPT_Own_raw'].sum()
71
+ raw_display['small_CPT_Own'] = raw_display['small_CPT_Own_raw'] * small_cpt_own_var
72
+ raw_display['cpt_Median'] = raw_display['Median'] * 1.25
73
+ raw_display['STDev'] = raw_display['Median'] / 4
74
+ raw_display['CPT_STDev'] = raw_display['cpt_Median'] / 4
75
+
76
+ fd_raw = raw_display.dropna(subset=['Median'])
77
+
78
+ return dk_raw, fd_raw
79
+
80
+ @st.cache_data
81
+ def convert_df(array):
82
+ array = pd.DataFrame(array, columns=column_names)
83
+ return array.to_csv().encode('utf-8')
84
+
85
+ @st.cache_data
86
+ def calculate_SD_value_frequencies(np_array):
87
+ unique, counts = np.unique(np_array[:, :6], return_counts=True)
88
+ frequencies = counts / len(np_array) # Normalize by the number of rows
89
+ combined_array = np.column_stack((unique, frequencies))
90
+ return combined_array
91
+
92
+ @st.cache_data
93
+ def sim_SD_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
94
+ SimVar = 1
95
+ Sim_Winners = []
96
+
97
+ # Pre-vectorize functions
98
+ vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
99
+ vec_cpt_projection_map = np.vectorize(maps_dict['cpt_projection_map'].__getitem__)
100
+ vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
101
+ vec_cpt_stdev_map = np.vectorize(maps_dict['cpt_STDev_map'].__getitem__)
102
+
103
+ st.write('Simulating contest on frames')
104
+
105
+ while SimVar <= Sim_size:
106
+ fp_random = seed_frame[np.random.choice(seed_frame.shape[0], Contest_Size)]
107
+
108
+ sample_arrays1 = np.c_[
109
+ fp_random,
110
+ np.sum(np.random.normal(
111
+ loc=np.concatenate([
112
+ vec_cpt_projection_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
113
+ vec_projection_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
114
+ ], axis=1),
115
+ scale=np.concatenate([
116
+ vec_cpt_stdev_map(fp_random[:, 0:1]), # Apply cpt_projection_map to first column
117
+ vec_stdev_map(fp_random[:, 1:-7]) # Apply original projection to remaining columns
118
+ ], axis=1)),
119
+ axis=1)
120
+ ]
121
+
122
+ sample_arrays = sample_arrays1
123
+
124
+ final_array = sample_arrays[sample_arrays[:, 7].argsort()[::-1]]
125
+ best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
126
+ Sim_Winners.append(best_lineup)
127
+ SimVar += 1
128
+
129
+ return Sim_Winners
src/streamlit_app.py CHANGED
@@ -6,6 +6,9 @@ import re
6
  import os
7
  from itertools import combinations
8
 
 
 
 
9
  st.set_page_config(layout="wide")
10
 
11
  @st.cache_resource
@@ -61,179 +64,32 @@ st.markdown("""
61
 
62
  </style>""", unsafe_allow_html=True)
63
 
64
- @st.cache_data(ttl = 600)
65
- def init_DK_seed_frames(sharp_split):
66
-
67
- collection = db['DK_NFL_name_map']
68
- cursor = collection.find()
69
- raw_data = pd.DataFrame(list(cursor))
70
- names_dict = dict(zip(raw_data['key'], raw_data['value']))
71
- collection = db["DK_NFL_seed_frame"]
72
- cursor = collection.find().limit(sharp_split)
73
-
74
- raw_display = pd.DataFrame(list(cursor))
75
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
76
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
77
- for col in dict_columns:
78
- raw_display[col] = raw_display[col].map(names_dict)
79
- DK_seed = raw_display.to_numpy()
80
-
81
- return DK_seed
82
-
83
- @st.cache_data(ttl = 600)
84
- def init_DK_Secondary_seed_frames(sharp_split):
85
-
86
- collection = db['DK_NFL_Secondary_name_map']
87
- cursor = collection.find()
88
- raw_data = pd.DataFrame(list(cursor))
89
- names_dict = dict(zip(raw_data['key'], raw_data['value']))
90
- collection = db["DK_NFL_Secondary_seed_frame"]
91
- cursor = collection.find().limit(sharp_split)
92
-
93
- raw_display = pd.DataFrame(list(cursor))
94
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
95
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
96
- for col in dict_columns:
97
- raw_display[col] = raw_display[col].map(names_dict)
98
- DK_seed = raw_display.to_numpy()
99
-
100
- return DK_seed
101
-
102
- @st.cache_data(ttl = 599)
103
- def init_FD_seed_frames(sharp_split):
104
-
105
- collection = db['FD_NFL_name_map']
106
- cursor = collection.find()
107
- raw_data = pd.DataFrame(list(cursor))
108
- names_dict = dict(zip(raw_data['key'], raw_data['value']))
109
-
110
- collection = db["FD_NFL_seed_frame"]
111
- cursor = collection.find().limit(sharp_split)
112
-
113
- raw_display = pd.DataFrame(list(cursor))
114
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
115
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
116
- for col in dict_columns:
117
- raw_display[col] = raw_display[col].map(names_dict)
118
- FD_seed = raw_display.to_numpy()
119
-
120
- return FD_seed
121
-
122
- @st.cache_data(ttl = 599)
123
- def init_FD_Secondary_seed_frames(sharp_split):
124
-
125
- collection = db['FD_NFL_Secondary_name_map']
126
- cursor = collection.find()
127
- raw_data = pd.DataFrame(list(cursor))
128
- names_dict = dict(zip(raw_data['key'], raw_data['value']))
129
-
130
- collection = db["FD_NFL_Secondary_seed_frame"]
131
- cursor = collection.find().limit(sharp_split)
132
-
133
- raw_display = pd.DataFrame(list(cursor))
134
- raw_display = raw_display[['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST', 'salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own']]
135
- dict_columns = ['QB', 'RB1', 'RB2', 'WR1', 'WR2', 'WR3', 'TE', 'FLEX', 'DST']
136
- for col in dict_columns:
137
- raw_display[col] = raw_display[col].map(names_dict)
138
- FD_seed = raw_display.to_numpy()
139
-
140
- return FD_seed
141
-
142
- @st.cache_data(ttl = 599)
143
- def init_baselines(slate_var):
144
- collection = db["DK_NFL_ROO"]
145
- cursor = collection.find()
146
-
147
- raw_display = pd.DataFrame(list(cursor))
148
- raw_display = raw_display[raw_display['slate'] == slate_var]
149
- raw_display = raw_display[raw_display['version'] == 'overall']
150
- dk_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
151
- 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
152
- dk_raw['STDev'] = (dk_raw['Ceiling'] - dk_raw['Floor']) / 4
153
-
154
- collection = db["FD_NFL_ROO"]
155
- cursor = collection.find()
156
-
157
- raw_display = pd.DataFrame(list(cursor))
158
- raw_display = raw_display[raw_display['slate'] == slate_var]
159
- raw_display = raw_display[raw_display['version'] == 'overall']
160
- fd_raw = raw_display[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%',
161
- 'Own', 'Small_Field_Own', 'Large_Field_Own', 'Cash_Field_Own', 'CPT_Own', 'LevX', 'version', 'slate', 'timestamp', 'player_ID', 'site']]
162
- fd_raw['STDev'] = (fd_raw['Ceiling'] - fd_raw['Floor']) / 4
163
-
164
- return dk_raw, fd_raw
165
-
166
- @st.cache_data
167
- def convert_df(array):
168
- array = pd.DataFrame(array, columns=column_names)
169
- return array.to_csv().encode('utf-8')
170
-
171
- @st.cache_data
172
- def calculate_DK_value_frequencies(np_array):
173
- unique, counts = np.unique(np_array[:, :9], return_counts=True)
174
- frequencies = counts / len(np_array) # Normalize by the number of rows
175
- combined_array = np.column_stack((unique, frequencies))
176
- return combined_array
177
-
178
- @st.cache_data
179
- def calculate_FD_value_frequencies(np_array):
180
- unique, counts = np.unique(np_array[:, :9], return_counts=True)
181
- frequencies = counts / len(np_array) # Normalize by the number of rows
182
- combined_array = np.column_stack((unique, frequencies))
183
- return combined_array
184
-
185
- @st.cache_data
186
- def sim_contest(Sim_size, seed_frame, maps_dict, Contest_Size):
187
- SimVar = 1
188
- Sim_Winners = []
189
- fp_array = seed_frame.copy()
190
- # Pre-vectorize functions
191
- vec_projection_map = np.vectorize(maps_dict['Projection_map'].__getitem__)
192
- vec_stdev_map = np.vectorize(maps_dict['STDev_map'].__getitem__)
193
-
194
- st.write('Simulating contest on frames')
195
-
196
- while SimVar <= Sim_size:
197
- fp_random = fp_array[np.random.choice(fp_array.shape[0], Contest_Size)]
198
-
199
- sample_arrays1 = np.c_[
200
- fp_random,
201
- np.sum(np.random.normal(
202
- loc=vec_projection_map(fp_random[:, :-7]),
203
- scale=vec_stdev_map(fp_random[:, :-7])),
204
- axis=1)
205
- ]
206
-
207
- sample_arrays = sample_arrays1
208
-
209
- final_array = sample_arrays[sample_arrays[:, 10].argsort()[::-1]]
210
- best_lineup = final_array[final_array[:, -1].argsort(kind='stable')[::-1][:1]]
211
- Sim_Winners.append(best_lineup)
212
- SimVar += 1
213
-
214
- return Sim_Winners
215
-
216
  if st.button("Load/Reset Data", key='reset2'):
217
  st.cache_data.clear()
218
  for key in st.session_state.keys():
219
  del st.session_state[key]
220
- DK_seed = init_DK_seed_frames(10000)
221
- FD_seed = init_FD_seed_frames(10000)
 
 
222
  dk_raw, fd_raw = init_baselines('Main Slate')
 
223
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
 
224
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
 
225
 
226
  selected_tab = st.segmented_control(
227
  "Select Tab",
228
- options=["Contest Sims", "Data Export"],
229
  selection_mode='single',
230
- default='Contest Sims',
231
  width='stretch',
232
  label_visibility='collapsed',
233
  key='tab_selector'
234
  )
235
 
236
- if selected_tab == "Contest Sims":
237
  dk_raw, fd_raw = init_baselines('Main Slate')
238
  raw_baselines = dk_raw
239
  column_names = dk_columns
@@ -272,26 +128,16 @@ if selected_tab == "Contest Sims":
272
 
273
  if 'working_seed' not in st.session_state:
274
  if sim_site_var1 == 'Draftkings':
275
- if sim_slate_var1 == 'Main Slate':
276
- st.session_state.working_seed = init_DK_seed_frames(sharp_split)
277
- dk_raw, fd_raw = init_baselines('Main Slate')
278
- dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
279
- elif sim_slate_var1 == 'Secondary Slate':
280
- st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split)
281
- dk_raw, fd_raw = init_baselines('Secondary Slate')
282
- dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
283
 
284
  raw_baselines = dk_raw
285
  column_names = dk_columns
286
  elif sim_site_var1 == 'Fanduel':
287
- if sim_slate_var1 == 'Main Slate':
288
- st.session_state.working_seed = init_FD_seed_frames(sharp_split)
289
- dk_raw, fd_raw = init_baselines('Main Slate')
290
- fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
291
- elif sim_slate_var1 == 'Secondary Slate':
292
- st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split)
293
- dk_raw, fd_raw = init_baselines('Secondary Slate')
294
- fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
295
 
296
  raw_baselines = fd_raw
297
  column_names = fd_columns
@@ -708,131 +554,287 @@ if selected_tab == "Contest Sims":
708
  key='team'
709
  )
710
 
711
- if selected_tab == "Data Export":
712
- col1, col2 = st.columns([1, 7])
713
- with col1:
714
-
715
- slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'))
716
- site_var1 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'))
717
- sharp_split_var = st.number_input("How many lineups do you want?", value=10000, max_value=500000, min_value=10000, step=10000)
718
-
719
- if site_var1 == 'Draftkings':
720
-
721
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
722
- if team_var1 == 'Specific Teams':
723
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
724
- team_var2 = st.multiselect('Which teams do you want?', options = dk_raw_exports['Team'].unique())
725
- elif team_var1 == 'Full Slate':
726
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
727
- team_var2 = dk_raw_exports.Team.values.tolist()
728
-
729
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
730
- if stack_var1 == 'Specific Stack Sizes':
731
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
732
- elif stack_var1 == 'Full Slate':
733
- stack_var2 = [5, 4, 3, 2, 1, 0]
734
-
735
- elif site_var1 == 'Fanduel':
736
-
737
- team_var1 = st.radio("Do you want a frame with specific teams?", ('Full Slate', 'Specific Teams'), key='team_var1')
738
- if team_var1 == 'Specific Teams':
739
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
740
- team_var2 = st.multiselect('Which teams do you want?', options = fd_raw_exports['Team'].unique())
741
- elif team_var1 == 'Full Slate':
742
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
743
- team_var2 = fd_raw_exports.Team.values.tolist()
744
-
745
- stack_var1 = st.radio("Do you want a frame with specific stack sizes?", ('Full Slate', 'Specific Stack Sizes'), key='stack_var1')
746
- if stack_var1 == 'Specific Stack Sizes':
747
- stack_var2 = st.multiselect('Which stack sizes do you want?', options = [5, 4, 3, 2, 1, 0])
748
- elif stack_var1 == 'Full Slate':
749
- stack_var2 = [5, 4, 3, 2, 1, 0]
750
-
751
 
752
- if st.button("Prepare data export", key='data_export'):
753
- if 'working_seed' in st.session_state:
754
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
755
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
756
- elif 'working_seed' not in st.session_state:
757
- if site_var1 == 'Draftkings':
758
- if slate_var1 == 'Main Slate':
759
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
760
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
761
- elif slate_var1 == 'Secondary Slate':
762
- st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
763
- dk_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
764
-
765
- raw_baselines = dk_raw_exports
766
- column_names = dk_columns
767
-
768
- elif site_var1 == 'Fanduel':
769
- if slate_var1 == 'Main Slate':
770
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
771
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
772
- elif slate_var1 == 'Secondary Slate':
773
- st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
774
- fd_id_dict = dict(zip(st.session_state.working_seed.Player, st.session_state.working_seed.player_ID))
775
-
776
- raw_baselines = fd_raw_exports
777
- column_names = fd_columns
778
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
779
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
780
- data_export = st.session_state.working_seed.copy()
781
- for col in range(9):
782
- data_export[:, col] = np.array([dk_id_dict.get(x, x) for x in data_export[:, col]])
783
- st.download_button(
784
- label="Export optimals set",
785
- data=convert_df(data_export),
786
- file_name='NFL_optimals_export.csv',
787
- mime='text/csv',
788
- )
789
 
790
- with col2:
791
- if st.button("Load Data", key='load_data'):
792
- if site_var1 == 'Draftkings':
793
- if 'working_seed' in st.session_state:
794
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
795
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
796
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
797
- elif 'working_seed' not in st.session_state:
798
- if slate_var1 == 'Main Slate':
799
- st.session_state.working_seed = init_DK_seed_frames(sharp_split_var)
800
- dk_id_dict = dict(zip(dk_raw_exports.Player, dk_raw_exports.player_ID))
801
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
802
-
803
- elif slate_var1 == 'Secondary Slate':
804
- st.session_state.working_seed = init_DK_Secondary_seed_frames(sharp_split_var)
805
- dk_id_dict = dict(zip(dk_raw_exports.Player, dk_raw_exports.player_ID))
806
- dk_raw_exports, fd_raw_exports = init_baselines('Secondary Slate')
807
-
808
- raw_baselines = dk_raw_exports
809
- column_names = dk_columns
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
810
 
811
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
812
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
813
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
814
 
815
- elif site_var1 == 'Fanduel':
816
- if 'working_seed' in st.session_state:
817
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
818
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
819
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
820
- elif 'working_seed' not in st.session_state:
821
- if slate_var1 == 'Main Slate':
822
- st.session_state.working_seed = init_FD_seed_frames(sharp_split_var)
823
- fd_id_dict = dict(zip(fd_raw_exports.Player, fd_raw_exports.player_ID))
824
- dk_raw_exports, fd_raw_exports = init_baselines('Main Slate')
825
- elif slate_var1 == 'Secondary Slate':
826
- st.session_state.working_seed = init_FD_Secondary_seed_frames(sharp_split_var)
827
- fd_id_dict = dict(zip(fd_raw_exports.Player, fd_raw_exports.player_ID))
828
- dk_raw_exports, fd_raw_exports = init_baselines('Secondary Slate')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
829
 
830
- raw_baselines = fd_raw_exports
831
- column_names = fd_columns
832
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 11], team_var2)]
833
- st.session_state.working_seed = st.session_state.working_seed[np.isin(st.session_state.working_seed[:, 12], stack_var2)]
834
- st.session_state.data_export_display = pd.DataFrame(st.session_state.working_seed[0:1000], columns=column_names)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
835
 
836
  with st.container():
837
- if 'data_export_display' in st.session_state:
838
- st.dataframe(st.session_state.data_export_display.style.format(freq_format, precision=2), use_container_width = True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  import os
7
  from itertools import combinations
8
 
9
+ from sim_func_hold.regular_functions import *
10
+ from sim_func_hold.showdown_functions import *
11
+
12
  st.set_page_config(layout="wide")
13
 
14
  @st.cache_resource
 
64
 
65
  </style>""", unsafe_allow_html=True)
66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  if st.button("Load/Reset Data", key='reset2'):
68
  st.cache_data.clear()
69
  for key in st.session_state.keys():
70
  del st.session_state[key]
71
+ DK_seed = init_DK_seed_frames('Main Slate', 10000)
72
+ DK_sd_seed = init_DK_SD_seed_frames('Main Slate', 10000)
73
+ FD_seed = init_FD_seed_frames('Main Slate', 10000)
74
+ FD_sd_seed = init_FD_SD_seed_frames('Main Slate', 10000)
75
  dk_raw, fd_raw = init_baselines('Main Slate')
76
+ dk_sd_raw, fd_sd_raw = init_SD_baselines('Main Slate')
77
  dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
78
+ dk_sd_id_dict = dict(zip(dk_sd_raw.Player, dk_sd_raw.player_ID))
79
  fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
80
+ fd_sd_id_dict = dict(zip(fd_sd_raw.Player, fd_sd_raw.player_ID))
81
 
82
  selected_tab = st.segmented_control(
83
  "Select Tab",
84
+ options=["Regular Slate Contest Sims", "Showdown Contest Sims"],
85
  selection_mode='single',
86
+ default='Regular Slate Contest Sims',
87
  width='stretch',
88
  label_visibility='collapsed',
89
  key='tab_selector'
90
  )
91
 
92
+ if selected_tab == "Regular Slate Contest Sims":
93
  dk_raw, fd_raw = init_baselines('Main Slate')
94
  raw_baselines = dk_raw
95
  column_names = dk_columns
 
128
 
129
  if 'working_seed' not in st.session_state:
130
  if sim_site_var1 == 'Draftkings':
131
+ st.session_state.working_seed = init_DK_seed_frames(sim_slate_var1, sharp_split)
132
+ dk_raw, fd_raw = init_baselines(sim_slate_var1)
133
+ dk_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
 
 
 
 
 
134
 
135
  raw_baselines = dk_raw
136
  column_names = dk_columns
137
  elif sim_site_var1 == 'Fanduel':
138
+ st.session_state.working_seed = init_FD_seed_frames(sim_slate_var1, sharp_split)
139
+ dk_raw, fd_raw = init_baselines(sim_slate_var1)
140
+ fd_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
 
 
 
 
 
141
 
142
  raw_baselines = fd_raw
143
  column_names = fd_columns
 
554
  key='team'
555
  )
556
 
557
+ if selected_tab == "Showdown Contest Sims":
558
+ dk_raw, fd_raw = init_SD_baselines('Main Slate')
559
+ raw_baselines = dk_raw
560
+ column_names = dk_columns
561
+ with st.expander("Info and Filters"):
562
+ site_data_col, slate_data_col, contest_size_col, contest_sharpness_col = st.columns([1, 1, 1, 1])
563
+ with site_data_col:
564
+ sim_site_var2 = st.radio("What site are you working with?", ('Draftkings', 'Fanduel'), key='sim_site_var2')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
565
 
566
+ with slate_data_col:
567
+ sim_slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate'), key='sim_slate_var2')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
 
569
+ with contest_size_col:
570
+ contest_var2 = st.selectbox("What contest size are you simulating?", ('Small', 'Medium', 'Large'), key='contest_var2')
571
+ if contest_var2 == 'Small':
572
+ Contest_Size = 1000
573
+ elif contest_var2 == 'Medium':
574
+ Contest_Size = 5000
575
+ elif contest_var2 == 'Large':
576
+ Contest_Size = 10000
577
+ elif contest_var2 == 'Custom':
578
+ Contest_Size = st.number_input("Insert contest size", value=100, placeholder="Type a number under 10,000...")
579
+ with contest_sharpness_col:
580
+ strength_var2 = st.selectbox("How sharp is the field in the contest?", ('Very', 'Above Average', 'Average', 'Below Average', 'Not Very'), key='strength_var2')
581
+ if strength_var2 == 'Not Very':
582
+ sharp_split = 500000
583
+ elif strength_var2 == 'Below Average':
584
+ sharp_split = 250000
585
+ elif strength_var2 == 'Average':
586
+ sharp_split = 100000
587
+ elif strength_var2 == 'Above Average':
588
+ sharp_split = 50000
589
+ elif strength_var2 == 'Very':
590
+ sharp_split = 10000
591
+
592
+ if st.button("Run Contest Sim"):
593
+
594
+ if 'sd_working_seed' not in st.session_state:
595
+ if sim_site_var2 == 'Draftkings':
596
+ st.session_state.sd_working_seed = init_DK_SD_seed_frames(sim_slate_var2, sharp_split)
597
+ export_id_dict = dict(zip(dk_raw.Player, dk_raw.player_ID))
598
+ raw_baselines = dk_raw
599
+ column_names = dk_columns
600
+ elif sim_site_var2 == 'Fanduel':
601
+ st.session_state.sd_working_seed = init_FD_SD_seed_frames(sim_slate_var2, sharp_split)
602
+ export_id_dict = dict(zip(fd_raw.Player, fd_raw.player_ID))
603
+ raw_baselines = fd_raw
604
+ column_names = fd_columns
605
+ maps_dict = {
606
+ 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
607
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
608
+ 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
609
+ 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
610
+ 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
611
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
612
+ 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
613
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
614
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
615
+ }
616
+ Sim_Winners = sim_SD_contest(1000, st.session_state.sd_working_seed, maps_dict, Contest_Size)
617
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
618
 
619
+ #st.table(Sim_Winner_Frame)
620
+
621
+ # Initial setup
622
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
623
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
624
+ Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)
625
+ # Add percent rank columns for ownership at each roster position
626
+ # Calculate Dupes column for Fanduel
627
+ dup_count_columns = ['CPT_Own_percent_rank', 'FLEX1_Own_percent_rank', 'FLEX2_Own_percent_rank', 'FLEX3_Own_percent_rank', 'FLEX4_Own_percent_rank', 'FLEX5_Own_percent_rank']
628
+ own_columns = ['CPT_Own', 'FLEX1_Own', 'FLEX2_Own', 'FLEX3_Own', 'FLEX4_Own', 'FLEX5_Own']
629
+ calc_columns = ['own_product', 'avg_own_rank', 'dupes_calc']
630
+ Sim_Winner_Frame['CPT_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']).rank(pct=True)
631
+ Sim_Winner_Frame['FLEX1_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']).rank(pct=True)
632
+ Sim_Winner_Frame['FLEX2_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']).rank(pct=True)
633
+ Sim_Winner_Frame['FLEX3_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']).rank(pct=True)
634
+ Sim_Winner_Frame['FLEX4_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']).rank(pct=True)
635
+ Sim_Winner_Frame['FLEX5_Own_percent_rank'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']).rank(pct=True)
636
+ Sim_Winner_Frame['CPT_Own'] = Sim_Winner_Frame.iloc[:,0].map(maps_dict['cpt_Own_map']) / 100
637
+ Sim_Winner_Frame['FLEX1_Own'] = Sim_Winner_Frame.iloc[:,1].map(maps_dict['Own_map']) / 100
638
+ Sim_Winner_Frame['FLEX2_Own'] = Sim_Winner_Frame.iloc[:,2].map(maps_dict['Own_map']) / 100
639
+ Sim_Winner_Frame['FLEX3_Own'] = Sim_Winner_Frame.iloc[:,3].map(maps_dict['Own_map']) / 100
640
+ Sim_Winner_Frame['FLEX4_Own'] = Sim_Winner_Frame.iloc[:,4].map(maps_dict['Own_map']) / 100
641
+ Sim_Winner_Frame['FLEX5_Own'] = Sim_Winner_Frame.iloc[:,5].map(maps_dict['Own_map']) / 100
642
+
643
+ # Calculate ownership product and convert to probability
644
+ Sim_Winner_Frame['own_product'] = (Sim_Winner_Frame[own_columns].product(axis=1))
645
+
646
+ # Calculate average of ownership percent rank columns
647
+ Sim_Winner_Frame['avg_own_rank'] = Sim_Winner_Frame[dup_count_columns].mean(axis=1)
648
+
649
+ # Calculate dupes formula
650
+ Sim_Winner_Frame['dupes_calc'] = ((Sim_Winner_Frame['own_product'] * Sim_Winner_Frame['avg_own_rank']) * (Contest_Size * 1.5)) + ((Sim_Winner_Frame['salary'] - 49800) / 100)
651
+
652
+ # Round and handle negative values
653
+ Sim_Winner_Frame['Dupes'] = np.where(
654
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
655
+ 0,
656
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) - 1
657
+ )
658
+ Sim_Winner_Frame['Dupes'] = (Sim_Winner_Frame['Dupes'] * (500000 / sharp_split)) / 2
659
 
660
+ Sim_Winner_Frame['Dupes'] = np.round(Sim_Winner_Frame['Dupes'], 0)
661
+ Sim_Winner_Frame['Dupes'] = np.where(
662
+ np.round(Sim_Winner_Frame['dupes_calc'], 0) <= 0,
663
+ 0,
664
+ np.round(Sim_Winner_Frame['dupes_calc'], 0)
665
+ )
666
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=dup_count_columns)
667
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=own_columns)
668
+ Sim_Winner_Frame = Sim_Winner_Frame.drop(columns=calc_columns)
669
+
670
+ Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
671
+
672
+ # Type Casting
673
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32, 'Dupes': int}
674
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
675
+
676
+ # Sorting
677
+ st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100)
678
+ st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
679
+
680
+ # Data Copying
681
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
682
+ st.session_state.Sim_Winner_Export.iloc[:, 0:6] = st.session_state.Sim_Winner_Export.iloc[:, 0:6].apply(lambda x: x.map(export_id_dict))
683
+
684
+ # Data Copying
685
+ st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
686
+ freq_copy = st.session_state.Sim_Winner_Display
687
+
688
+ else:
689
+ maps_dict = {
690
+ 'Projection_map':dict(zip(raw_baselines.Player,raw_baselines.Median)),
691
+ 'cpt_projection_map':dict(zip(raw_baselines.Player,raw_baselines.cpt_Median)),
692
+ 'Salary_map':dict(zip(raw_baselines.Player,raw_baselines.Salary)),
693
+ 'Pos_map':dict(zip(raw_baselines.Player,raw_baselines.Position)),
694
+ 'Own_map':dict(zip(raw_baselines.Player,raw_baselines['Own'])),
695
+ 'cpt_Own_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_Own'])),
696
+ 'Team_map':dict(zip(raw_baselines.Player,raw_baselines.Team)),
697
+ 'STDev_map':dict(zip(raw_baselines.Player,raw_baselines.STDev)),
698
+ 'cpt_STDev_map':dict(zip(raw_baselines.Player,raw_baselines['CPT_STDev']))
699
+ }
700
+ Sim_Winners = sim_SD_contest(1000, st.session_state.working_seed, maps_dict, Contest_Size)
701
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners))
702
+
703
+ #st.table(Sim_Winner_Frame)
704
 
705
+ # Initial setup
706
+ Sim_Winner_Frame = pd.DataFrame(np.concatenate(Sim_Winners), columns=column_names + ['Fantasy'])
707
+ Sim_Winner_Frame['GPP_Proj'] = (Sim_Winner_Frame['proj'] + Sim_Winner_Frame['Fantasy']) / 2
708
+ Sim_Winner_Frame['unique_id'] = Sim_Winner_Frame['proj'].astype(str) + Sim_Winner_Frame['salary'].astype(str) + Sim_Winner_Frame['Team'].astype(str) + Sim_Winner_Frame['Secondary'].astype(str)
709
+ Sim_Winner_Frame = Sim_Winner_Frame.assign(win_count=Sim_Winner_Frame['unique_id'].map(Sim_Winner_Frame['unique_id'].value_counts()))
710
+
711
+ # Type Casting
712
+ type_cast_dict = {'salary': int, 'proj': np.float16, 'Fantasy': np.float16, 'GPP_Proj': np.float32, 'Own': np.float32}
713
+ Sim_Winner_Frame = Sim_Winner_Frame.astype(type_cast_dict)
714
+
715
+ # Sorting
716
+ st.session_state.Sim_Winner_Frame = Sim_Winner_Frame.sort_values(by=['win_count', 'GPP_Proj'], ascending= [False, False]).copy().drop_duplicates(subset='unique_id').head(100)
717
+ st.session_state.Sim_Winner_Frame.drop(columns='unique_id', inplace=True)
718
+
719
+ # Data Copying
720
+ st.session_state.Sim_Winner_Export = Sim_Winner_Frame.copy()
721
+
722
+ # Data Copying
723
+ st.session_state.Sim_Winner_Display = Sim_Winner_Frame.copy()
724
+ freq_copy = st.session_state.Sim_Winner_Display
725
+
726
+ if sim_site_var2 == 'Draftkings':
727
+ freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:6].values, return_counts=True)),
728
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
729
+ elif sim_site_var2 == 'Fanduel':
730
+ freq_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:5].values, return_counts=True)),
731
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
732
+ freq_working['Freq'] = freq_working['Freq'].astype(int)
733
+ freq_working['Position'] = freq_working['Player'].map(maps_dict['Pos_map'])
734
+ freq_working['Salary'] = freq_working['Player'].map(maps_dict['Salary_map']) / 1.5
735
+ freq_working['Proj Own'] = freq_working['Player'].map(maps_dict['Own_map']) / 100
736
+ freq_working['Exposure'] = freq_working['Freq']/(1000)
737
+ freq_working['Edge'] = freq_working['Exposure'] - freq_working['Proj Own']
738
+ freq_working['Team'] = freq_working['Player'].map(maps_dict['Team_map'])
739
+ st.session_state.player_freq = freq_working.copy()
740
+
741
+ cpt_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,0:1].values, return_counts=True)),
742
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
743
+ cpt_working['Freq'] = cpt_working['Freq'].astype(int)
744
+ cpt_working['Position'] = cpt_working['Player'].map(maps_dict['Pos_map'])
745
+ cpt_working['Salary'] = cpt_working['Player'].map(maps_dict['Salary_map'])
746
+ cpt_working['Proj Own'] = cpt_working['Player'].map(maps_dict['cpt_Own_map']) / 100
747
+ cpt_working['Exposure'] = cpt_working['Freq']/(1000)
748
+ cpt_working['Edge'] = cpt_working['Exposure'] - cpt_working['Proj Own']
749
+ cpt_working['Team'] = cpt_working['Player'].map(maps_dict['Team_map'])
750
+ st.session_state.sp_freq = cpt_working.copy()
751
+
752
+ flex_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,1:6].values, return_counts=True)),
753
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
754
+ cpt_own_div = 600
755
+ flex_working['Freq'] = flex_working['Freq'].astype(int)
756
+ flex_working['Position'] = flex_working['Player'].map(maps_dict['Pos_map'])
757
+ flex_working['Salary'] = flex_working['Player'].map(maps_dict['Salary_map']) / 1.5
758
+ flex_working['Proj Own'] = (flex_working['Player'].map(maps_dict['Own_map']) / 100) - (flex_working['Player'].map(maps_dict['cpt_Own_map']) / 100)
759
+ flex_working['Exposure'] = flex_working['Freq']/(1000)
760
+ flex_working['Edge'] = flex_working['Exposure'] - flex_working['Proj Own']
761
+ flex_working['Team'] = flex_working['Player'].map(maps_dict['Team_map'])
762
+ st.session_state.flex_freq = flex_working.copy()
763
+
764
+ team_working = pd.DataFrame(np.column_stack(np.unique(freq_copy.iloc[:,8:9].values, return_counts=True)),
765
+ columns=['Player','Freq']).sort_values('Freq', ascending=False).reset_index(drop=True)
766
+ team_working['Freq'] = team_working['Freq'].astype(int)
767
+ team_working['Exposure'] = team_working['Freq']/(1000)
768
+ st.session_state.team_freq = team_working.copy()
769
+
770
+ with st.container():
771
+ if st.button("Reset Sim", key='reset_sim'):
772
+ for key in st.session_state.keys():
773
+ del st.session_state[key]
774
+ if 'player_freq' in st.session_state:
775
+ player_split_var2 = st.radio("Are you wanting to isolate any lineups with specific players?", ('Full Players', 'Specific Players'), key='player_split_var2')
776
+ if player_split_var2 == 'Specific Players':
777
+ find_var2 = st.multiselect('Which players must be included in the lineups?', options = st.session_state.player_freq['Player'].unique())
778
+ elif player_split_var2 == 'Full Players':
779
+ find_var2 = st.session_state.player_freq.Player.values.tolist()
780
+
781
+ if player_split_var2 == 'Specific Players':
782
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame[np.equal.outer(st.session_state.Sim_Winner_Frame.to_numpy(), find_var2).any(axis=1).all(axis=1)]
783
+ if player_split_var2 == 'Full Players':
784
+ st.session_state.Sim_Winner_Display = st.session_state.Sim_Winner_Frame
785
+ if 'Sim_Winner_Display' in st.session_state:
786
+ st.dataframe(st.session_state.Sim_Winner_Display.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(precision=2), use_container_width = True)
787
+ if 'Sim_Winner_Export' in st.session_state:
788
+ st.download_button(
789
+ label="Export Full Frame",
790
+ data=st.session_state.Sim_Winner_Export.to_csv().encode('utf-8'),
791
+ file_name='NFL_SD_consim_export.csv',
792
+ mime='text/csv',
793
+ )
794
 
795
  with st.container():
796
+ tab1, tab2, tab3, tab4 = st.tabs(['Overall Exposures', 'CPT Exposures', 'FLEX Exposures', 'Team Exposures'])
797
+ with tab1:
798
+ if 'player_freq' in st.session_state:
799
+
800
+ st.dataframe(st.session_state.player_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
801
+ st.download_button(
802
+ label="Export Exposures",
803
+ data=st.session_state.player_freq.to_csv().encode('utf-8'),
804
+ file_name='player_freq_export.csv',
805
+ mime='text/csv',
806
+ key='overall'
807
+ )
808
+ with tab2:
809
+ if 'sp_freq' in st.session_state:
810
+
811
+ st.dataframe(st.session_state.sp_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
812
+ st.download_button(
813
+ label="Export Exposures",
814
+ data=st.session_state.sp_freq.to_csv().encode('utf-8'),
815
+ file_name='cpt_freq.csv',
816
+ mime='text/csv',
817
+ key='sp'
818
+ )
819
+ with tab3:
820
+ if 'flex_freq' in st.session_state:
821
+
822
+ st.dataframe(st.session_state.flex_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(freq_format, precision=2), use_container_width = True)
823
+ st.download_button(
824
+ label="Export Exposures",
825
+ data=st.session_state.flex_freq.to_csv().encode('utf-8'),
826
+ file_name='flex_freq.csv',
827
+ mime='text/csv',
828
+ key='flex'
829
+ )
830
+ with tab4:
831
+ if 'team_freq' in st.session_state:
832
+
833
+ st.dataframe(st.session_state.team_freq.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(percentages_format, precision=2), use_container_width = True)
834
+ st.download_button(
835
+ label="Export Exposures",
836
+ data=st.session_state.team_freq.to_csv().encode('utf-8'),
837
+ file_name='team_freq.csv',
838
+ mime='text/csv',
839
+ key='team'
840
+ )