Multichem commited on
Commit
6feec2e
·
1 Parent(s): 952cb80

Upload streamlit_app (2).py

Browse files
Files changed (1) hide show
  1. streamlit_app (2).py +1222 -0
streamlit_app (2).py ADDED
@@ -0,0 +1,1222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pulp
2
+ import numpy as np
3
+ import pandas as pd
4
+ import streamlit as st
5
+ import gspread
6
+ from itertools import combinations
7
+
8
+ scope = ['https://www.googleapis.com/auth/spreadsheets',
9
+ "https://www.googleapis.com/auth/drive"]
10
+
11
+ credentials = {
12
+ "type": "service_account",
13
+ "project_id": "sheets-api-connect-378620",
14
+ "private_key_id": "1005124050c80d085e2c5b344345715978dd9cc9",
15
+ "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",
16
+ "client_email": "gspread-connection@sheets-api-connect-378620.iam.gserviceaccount.com",
17
+ "client_id": "106625872877651920064",
18
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
19
+ "token_uri": "https://oauth2.googleapis.com/token",
20
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
21
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/gspread-connection%40sheets-api-connect-378620.iam.gserviceaccount.com"
22
+ }
23
+
24
+ gc = gspread.service_account_from_dict(credentials)
25
+
26
+ st.set_page_config(layout="wide")
27
+
28
+ game_format = {'Win Percentage': '{:.2%}','First Inning Lead Percentage': '{:.2%}',
29
+ 'Fifth Inning Lead Percentage': '{:.2%}', '8+ runs': '{:.2%}', 'DK LevX': '{:.2%}', 'FD LevX': '{:.2%}'}
30
+
31
+ player_roo_format = {'Top_finish': '{:.2%}','Top_5_finish': '{:.2%}', 'Top_10_finish': '{:.2%}', '20+%': '{:.2%}', '2x%': '{:.2%}', '3x%': '{:.2%}',
32
+ '4x%': '{:.2%}','GPP%': '{:.2%}'}
33
+
34
+ all_dk_player_projections = 'https://docs.google.com/spreadsheets/d/1I_1Ve3F4tftgfLQQoRKOJ351XfEG48s36OxXUKxmgS8/edit#gid=1391856348'
35
+
36
+ @st.cache_data
37
+ def set_slate_teams():
38
+ sh = gc.open_by_url(all_dk_player_projections)
39
+ worksheet = sh.worksheet('Site_Info')
40
+ raw_display = pd.DataFrame(worksheet.get_all_records())
41
+
42
+ return raw_display
43
+
44
+ @st.cache_data
45
+ def player_stat_table():
46
+ sh = gc.open_by_url(all_dk_player_projections)
47
+ worksheet = sh.worksheet('Player_Projections')
48
+ raw_display = pd.DataFrame(worksheet.get_all_records())
49
+
50
+ return raw_display
51
+
52
+ @st.cache_data
53
+ def load_dk_player_projections():
54
+ sh = gc.open_by_url(all_dk_player_projections)
55
+ worksheet = sh.worksheet('DK_ROO')
56
+ load_display = pd.DataFrame(worksheet.get_all_records())
57
+ load_display.replace('', np.nan, inplace=True)
58
+ raw_display = load_display.dropna(subset=['Median'])
59
+
60
+ return raw_display
61
+
62
+ @st.cache_data
63
+ def load_fd_player_projections():
64
+ sh = gc.open_by_url(all_dk_player_projections)
65
+ worksheet = sh.worksheet('FD_ROO')
66
+ load_display = pd.DataFrame(worksheet.get_all_records())
67
+ load_display.replace('', np.nan, inplace=True)
68
+ raw_display = load_display.dropna(subset=['Median'])
69
+
70
+ return raw_display
71
+
72
+ @st.cache_data
73
+ def load_dk_stacks():
74
+ sh = gc.open_by_url(all_dk_player_projections)
75
+ worksheet = sh.worksheet('DK_Stacks')
76
+ load_display = pd.DataFrame(worksheet.get_all_records())
77
+ raw_display = load_display
78
+
79
+ return raw_display
80
+
81
+ @st.cache_data
82
+ def load_fd_stacks():
83
+ sh = gc.open_by_url(all_dk_player_projections)
84
+ worksheet = sh.worksheet('FD_Stacks')
85
+ load_display = pd.DataFrame(worksheet.get_all_records())
86
+ raw_display = load_display
87
+
88
+ return raw_display
89
+
90
+ @st.cache_data
91
+ def convert_df_to_csv(df):
92
+ return df.to_csv().encode('utf-8')
93
+
94
+ player_stats = player_stat_table()
95
+ dk_stacks_raw = load_dk_stacks()
96
+ fd_stacks_raw = load_fd_stacks()
97
+ dk_roo_raw = load_dk_player_projections()
98
+ fd_roo_raw = load_fd_player_projections()
99
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
100
+ site_slates = set_slate_teams()
101
+
102
+ tab1, tab2, tab3, tab4, tab5, tab6 = st.tabs(["Team Stacks Range of Outcomes", "Overall Range of Outcomes", "QB Range of Outcomes", "RB Range of Outcomes", "WR Range of Outcomes", "TE Range of Outcomes"])
103
+
104
+ with tab1:
105
+ col1, col2 = st.columns([1, 5])
106
+ with col1:
107
+ st.info(t_stamp)
108
+ if st.button("Load/Reset Data", key='reset1'):
109
+ st.cache_data.clear()
110
+ player_stats = player_stat_table()
111
+ dk_stacks_raw = load_dk_stacks()
112
+ fd_stacks_raw = load_fd_stacks()
113
+ dk_roo_raw = load_dk_player_projections()
114
+ fd_roo_raw = load_fd_player_projections()
115
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
116
+ site_slates = set_slate_teams()
117
+ slate_var1 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var1')
118
+ site_var1 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var1')
119
+ custom_var1 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var1')
120
+ if custom_var1 == 'No':
121
+ if site_var1 == 'Draftkings':
122
+ raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)]
123
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
124
+ raw_baselines = raw_baselines.iloc[:,:-2]
125
+ elif site_var1 == 'Fanduel':
126
+ raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)]
127
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
128
+ raw_baselines = raw_baselines.iloc[:,:-2]
129
+ split_var1 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var1')
130
+ if split_var1 == 'Specific Games':
131
+ team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1')
132
+ elif split_var1 == 'Full Slate Run':
133
+ team_var1 = raw_baselines.Team.values.tolist()
134
+ if custom_var1 == 'Yes':
135
+ contest_var1 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var1')
136
+ if site_var1 == 'Draftkings':
137
+ raw_baselines = dk_stacks_raw[dk_stacks_raw['slate'] == str(slate_var1)]
138
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
139
+ elif site_var1 == 'Fanduel':
140
+ raw_baselines = fd_stacks_raw[fd_stacks_raw['slate'] == str(slate_var1)]
141
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
142
+ split_var1 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var1')
143
+ if split_var1 == 'Specific Games':
144
+ team_var1 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var1')
145
+ elif split_var1 == 'Full Slate Run':
146
+ team_var1 = raw_baselines.Team.values.tolist()
147
+
148
+
149
+ with col2:
150
+ if custom_var1 == 'No':
151
+ final_stacks = raw_baselines[raw_baselines['Team'].isin(team_var1)]
152
+ st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
153
+ st.download_button(
154
+ label="Export Tables",
155
+ data=convert_df_to_csv(final_stacks),
156
+ file_name='NFL_stacks_export.csv',
157
+ mime='text/csv',
158
+ )
159
+ elif custom_var1 == 'Yes':
160
+ hold_container = st.empty()
161
+ if st.button('Create Range of Outcomes for Slate'):
162
+ with hold_container:
163
+ if site_var1 == 'Draftkings':
164
+ working_roo = player_stats
165
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
166
+ working_roo.replace('', 0, inplace=True)
167
+ if site_var1 == 'Fanduel':
168
+ working_roo = player_stats
169
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
170
+ working_roo.replace('', 0, inplace=True)
171
+ working_roo = working_roo[working_roo['Team'].isin(team_var1)]
172
+
173
+ total_sims = 1000
174
+
175
+ salary_dict = dict(zip(working_roo.name, working_roo.Salary))
176
+ own_dict = dict(zip(working_roo.name, working_roo.Own))
177
+ fantasy_dict = dict(zip(working_roo.name, working_roo.Fantasy))
178
+
179
+ QB_group = working_roo.loc[working_roo['Position'] == 'QB']
180
+ stacks_df = pd.DataFrame(columns=['Team','QB', 'WR1', 'WR2_TE'])
181
+
182
+ for stack in range(0,len(QB_group)):
183
+ team_var = QB_group.iat[stack,1]
184
+ WR_group_1 = working_roo.loc[working_roo['Position'] == 'WR']
185
+ WR_group_2 = WR_group_1.loc[working_roo['Team'] == team_var]
186
+ TE_group_1 = working_roo.loc[working_roo['Position'] == 'TE']
187
+ TE_group_2 = TE_group_1.loc[working_roo['Team'] == team_var]
188
+ cur_list = []
189
+ qb_piece = QB_group.iat[stack,0]
190
+ wr_piece = WR_group_2.iat[0,0]
191
+ te_piece = TE_group_2.iat[0,0]
192
+ cur_list.append(team_var)
193
+ cur_list.append(qb_piece)
194
+ cur_list.append(wr_piece)
195
+ cur_list.append(te_piece)
196
+ stacks_df.loc[len(stacks_df)] = cur_list
197
+ cur_list = []
198
+ qb_piece = QB_group.iat[stack,0]
199
+ wr_piece = WR_group_2.iat[1,0]
200
+ te_piece = TE_group_2.iat[0,0]
201
+ cur_list.append(team_var)
202
+ cur_list.append(qb_piece)
203
+ cur_list.append(wr_piece)
204
+ cur_list.append(te_piece)
205
+ stacks_df.loc[len(stacks_df)] = cur_list
206
+ cur_list = []
207
+ qb_piece = QB_group.iat[stack,0]
208
+ wr_piece = WR_group_2.iat[0,0]
209
+ te_piece = WR_group_2.iat[1,0]
210
+ cur_list.append(team_var)
211
+ cur_list.append(qb_piece)
212
+ cur_list.append(wr_piece)
213
+ cur_list.append(te_piece)
214
+ stacks_df.loc[len(stacks_df)] = cur_list
215
+
216
+ stacks_df['Salary'] = sum([stacks_df['QB'].map(salary_dict),
217
+ stacks_df['WR1'].map(salary_dict),
218
+ stacks_df['WR2_TE'].map(salary_dict)])
219
+
220
+ stacks_df['Fantasy'] = sum([stacks_df['QB'].map(fantasy_dict),
221
+ stacks_df['WR1'].map(fantasy_dict),
222
+ stacks_df['WR2_TE'].map(fantasy_dict)])
223
+
224
+ stacks_df['Own'] = sum([stacks_df['QB'].map(own_dict),
225
+ stacks_df['WR1'].map(own_dict),
226
+ stacks_df['WR2_TE'].map(own_dict)])
227
+
228
+ stacks_df['team_combo'] = stacks_df['Team'] + " " + stacks_df['QB'] + " " + stacks_df['WR1'] + " " + stacks_df['WR2_TE']
229
+
230
+ own_dict = dict(zip(stacks_df.team_combo, stacks_df.Own))
231
+ qb_dict = dict(zip(stacks_df.team_combo, stacks_df.QB))
232
+ wr1_dict = dict(zip(stacks_df.team_combo, stacks_df.WR1))
233
+ wr2_dict = dict(zip(stacks_df.team_combo, stacks_df.WR2_TE))
234
+ team_dict = dict(zip(stacks_df.team_combo, stacks_df.Team))
235
+
236
+ flex_file = stacks_df[['team_combo', 'Salary', 'Fantasy']]
237
+ flex_file.rename(columns={"Fantasy": "Median"}, inplace = True)
238
+ flex_file['Floor'] = flex_file['Median']*.25
239
+ flex_file['Ceiling'] = flex_file['Median'] + flex_file['Floor']
240
+ flex_file['STD'] = flex_file['Median']/4
241
+ flex_file = flex_file[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
242
+ hold_file = flex_file
243
+ overall_file = flex_file
244
+ salary_file = flex_file
245
+
246
+ overall_players = overall_file[['team_combo']]
247
+
248
+ for x in range(0,total_sims):
249
+ salary_file[x] = salary_file['Salary']
250
+
251
+ salary_file=salary_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
252
+ salary_file.astype('int').dtypes
253
+
254
+ salary_file = salary_file.div(1000)
255
+
256
+ for x in range(0,total_sims):
257
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
258
+
259
+ overall_file=overall_file.drop(['team_combo', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
260
+ overall_file.astype('int').dtypes
261
+
262
+ players_only = hold_file[['team_combo']]
263
+ raw_lineups_file = players_only
264
+
265
+ for x in range(0,total_sims):
266
+ maps_dict = {'proj_map':dict(zip(hold_file.team_combo,hold_file[x]))}
267
+ raw_lineups_file[x] = sum([raw_lineups_file['team_combo'].map(maps_dict['proj_map'])])
268
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
269
+
270
+ players_only=players_only.drop(['team_combo'], axis=1)
271
+ players_only.astype('int').dtypes
272
+
273
+ salary_2x_check = (overall_file - (salary_file*2))
274
+ salary_3x_check = (overall_file - (salary_file*3))
275
+ salary_4x_check = (overall_file - (salary_file*4))
276
+
277
+ players_only['Average_Rank'] = players_only.mean(axis=1)
278
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
279
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
280
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
281
+ players_only['60+%'] = overall_file[overall_file >= 60].count(axis=1)/float(total_sims)
282
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
283
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
284
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
285
+
286
+ players_only['team_combo'] = hold_file[['team_combo']]
287
+
288
+ final_outcomes = players_only[['team_combo', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']]
289
+
290
+ final_stacks = pd.merge(hold_file, final_outcomes, on="team_combo")
291
+ final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%']]
292
+ final_stacks['Own'] = final_stacks['team_combo'].map(own_dict)
293
+ final_stacks = final_stacks[['team_combo', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own']]
294
+ final_stacks['Projection Rank'] = final_stacks.Median.rank(pct = True)
295
+ final_stacks['Own Rank'] = final_stacks.Own.rank(pct = True)
296
+ final_stacks['LevX'] = final_stacks['Projection Rank'] - final_stacks['Own Rank']
297
+ final_stacks['Team'] = final_stacks['team_combo'].map(team_dict)
298
+ final_stacks['QB'] = final_stacks['team_combo'].map(qb_dict)
299
+ final_stacks['WR1_TE'] = final_stacks['team_combo'].map(wr1_dict)
300
+ final_stacks['WR2_TE'] = final_stacks['team_combo'].map(wr2_dict)
301
+
302
+ final_stacks = final_stacks[['Team', 'QB', 'WR1_TE', 'WR2_TE', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish',
303
+ 'Top_10_finish', '60+%', '2x%', '3x%', '4x%', 'Own', 'LevX']]
304
+
305
+ final_stacks = final_stacks.sort_values(by='Median', ascending=False)
306
+
307
+ with hold_container:
308
+ hold_container = st.empty()
309
+ final_stacks = final_stacks
310
+ st.dataframe(final_stacks.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
311
+
312
+ st.download_button(
313
+ label="Export Tables",
314
+ data=convert_df_to_csv(final_stacks),
315
+ file_name='Custom_NFL_stacks_export.csv',
316
+ mime='text/csv',
317
+ )
318
+
319
+ with tab2:
320
+ col1, col2 = st.columns([1, 5])
321
+ with col1:
322
+ st.info(t_stamp)
323
+ if st.button("Load/Reset Data", key='reset2'):
324
+ st.cache_data.clear()
325
+ player_stats = player_stat_table()
326
+ dk_stacks_raw = load_dk_stacks()
327
+ fd_stacks_raw = load_fd_stacks()
328
+ dk_roo_raw = load_dk_player_projections()
329
+ fd_roo_raw = load_fd_player_projections()
330
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
331
+ site_slates = set_slate_teams()
332
+ slate_var2 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var2')
333
+ site_var2 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var2')
334
+ custom_var2 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var2')
335
+ if custom_var2 == 'No':
336
+ if site_var2 == 'Draftkings':
337
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)]
338
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
339
+ raw_baselines = raw_baselines.iloc[:,:-2]
340
+ elif site_var2 == 'Fanduel':
341
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)]
342
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
343
+ raw_baselines = raw_baselines.iloc[:,:-2]
344
+ split_var2 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var2')
345
+ if split_var2 == 'Specific Games':
346
+ team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2')
347
+ elif split_var2 == 'Full Slate Run':
348
+ team_var2 = raw_baselines.Team.values.tolist()
349
+ pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2')
350
+ if pos_split2 == 'Specific Positions':
351
+ pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE'])
352
+ elif pos_split2 == 'All Positions':
353
+ pos_var2 = 'All'
354
+ sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var2')
355
+ if custom_var2 == 'Yes':
356
+ contest_var2 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var2')
357
+ if site_var2 == 'Draftkings':
358
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var2)]
359
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
360
+ elif site_var2 == 'Fanduel':
361
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var2)]
362
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'overall']
363
+ split_var2 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var2')
364
+ if split_var2 == 'Specific Games':
365
+ team_var2 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var2')
366
+ elif split_var2 == 'Full Slate Run':
367
+ team_var2 = raw_baselines.Team.values.tolist()
368
+ pos_split2 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split2')
369
+ if pos_split2 == 'Specific Positions':
370
+ pos_var2 = st.multiselect('What Positions would you like to view?', options = ['QB', 'RB', 'WR', 'TE'])
371
+ elif pos_split2 == 'All Positions':
372
+ pos_var2 = 'All'
373
+ sal_var2 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var2')
374
+
375
+
376
+ with col2:
377
+ if custom_var2 == 'No':
378
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var2)]
379
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var2[0]]
380
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var2[1]]
381
+ if pos_var2 != 'All':
382
+ final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var2))]
383
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
384
+ final_Proj = final_Proj.set_index('Player')
385
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
386
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
387
+ st.download_button(
388
+ label="Export Tables",
389
+ data=convert_df_to_csv(final_Proj),
390
+ file_name='NFL_overall_export.csv',
391
+ mime='text/csv',
392
+ )
393
+ elif custom_var2 == 'Yes':
394
+ hold_container = st.empty()
395
+ if st.button('Create Range of Outcomes for Slate'):
396
+ with hold_container:
397
+ if site_var2 == 'Draftkings':
398
+ working_roo = player_stats
399
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
400
+ working_roo.replace('', 0, inplace=True)
401
+ if site_var2 == 'Fanduel':
402
+ working_roo = player_stats
403
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
404
+ working_roo.replace('', 0, inplace=True)
405
+ working_roo = working_roo[working_roo['Team'].isin(team_var2)]
406
+ working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]]
407
+ working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]]
408
+ own_dict = dict(zip(working_roo.Player, working_roo.Own))
409
+ team_dict = dict(zip(working_roo.Player, working_roo.Team))
410
+ opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
411
+ total_sims = 1000
412
+
413
+ flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
414
+ flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
415
+ flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
416
+ flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
417
+ flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions']
418
+ flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
419
+ hold_file = flex_file
420
+ overall_file = flex_file
421
+ salary_file = flex_file
422
+
423
+ overall_players = overall_file[['Player']]
424
+
425
+ for x in range(0,total_sims):
426
+ salary_file[x] = salary_file['Salary']
427
+
428
+ salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
429
+ salary_file.astype('int').dtypes
430
+
431
+ salary_file = salary_file.div(1000)
432
+
433
+ for x in range(0,total_sims):
434
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
435
+
436
+ overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
437
+ overall_file.astype('int').dtypes
438
+
439
+ players_only = hold_file[['Player']]
440
+ raw_lineups_file = players_only
441
+
442
+ for x in range(0,total_sims):
443
+ maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
444
+ raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
445
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
446
+
447
+ players_only=players_only.drop(['Player'], axis=1)
448
+ players_only.astype('int').dtypes
449
+
450
+ salary_2x_check = (overall_file - (salary_file*2))
451
+ salary_3x_check = (overall_file - (salary_file*3))
452
+ salary_4x_check = (overall_file - (salary_file*4))
453
+
454
+ players_only['Average_Rank'] = players_only.mean(axis=1)
455
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
456
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
457
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
458
+ players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
459
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
460
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
461
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
462
+
463
+ players_only['Player'] = hold_file[['Player']]
464
+
465
+ final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
466
+
467
+ final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
468
+ final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
469
+ final_Proj['Own'] = final_Proj['Player'].map(own_dict)
470
+ final_Proj['Team'] = final_Proj['Player'].map(team_dict)
471
+ final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
472
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
473
+ final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
474
+ final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
475
+ final_Proj['LevX'] = 0
476
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
477
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
478
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX'])
479
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
480
+ final_Proj['CPT_Own'] = final_Proj['Own'] / 4
481
+
482
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
483
+ final_Proj = final_Proj.set_index('Player')
484
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
485
+
486
+ with hold_container:
487
+ hold_container = st.empty()
488
+ final_Proj = final_Proj
489
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
490
+
491
+ st.download_button(
492
+ label="Export Tables",
493
+ data=convert_df_to_csv(final_Proj),
494
+ file_name='Custom_NFL_overall_export.csv',
495
+ mime='text/csv',
496
+ )
497
+
498
+ with tab3:
499
+ col1, col2 = st.columns([1, 5])
500
+ with col1:
501
+ st.info(t_stamp)
502
+ if st.button("Load/Reset Data", key='reset3'):
503
+ st.cache_data.clear()
504
+ player_stats = player_stat_table()
505
+ dk_stacks_raw = load_dk_stacks()
506
+ fd_stacks_raw = load_fd_stacks()
507
+ dk_roo_raw = load_dk_player_projections()
508
+ fd_roo_raw = load_fd_player_projections()
509
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
510
+ site_slates = set_slate_teams()
511
+ slate_var3 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var3')
512
+ site_var3 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var3')
513
+ custom_var3 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var3')
514
+ if custom_var3 == 'No':
515
+ if site_var3 == 'Draftkings':
516
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)]
517
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs']
518
+ raw_baselines = raw_baselines.iloc[:,:-3]
519
+ elif site_var3 == 'Fanduel':
520
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)]
521
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs']
522
+ raw_baselines = raw_baselines.iloc[:,:-3]
523
+ split_var3 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var3')
524
+ if split_var3 == 'Specific Games':
525
+ team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3')
526
+ elif split_var3 == 'Full Slate Run':
527
+ team_var3 = raw_baselines.Team.values.tolist()
528
+ pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3')
529
+ if pos_split3 == 'Specific Positions':
530
+ pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB'], key='pos_var3')
531
+ elif pos_split3 == 'All Positions':
532
+ pos_var3 = 'All'
533
+ sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var3')
534
+ if custom_var3 == 'Yes':
535
+ contest_var3 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var3')
536
+ if site_var3 == 'Draftkings':
537
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var3)]
538
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_qbs']
539
+ raw_baselines = raw_baselines.iloc[:,:-3]
540
+ elif site_var3 == 'Fanduel':
541
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var3)]
542
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_qbs']
543
+ raw_baselines = raw_baselines.iloc[:,:-3]
544
+ split_var3 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var3')
545
+ if split_var3 == 'Specific Games':
546
+ team_var3 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var3')
547
+ elif split_var3 == 'Full Slate Run':
548
+ team_var3 = raw_baselines.Team.values.tolist()
549
+ pos_split3 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split3')
550
+ if pos_split3 == 'Specific Positions':
551
+ pos_var3 = st.multiselect('What Positions would you like to view?', options = ['QB'])
552
+ elif pos_split3 == 'All Positions':
553
+ pos_var3 = 'All'
554
+ sal_var3 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var3')
555
+
556
+
557
+ with col2:
558
+ if custom_var3 == 'No':
559
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var3)]
560
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var3[0]]
561
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var3[1]]
562
+ if pos_var3 != 'All':
563
+ final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var3))]
564
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
565
+ final_Proj = final_Proj.set_index('Player')
566
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
567
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
568
+ st.download_button(
569
+ label="Export Tables",
570
+ data=convert_df_to_csv(final_Proj),
571
+ file_name='NFL_qb_export.csv',
572
+ mime='text/csv',
573
+ )
574
+ elif custom_var3 == 'Yes':
575
+ hold_container = st.empty()
576
+ if st.button('Create Range of Outcomes for Slate'):
577
+ with hold_container:
578
+ if site_var3 == 'Draftkings':
579
+ working_roo = player_stats
580
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
581
+ working_roo.replace('', 0, inplace=True)
582
+ working_roo = working_roo[working_roo['Position'] == 'QB']
583
+ if site_var3 == 'Fanduel':
584
+ working_roo = player_stats
585
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
586
+ working_roo.replace('', 0, inplace=True)
587
+ working_roo = working_roo[working_roo['Position'] == 'QB']
588
+ working_roo = working_roo[working_roo['Team'].isin(team_var3)]
589
+ working_roo = working_roo[working_roo['Salary'] >= sal_var2[0]]
590
+ working_roo = working_roo[working_roo['Salary'] <= sal_var2[1]]
591
+ own_dict = dict(zip(working_roo.Player, working_roo.Own))
592
+ team_dict = dict(zip(working_roo.Player, working_roo.Team))
593
+ opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
594
+ total_sims = 1000
595
+
596
+ flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
597
+ flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
598
+ flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
599
+ flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
600
+ flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions']
601
+ flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
602
+ hold_file = flex_file
603
+ overall_file = flex_file
604
+ salary_file = flex_file
605
+
606
+ overall_players = overall_file[['Player']]
607
+
608
+ for x in range(0,total_sims):
609
+ salary_file[x] = salary_file['Salary']
610
+
611
+ salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
612
+ salary_file.astype('int').dtypes
613
+
614
+ salary_file = salary_file.div(1000)
615
+
616
+ for x in range(0,total_sims):
617
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
618
+
619
+ overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
620
+ overall_file.astype('int').dtypes
621
+
622
+ players_only = hold_file[['Player']]
623
+ raw_lineups_file = players_only
624
+
625
+ for x in range(0,total_sims):
626
+ maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
627
+ raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
628
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
629
+
630
+ players_only=players_only.drop(['Player'], axis=1)
631
+ players_only.astype('int').dtypes
632
+
633
+ salary_2x_check = (overall_file - (salary_file*2))
634
+ salary_3x_check = (overall_file - (salary_file*3))
635
+ salary_4x_check = (overall_file - (salary_file*4))
636
+
637
+ players_only['Average_Rank'] = players_only.mean(axis=1)
638
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
639
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
640
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
641
+ players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
642
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
643
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
644
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
645
+
646
+ players_only['Player'] = hold_file[['Player']]
647
+
648
+ final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
649
+
650
+ final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
651
+ final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
652
+ final_Proj['Own'] = final_Proj['Player'].map(own_dict)
653
+ final_Proj['Team'] = final_Proj['Player'].map(team_dict)
654
+ final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
655
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
656
+ final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
657
+ final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
658
+ final_Proj['LevX'] = 0
659
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
660
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
661
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX'])
662
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
663
+ final_Proj['CPT_Own'] = final_Proj['Own'] / 4
664
+
665
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
666
+ final_Proj = final_Proj.set_index('Player')
667
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
668
+
669
+ with hold_container:
670
+ hold_container = st.empty()
671
+ final_Proj = final_Proj
672
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
673
+
674
+ st.download_button(
675
+ label="Export Tables",
676
+ data=convert_df_to_csv(final_Proj),
677
+ file_name='Custom_NFL_qb_export.csv',
678
+ mime='text/csv',
679
+ )
680
+
681
+ with tab4:
682
+ col1, col2 = st.columns([1, 5])
683
+ with col1:
684
+ st.info(t_stamp)
685
+ if st.button("Load/Reset Data", key='reset4'):
686
+ st.cache_data.clear()
687
+ player_stats = player_stat_table()
688
+ dk_stacks_raw = load_dk_stacks()
689
+ fd_stacks_raw = load_fd_stacks()
690
+ dk_roo_raw = load_dk_player_projections()
691
+ fd_roo_raw = load_fd_player_projections()
692
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
693
+ site_slates = set_slate_teams()
694
+ slate_var4 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var4')
695
+ site_var4 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var4')
696
+ custom_var4 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var4')
697
+ if custom_var4 == 'No':
698
+ if site_var4 == 'Draftkings':
699
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)]
700
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs']
701
+ raw_baselines = raw_baselines.iloc[:,:-3]
702
+ elif site_var4 == 'Fanduel':
703
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)]
704
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs']
705
+ raw_baselines = raw_baselines.iloc[:,:-3]
706
+ split_var4 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var4')
707
+ if split_var4 == 'Specific Games':
708
+ team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4')
709
+ elif split_var4 == 'Full Slate Run':
710
+ team_var4 = raw_baselines.Team.values.tolist()
711
+ pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4')
712
+ if pos_split4 == 'Specific Positions':
713
+ pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB'], key='pos_var4')
714
+ elif pos_split4 == 'All Positions':
715
+ pos_var4 = 'All'
716
+ sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var4')
717
+ if custom_var4 == 'Yes':
718
+ contest_var4 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var4')
719
+ if site_var4 == 'Draftkings':
720
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var4)]
721
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_rbs']
722
+ elif site_var4 == 'Fanduel':
723
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var4)]
724
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_rbs']
725
+ split_var4 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var4')
726
+ if split_var4 == 'Specific Games':
727
+ team_var4 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var4')
728
+ elif split_var4 == 'Full Slate Run':
729
+ team_var4 = raw_baselines.Team.values.tolist()
730
+ pos_split4 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split4')
731
+ if pos_split4 == 'Specific Positions':
732
+ pos_var4 = st.multiselect('What Positions would you like to view?', options = ['RB'])
733
+ elif pos_split4 == 'All Positions':
734
+ pos_var4 = 'All'
735
+ sal_var4 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var4')
736
+
737
+
738
+ with col2:
739
+ if custom_var4 == 'No':
740
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var4)]
741
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var4[0]]
742
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var4[1]]
743
+ if pos_var4 != 'All':
744
+ final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var4))]
745
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
746
+ final_Proj = final_Proj.set_index('Player')
747
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
748
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
749
+ st.download_button(
750
+ label="Export Tables",
751
+ data=convert_df_to_csv(final_Proj),
752
+ file_name='NFL_rb_export.csv',
753
+ mime='text/csv',
754
+ )
755
+ elif custom_var4 == 'Yes':
756
+ hold_container = st.empty()
757
+ if st.button('Create Range of Outcomes for Slate'):
758
+ with hold_container:
759
+ if site_var4 == 'Draftkings':
760
+ working_roo = player_stats
761
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
762
+ working_roo.replace('', 0, inplace=True)
763
+ working_roo = working_roo[working_roo['Position'] == 'RB']
764
+ if site_var4 == 'Fanduel':
765
+ working_roo = player_stats
766
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
767
+ working_roo.replace('', 0, inplace=True)
768
+ working_roo = working_roo[working_roo['Position'] == 'RB']
769
+ working_roo = working_roo[working_roo['Team'].isin(team_var4)]
770
+ working_roo = working_roo[working_roo['Salary'] >= sal_var4[0]]
771
+ working_roo = working_roo[working_roo['Salary'] <= sal_var4[1]]
772
+ own_dict = dict(zip(working_roo.Player, working_roo.Own))
773
+ team_dict = dict(zip(working_roo.Player, working_roo.Team))
774
+ opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
775
+ total_sims = 1000
776
+
777
+ flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
778
+ flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
779
+ flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
780
+ flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
781
+ flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions']
782
+ flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
783
+ hold_file = flex_file
784
+ overall_file = flex_file
785
+ salary_file = flex_file
786
+
787
+ overall_players = overall_file[['Player']]
788
+
789
+ for x in range(0,total_sims):
790
+ salary_file[x] = salary_file['Salary']
791
+
792
+ salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
793
+ salary_file.astype('int').dtypes
794
+
795
+ salary_file = salary_file.div(1000)
796
+
797
+ for x in range(0,total_sims):
798
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
799
+
800
+ overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
801
+ overall_file.astype('int').dtypes
802
+
803
+ players_only = hold_file[['Player']]
804
+ raw_lineups_file = players_only
805
+
806
+ for x in range(0,total_sims):
807
+ maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
808
+ raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
809
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
810
+
811
+ players_only=players_only.drop(['Player'], axis=1)
812
+ players_only.astype('int').dtypes
813
+
814
+ salary_2x_check = (overall_file - (salary_file*2))
815
+ salary_3x_check = (overall_file - (salary_file*3))
816
+ salary_4x_check = (overall_file - (salary_file*4))
817
+
818
+ players_only['Average_Rank'] = players_only.mean(axis=1)
819
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
820
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
821
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
822
+ players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
823
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
824
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
825
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
826
+
827
+ players_only['Player'] = hold_file[['Player']]
828
+
829
+ final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
830
+
831
+ final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
832
+ final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
833
+ final_Proj['Own'] = final_Proj['Player'].map(own_dict)
834
+ final_Proj['Team'] = final_Proj['Player'].map(team_dict)
835
+ final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
836
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
837
+ final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
838
+ final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
839
+ final_Proj['LevX'] = 0
840
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
841
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
842
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX'])
843
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
844
+ final_Proj['CPT_Own'] = final_Proj['Own'] / 4
845
+
846
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
847
+ final_Proj = final_Proj.set_index('Player')
848
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
849
+
850
+ with hold_container:
851
+ hold_container = st.empty()
852
+ final_Proj = final_Proj
853
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
854
+
855
+ st.download_button(
856
+ label="Export Tables",
857
+ data=convert_df_to_csv(final_Proj),
858
+ file_name='Custom_NFL_rb_export.csv',
859
+ mime='text/csv',
860
+ )
861
+
862
+ with tab5:
863
+ col1, col2 = st.columns([1, 5])
864
+ with col1:
865
+ st.info(t_stamp)
866
+ if st.button("Load/Reset Data", key='reset5'):
867
+ st.cache_data.clear()
868
+ player_stats = player_stat_table()
869
+ dk_stacks_raw = load_dk_stacks()
870
+ fd_stacks_raw = load_fd_stacks()
871
+ dk_roo_raw = load_dk_player_projections()
872
+ fd_roo_raw = load_fd_player_projections()
873
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
874
+ site_slates = set_slate_teams()
875
+ slate_var5 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var5')
876
+ site_var5 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var5')
877
+ custom_var5 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var5')
878
+ if custom_var5 == 'No':
879
+ if site_var5 == 'Draftkings':
880
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)]
881
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs']
882
+ raw_baselines = raw_baselines.iloc[:,:-3]
883
+ elif site_var5 == 'Fanduel':
884
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)]
885
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs']
886
+ raw_baselines = raw_baselines.iloc[:,:-3]
887
+ split_var5 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var5')
888
+ if split_var5 == 'Specific Games':
889
+ team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5')
890
+ elif split_var5 == 'Full Slate Run':
891
+ team_var5 = raw_baselines.Team.values.tolist()
892
+ pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5')
893
+ if pos_split5 == 'Specific Positions':
894
+ pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR'], key='pos_var5')
895
+ elif pos_split5 == 'All Positions':
896
+ pos_var5 = 'All'
897
+ sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var5')
898
+ if custom_var5 == 'Yes':
899
+ contest_var5 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var5')
900
+ if site_var5 == 'Draftkings':
901
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var5)]
902
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_wrs']
903
+ elif site_var5 == 'Fanduel':
904
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var5)]
905
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_wrs']
906
+ split_var5 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var5')
907
+ if split_var5 == 'Specific Games':
908
+ team_var5 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var5')
909
+ elif split_var5 == 'Full Slate Run':
910
+ team_var5 = raw_baselines.Team.values.tolist()
911
+ pos_split5 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split5')
912
+ if pos_split5 == 'Specific Positions':
913
+ pos_var5 = st.multiselect('What Positions would you like to view?', options = ['WR'])
914
+ elif pos_split5 == 'All Positions':
915
+ pos_var5 = 'All'
916
+ sal_var5 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var5')
917
+
918
+
919
+ with col2:
920
+ if custom_var5 == 'No':
921
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var5)]
922
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var5[0]]
923
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var5[1]]
924
+ if pos_var5 != 'All':
925
+ final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var5))]
926
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
927
+ final_Proj = final_Proj.set_index('Player')
928
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
929
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
930
+ st.download_button(
931
+ label="Export Tables",
932
+ data=convert_df_to_csv(final_Proj),
933
+ file_name='NFL_wr_export.csv',
934
+ mime='text/csv',
935
+ )
936
+ elif custom_var5 == 'Yes':
937
+ hold_container = st.empty()
938
+ if st.button('Create Range of Outcomes for Slate'):
939
+ with hold_container:
940
+ if site_var5 == 'Draftkings':
941
+ working_roo = player_stats
942
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
943
+ working_roo.replace('', 0, inplace=True)
944
+ working_roo = working_roo[working_roo['Position'] == 'WR']
945
+ if site_var5 == 'Fanduel':
946
+ working_roo = player_stats
947
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
948
+ working_roo.replace('', 0, inplace=True)
949
+ working_roo = working_roo[working_roo['Position'] == 'WR']
950
+ working_roo = working_roo[working_roo['Team'].isin(team_var5)]
951
+ working_roo = working_roo[working_roo['Salary'] >= sal_var5[0]]
952
+ working_roo = working_roo[working_roo['Salary'] <= sal_var5[1]]
953
+ own_dict = dict(zip(working_roo.Player, working_roo.Own))
954
+ team_dict = dict(zip(working_roo.Player, working_roo.Team))
955
+ opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
956
+ total_sims = 1000
957
+
958
+ flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
959
+ flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
960
+ flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
961
+ flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
962
+ flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions']
963
+ flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
964
+ hold_file = flex_file
965
+ overall_file = flex_file
966
+ salary_file = flex_file
967
+
968
+ overall_players = overall_file[['Player']]
969
+
970
+ for x in range(0,total_sims):
971
+ salary_file[x] = salary_file['Salary']
972
+
973
+ salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
974
+ salary_file.astype('int').dtypes
975
+
976
+ salary_file = salary_file.div(1000)
977
+
978
+ for x in range(0,total_sims):
979
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
980
+
981
+ overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
982
+ overall_file.astype('int').dtypes
983
+
984
+ players_only = hold_file[['Player']]
985
+ raw_lineups_file = players_only
986
+
987
+ for x in range(0,total_sims):
988
+ maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
989
+ raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
990
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
991
+
992
+ players_only=players_only.drop(['Player'], axis=1)
993
+ players_only.astype('int').dtypes
994
+
995
+ salary_2x_check = (overall_file - (salary_file*2))
996
+ salary_3x_check = (overall_file - (salary_file*3))
997
+ salary_4x_check = (overall_file - (salary_file*4))
998
+
999
+ players_only['Average_Rank'] = players_only.mean(axis=1)
1000
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
1001
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
1002
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
1003
+ players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
1004
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
1005
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
1006
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
1007
+
1008
+ players_only['Player'] = hold_file[['Player']]
1009
+
1010
+ final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
1011
+
1012
+ final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
1013
+ final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
1014
+ final_Proj['Own'] = final_Proj['Player'].map(own_dict)
1015
+ final_Proj['Team'] = final_Proj['Player'].map(team_dict)
1016
+ final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
1017
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
1018
+ final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
1019
+ final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
1020
+ final_Proj['LevX'] = 0
1021
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1022
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1023
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1024
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1025
+ final_Proj['CPT_Own'] = final_Proj['Own'] / 4
1026
+
1027
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
1028
+ final_Proj = final_Proj.set_index('Player')
1029
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
1030
+
1031
+ with hold_container:
1032
+ hold_container = st.empty()
1033
+ final_Proj = final_Proj
1034
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
1035
+
1036
+ st.download_button(
1037
+ label="Export Tables",
1038
+ data=convert_df_to_csv(final_Proj),
1039
+ file_name='Custom_NFL_wr_export.csv',
1040
+ mime='text/csv',
1041
+ )
1042
+
1043
+ with tab6:
1044
+ col1, col2 = st.columns([1, 5])
1045
+ with col1:
1046
+ st.info(t_stamp)
1047
+ if st.button("Load/Reset Data", key='reset6'):
1048
+ st.cache_data.clear()
1049
+ player_stats = player_stat_table()
1050
+ dk_stacks_raw = load_dk_stacks()
1051
+ fd_stacks_raw = load_fd_stacks()
1052
+ dk_roo_raw = load_dk_player_projections()
1053
+ fd_roo_raw = load_fd_player_projections()
1054
+ t_stamp = f"Last Update: " + str(dk_roo_raw['timestamp'][0]) + f" CST"
1055
+ site_slates = set_slate_teams()
1056
+ slate_var6 = st.radio("Which data are you loading?", ('Main Slate', 'Secondary Slate', 'Thurs-Mon Slate'), key='slate_var6')
1057
+ site_var6 = st.radio("What table would you like to display?", ('Draftkings', 'Fanduel'), key='site_var6')
1058
+ custom_var6 = st.radio("Are you creating a custom table?", ('No', 'Yes'), key='custom_var6')
1059
+ if custom_var6 == 'No':
1060
+ if site_var6 == 'Draftkings':
1061
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)]
1062
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes']
1063
+ raw_baselines = raw_baselines.iloc[:,:-3]
1064
+ elif site_var6 == 'Fanduel':
1065
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)]
1066
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes']
1067
+ raw_baselines = raw_baselines.iloc[:,:-3]
1068
+ split_var6 = st.radio("Would you like to view the whole slate or just specific games?", ('Full Slate Run', 'Specific Games'), key='split_var6')
1069
+ if split_var6 == 'Specific Games':
1070
+ team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6')
1071
+ elif split_var6 == 'Full Slate Run':
1072
+ team_var6 = raw_baselines.Team.values.tolist()
1073
+ pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6')
1074
+ if pos_split6 == 'Specific Positions':
1075
+ pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE'], key='pos_var6')
1076
+ elif pos_split5 == 'All Positions':
1077
+ pos_var6 = 'All'
1078
+ sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var6')
1079
+ if custom_var6 == 'Yes':
1080
+ contest_var6 = st.selectbox("What contest type are you running for?", ('Cash', 'Small Field GPP', 'Large Field GPP'), key='contest_var6')
1081
+ if site_var6 == 'Draftkings':
1082
+ raw_baselines = dk_roo_raw[dk_roo_raw['slate'] == str(slate_var6)]
1083
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'dk_tes']
1084
+ elif site_var6 == 'Fanduel':
1085
+ raw_baselines = fd_roo_raw[fd_roo_raw['slate'] == str(slate_var6)]
1086
+ raw_baselines = raw_baselines[raw_baselines['version'] == 'fd_tes']
1087
+ split_var6 = st.radio("Are you running the full slate or certain games?", ('Full Slate Run', 'Specific Games'), key='split_var6')
1088
+ if split_var6 == 'Specific Games':
1089
+ team_var6 = st.multiselect('Which teams would you like to include in the ROO?', options = raw_baselines['Team'].unique(), key='team_var6')
1090
+ elif split_var6 == 'Full Slate Run':
1091
+ team_var6 = raw_baselines.Team.values.tolist()
1092
+ pos_split6 = st.radio("Are you viewing all positions, specific groups, or specific positions?", ('All Positions', 'Specific Positions'), key='pos_split6')
1093
+ if pos_split6 == 'Specific Positions':
1094
+ pos_var6 = st.multiselect('What Positions would you like to view?', options = ['TE'])
1095
+ elif pos_split6 == 'All Positions':
1096
+ pos_var6 = 'All'
1097
+ sal_var6 = st.slider("Is there a certain price range you want to view?", 2000, 10000, (2000, 10000), key='sal_var6')
1098
+
1099
+
1100
+ with col2:
1101
+ if custom_var6 == 'No':
1102
+ final_Proj = raw_baselines[raw_baselines['Team'].isin(team_var6)]
1103
+ final_Proj = final_Proj[final_Proj['Salary'] >= sal_var6[0]]
1104
+ final_Proj = final_Proj[final_Proj['Salary'] <= sal_var6[1]]
1105
+ if pos_var6 != 'All':
1106
+ final_Proj = raw_baselines[raw_baselines['Position'].str.contains('|'.join(pos_var6))]
1107
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
1108
+ final_Proj = final_Proj.set_index('Player')
1109
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
1110
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
1111
+ st.download_button(
1112
+ label="Export Tables",
1113
+ data=convert_df_to_csv(final_Proj),
1114
+ file_name='NFL_te_export.csv',
1115
+ mime='text/csv',
1116
+ )
1117
+ elif custom_var6 == 'Yes':
1118
+ hold_container = st.empty()
1119
+ if st.button('Create Range of Outcomes for Slate'):
1120
+ with hold_container:
1121
+ if site_var6 == 'Draftkings':
1122
+ working_roo = player_stats
1123
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "PPR": "Fantasy"}, inplace = True)
1124
+ working_roo.replace('', 0, inplace=True)
1125
+ working_roo = working_roo[working_roo['Position'] == 'TE']
1126
+ if site_var6 == 'Fanduel':
1127
+ working_roo = player_stats
1128
+ working_roo.rename(columns={"name": "Player", "rush_yards": "Rush Yards", "rec": "Receptions", "Half_PPR": "Fantasy"}, inplace = True)
1129
+ working_roo.replace('', 0, inplace=True)
1130
+ working_roo = working_roo[working_roo['Position'] == 'TE']
1131
+ working_roo = working_roo[working_roo['Team'].isin(team_var6)]
1132
+ working_roo = working_roo[working_roo['Salary'] >= sal_var6[0]]
1133
+ working_roo = working_roo[working_roo['Salary'] <= sal_var6[1]]
1134
+ own_dict = dict(zip(working_roo.Player, working_roo.Own))
1135
+ team_dict = dict(zip(working_roo.Player, working_roo.Team))
1136
+ opp_dict = dict(zip(working_roo.Player, working_roo.Opp))
1137
+ total_sims = 1000
1138
+
1139
+ flex_file = working_roo[['Player', 'Position', 'Salary', 'Fantasy', 'Rush Yards', 'Receptions']]
1140
+ flex_file.rename(columns={"Fantasy": "Median", "Pos": "Position"}, inplace = True)
1141
+ flex_file['Floor'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median']*.25) + (flex_file['Rush Yards']*.01),flex_file['Median']*.25)
1142
+ flex_file['Ceiling'] = np.where(flex_file['Position'] == 'QB',(flex_file['Median'] + flex_file['Floor']) + (flex_file['Rush Yards']*.01), flex_file['Median'] + flex_file['Floor'] + flex_file['Receptions'])
1143
+ flex_file['STD'] = (flex_file['Median']/4) + flex_file['Receptions']
1144
+ flex_file = flex_file[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD']]
1145
+ hold_file = flex_file
1146
+ overall_file = flex_file
1147
+ salary_file = flex_file
1148
+
1149
+ overall_players = overall_file[['Player']]
1150
+
1151
+ for x in range(0,total_sims):
1152
+ salary_file[x] = salary_file['Salary']
1153
+
1154
+ salary_file=salary_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
1155
+ salary_file.astype('int').dtypes
1156
+
1157
+ salary_file = salary_file.div(1000)
1158
+
1159
+ for x in range(0,total_sims):
1160
+ overall_file[x] = np.random.normal(overall_file['Median'],overall_file['STD'])
1161
+
1162
+ overall_file=overall_file.drop(['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'STD'], axis=1)
1163
+ overall_file.astype('int').dtypes
1164
+
1165
+ players_only = hold_file[['Player']]
1166
+ raw_lineups_file = players_only
1167
+
1168
+ for x in range(0,total_sims):
1169
+ maps_dict = {'proj_map':dict(zip(hold_file.Player,hold_file[x]))}
1170
+ raw_lineups_file[x] = sum([raw_lineups_file['Player'].map(maps_dict['proj_map'])])
1171
+ players_only[x] = raw_lineups_file[x].rank(ascending=False)
1172
+
1173
+ players_only=players_only.drop(['Player'], axis=1)
1174
+ players_only.astype('int').dtypes
1175
+
1176
+ salary_2x_check = (overall_file - (salary_file*2))
1177
+ salary_3x_check = (overall_file - (salary_file*3))
1178
+ salary_4x_check = (overall_file - (salary_file*4))
1179
+
1180
+ players_only['Average_Rank'] = players_only.mean(axis=1)
1181
+ players_only['Top_finish'] = players_only[players_only == 1].count(axis=1)/total_sims
1182
+ players_only['Top_5_finish'] = players_only[players_only <= 5].count(axis=1)/total_sims
1183
+ players_only['Top_10_finish'] = players_only[players_only <= 10].count(axis=1)/total_sims
1184
+ players_only['20+%'] = overall_file[overall_file >= 20].count(axis=1)/float(total_sims)
1185
+ players_only['2x%'] = salary_2x_check[salary_2x_check >= 1].count(axis=1)/float(total_sims)
1186
+ players_only['3x%'] = salary_3x_check[salary_3x_check >= 1].count(axis=1)/float(total_sims)
1187
+ players_only['4x%'] = salary_4x_check[salary_4x_check >= 1].count(axis=1)/float(total_sims)
1188
+
1189
+ players_only['Player'] = hold_file[['Player']]
1190
+
1191
+ final_outcomes = players_only[['Player', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
1192
+
1193
+ final_Proj = pd.merge(hold_file, final_outcomes, on="Player")
1194
+ final_Proj = final_Proj[['Player', 'Position', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%']]
1195
+ final_Proj['Own'] = final_Proj['Player'].map(own_dict)
1196
+ final_Proj['Team'] = final_Proj['Player'].map(team_dict)
1197
+ final_Proj['Opp'] = final_Proj['Player'].map(opp_dict)
1198
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own']]
1199
+ final_Proj['Projection Rank'] = final_Proj.Median.rank(pct = True)
1200
+ final_Proj['Own Rank'] = final_Proj.Own.rank(pct = True)
1201
+ final_Proj['LevX'] = 0
1202
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'QB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1203
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'TE', final_Proj[['Projection Rank', '2x%']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1204
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'RB', final_Proj[['Projection Rank', 'Top_5_finish']].mean(axis=1) + final_Proj['20+%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1205
+ final_Proj['LevX'] = np.where(final_Proj['Position'] == 'WR', final_Proj[['Projection Rank', 'Top_10_finish']].mean(axis=1) + final_Proj['4x%'] - final_Proj['Own Rank'], final_Proj['LevX'])
1206
+ final_Proj['CPT_Own'] = final_Proj['Own'] / 4
1207
+
1208
+ final_Proj = final_Proj[['Player', 'Position', 'Team', 'Opp', 'Salary', 'Floor', 'Median', 'Ceiling', 'Top_finish', 'Top_5_finish', 'Top_10_finish', '20+%', '2x%', '3x%', '4x%', 'Own', 'CPT_Own', 'LevX']]
1209
+ final_Proj = final_Proj.set_index('Player')
1210
+ final_Proj = final_Proj.sort_values(by='Median', ascending=False)
1211
+
1212
+ with hold_container:
1213
+ hold_container = st.empty()
1214
+ final_Proj = final_Proj
1215
+ st.dataframe(final_Proj.style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(player_roo_format, precision=2), use_container_width = True)
1216
+
1217
+ st.download_button(
1218
+ label="Export Tables",
1219
+ data=convert_df_to_csv(final_Proj),
1220
+ file_name='Custom_NFL_te_export.csv',
1221
+ mime='text/csv',
1222
+ )