James McCool commited on
Commit
76a14d5
·
1 Parent(s): 9509438

Update handbuilder lineup to use '4x%' instead of '2x%' for player statistics and adjust related calculations accordingly.

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +42 -24
src/streamlit_app.py CHANGED
@@ -638,7 +638,7 @@ if selected_tab == 'Handbuilder':
638
 
639
  # --- LINEUP STATE ---
640
  if 'handbuilder_lineup' not in st.session_state:
641
- st.session_state['handbuilder_lineup'] = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own'])
642
 
643
  # Count positions in the current lineup
644
  lineup = st.session_state['handbuilder_lineup']
@@ -673,14 +673,14 @@ if selected_tab == 'Handbuilder':
673
  handbuild_roo['Team'].isin(selected_teams)
674
  ][['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
675
  else:
676
- st.session_state['player_select_df'] = handbuild_roo[['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
677
 
678
  # If no teams selected, show all teams
679
  if pos_select3:
680
  position_mask_2 = handbuild_roo['Position'].apply(lambda x: any(pos in x for pos in pos_select3))
681
- st.session_state['player_select_df'] = st.session_state['player_select_df'][position_mask_2][['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
682
  else:
683
- st.session_state['player_select_df'] = st.session_state['player_select_df'][['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
684
 
685
  st.session_state['player_select_df'] = st.session_state['player_select_df'][st.session_state['player_select_df']['Salary'] <= salary_var]
686
 
@@ -757,7 +757,7 @@ if selected_tab == 'Handbuilder':
757
  # Add the slot info
758
  player_row = player_row.assign(Slot=slot_to_fill)
759
  st.session_state['handbuilder_lineup'] = pd.concat(
760
- [st.session_state['handbuilder_lineup'], player_row[['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own', 'Slot']]],
761
  ignore_index=True
762
  )
763
  st.success(f"Added {player_row['Player'].iloc[0]} to {slot_to_fill} slot")
@@ -794,7 +794,7 @@ if selected_tab == 'Handbuilder':
794
  'Team': row['Team'],
795
  'Salary': row['Salary'],
796
  'Median': row['Median'],
797
- '2x%': row['2x%'],
798
  'Own': row['Own']
799
  })
800
  else:
@@ -805,7 +805,7 @@ if selected_tab == 'Handbuilder':
805
  'Team': '',
806
  'Salary': np.nan,
807
  'Median': np.nan,
808
- '2x%': np.nan,
809
  'Own': np.nan
810
  })
811
 
@@ -822,7 +822,7 @@ if selected_tab == 'Handbuilder':
822
  if not filled_lineup.empty:
823
  total_salary = filled_lineup['Salary'].sum()
824
  total_median = filled_lineup['Median'].sum()
825
- avg_2x = filled_lineup['2x%'].mean()
826
  total_own = filled_lineup['Own'].sum()
827
  most_common_team = filled_lineup['Team'].mode()[0] if not filled_lineup['Team'].mode().empty else ""
828
 
@@ -833,7 +833,7 @@ if selected_tab == 'Handbuilder':
833
  'Team': [most_common_team],
834
  'Salary': [total_salary],
835
  'Median': [total_median],
836
- '2x%': [avg_2x],
837
  'Own': [total_own]
838
  })
839
  summary_row = summary_row[['Salary', 'Median', 'Own']].head(max_players)
@@ -898,7 +898,7 @@ if selected_tab == 'Handbuilder':
898
  clear_col, save_col, export_col, clear_saved_col, blank_col = st.columns([2, 2, 2, 2, 12])
899
  with clear_col:
900
  if st.button("Clear Lineup", key='clear_lineup_button'):
901
- st.session_state['handbuilder_lineup'] = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own', 'Slot'])
902
  # Clear the dataframe selections by resetting the previous selection state
903
  st.session_state['previous_player_selection'] = []
904
  # Force dataframe to re-render with new key to clear selections
@@ -1134,7 +1134,10 @@ if selected_tab == 'Optimals':
1134
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1135
  if site_var == 'Draftkings':
1136
  if type_var == 'Regular':
1137
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1138
  for col_idx in map_columns:
1139
  data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1140
  elif type_var == 'Showdown':
@@ -1143,7 +1146,10 @@ if selected_tab == 'Optimals':
1143
  data_export[col_idx] = data_export[col_idx].map(dk_sd_id_map)
1144
  elif site_var == 'Fanduel':
1145
  if type_var == 'Regular':
1146
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1147
  for col_idx in map_columns:
1148
  data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1149
  elif type_var == 'Showdown':
@@ -1169,12 +1175,12 @@ if selected_tab == 'Optimals':
1169
  with pm_opt_col:
1170
  if site_var == 'Draftkings':
1171
  if type_var == 'Regular':
1172
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1173
  elif type_var == 'Showdown':
1174
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1175
  elif site_var == 'Fanduel':
1176
  if type_var == 'Regular':
1177
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1178
  elif type_var == 'Showdown':
1179
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1180
  st.download_button(
@@ -1187,12 +1193,12 @@ if selected_tab == 'Optimals':
1187
 
1188
  if site_var == 'Draftkings':
1189
  if type_var == 'Regular':
1190
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1191
  elif type_var == 'Showdown':
1192
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1193
  elif site_var == 'Fanduel':
1194
  if type_var == 'Regular':
1195
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1196
  elif type_var == 'Showdown':
1197
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1198
  st.download_button(
@@ -1208,7 +1214,10 @@ if selected_tab == 'Optimals':
1208
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1209
  if site_var == 'Draftkings':
1210
  if type_var == 'Regular':
1211
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1212
  for col_idx in map_columns:
1213
  data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1214
  elif type_var == 'Showdown':
@@ -1218,7 +1227,10 @@ if selected_tab == 'Optimals':
1218
 
1219
  elif site_var == 'Fanduel':
1220
  if type_var == 'Regular':
1221
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1222
  for col_idx in map_columns:
1223
  data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1224
  elif type_var == 'Showdown':
@@ -1255,12 +1267,12 @@ if selected_tab == 'Optimals':
1255
  with pm_opt_col:
1256
  if site_var == 'Draftkings':
1257
  if type_var == 'Regular':
1258
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1259
  elif type_var == 'Showdown':
1260
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1261
  elif site_var == 'Fanduel':
1262
  if type_var == 'Regular':
1263
- data_export = data_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1264
  elif type_var == 'Showdown':
1265
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1266
  st.download_button(
@@ -1273,12 +1285,12 @@ if selected_tab == 'Optimals':
1273
 
1274
  if site_var == 'Draftkings':
1275
  if type_var == 'Regular':
1276
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1277
  elif type_var == 'Showdown':
1278
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1279
  elif site_var == 'Fanduel':
1280
  if type_var == 'Regular':
1281
- name_export = name_export.set_index('QB').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1282
  elif type_var == 'Showdown':
1283
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1284
  st.download_button(
@@ -1330,7 +1342,10 @@ if selected_tab == 'Optimals':
1330
  name_export = st.session_state.data_export_display.copy()
1331
  if site_var == 'Draftkings':
1332
  if type_var == 'Regular':
1333
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1334
  for col_idx in map_columns:
1335
  export_file[col_idx] = export_file[col_idx].map(dk_id_map)
1336
  elif type_var == 'Showdown':
@@ -1339,7 +1354,10 @@ if selected_tab == 'Optimals':
1339
  export_file[col_idx] = export_file[col_idx].map(dk_sd_id_map)
1340
  elif site_var == 'Fanduel':
1341
  if type_var == 'Regular':
1342
- map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
 
 
 
1343
  for col_idx in map_columns:
1344
  export_file[col_idx] = export_file[col_idx].map(fd_id_map)
1345
  elif type_var == 'Showdown':
 
638
 
639
  # --- LINEUP STATE ---
640
  if 'handbuilder_lineup' not in st.session_state:
641
+ st.session_state['handbuilder_lineup'] = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own'])
642
 
643
  # Count positions in the current lineup
644
  lineup = st.session_state['handbuilder_lineup']
 
673
  handbuild_roo['Team'].isin(selected_teams)
674
  ][['Player', 'Position', 'Team', 'Salary', 'Median', '2x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
675
  else:
676
+ st.session_state['player_select_df'] = handbuild_roo[['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
677
 
678
  # If no teams selected, show all teams
679
  if pos_select3:
680
  position_mask_2 = handbuild_roo['Position'].apply(lambda x: any(pos in x for pos in pos_select3))
681
+ st.session_state['player_select_df'] = st.session_state['player_select_df'][position_mask_2][['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
682
  else:
683
+ st.session_state['player_select_df'] = st.session_state['player_select_df'][['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own']].drop_duplicates(subset=['Player', 'Team']).copy()
684
 
685
  st.session_state['player_select_df'] = st.session_state['player_select_df'][st.session_state['player_select_df']['Salary'] <= salary_var]
686
 
 
757
  # Add the slot info
758
  player_row = player_row.assign(Slot=slot_to_fill)
759
  st.session_state['handbuilder_lineup'] = pd.concat(
760
+ [st.session_state['handbuilder_lineup'], player_row[['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own', 'Slot']]],
761
  ignore_index=True
762
  )
763
  st.success(f"Added {player_row['Player'].iloc[0]} to {slot_to_fill} slot")
 
794
  'Team': row['Team'],
795
  'Salary': row['Salary'],
796
  'Median': row['Median'],
797
+ '4x%': row['4x%'],
798
  'Own': row['Own']
799
  })
800
  else:
 
805
  'Team': '',
806
  'Salary': np.nan,
807
  'Median': np.nan,
808
+ '4x%': np.nan,
809
  'Own': np.nan
810
  })
811
 
 
822
  if not filled_lineup.empty:
823
  total_salary = filled_lineup['Salary'].sum()
824
  total_median = filled_lineup['Median'].sum()
825
+ avg_4x = filled_lineup['4x%'].mean()
826
  total_own = filled_lineup['Own'].sum()
827
  most_common_team = filled_lineup['Team'].mode()[0] if not filled_lineup['Team'].mode().empty else ""
828
 
 
833
  'Team': [most_common_team],
834
  'Salary': [total_salary],
835
  'Median': [total_median],
836
+ '4x%': [avg_4x],
837
  'Own': [total_own]
838
  })
839
  summary_row = summary_row[['Salary', 'Median', 'Own']].head(max_players)
 
898
  clear_col, save_col, export_col, clear_saved_col, blank_col = st.columns([2, 2, 2, 2, 12])
899
  with clear_col:
900
  if st.button("Clear Lineup", key='clear_lineup_button'):
901
+ st.session_state['handbuilder_lineup'] = pd.DataFrame(columns=['Player', 'Position', 'Team', 'Salary', 'Median', '4x%', 'Own', 'Slot'])
902
  # Clear the dataframe selections by resetting the previous selection state
903
  st.session_state['previous_player_selection'] = []
904
  # Force dataframe to re-render with new key to clear selections
 
1134
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1135
  if site_var == 'Draftkings':
1136
  if type_var == 'Regular':
1137
+ if sport_var == 'NBA':
1138
+ map_columns = ['PG', 'PG', 'SG', 'SG', 'SF', 'SF', 'PF', 'PF', 'C']
1139
+ elif sport_var == 'WNBA':
1140
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1141
  for col_idx in map_columns:
1142
  data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1143
  elif type_var == 'Showdown':
 
1146
  data_export[col_idx] = data_export[col_idx].map(dk_sd_id_map)
1147
  elif site_var == 'Fanduel':
1148
  if type_var == 'Regular':
1149
+ if sport_var == 'NBA':
1150
+ map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
1151
+ elif sport_var == 'WNBA':
1152
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1153
  for col_idx in map_columns:
1154
  data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1155
  elif type_var == 'Showdown':
 
1175
  with pm_opt_col:
1176
  if site_var == 'Draftkings':
1177
  if type_var == 'Regular':
1178
+ data_export = data_export.set_index('PG').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1179
  elif type_var == 'Showdown':
1180
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1181
  elif site_var == 'Fanduel':
1182
  if type_var == 'Regular':
1183
+ data_export = data_export.set_index('PG1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1184
  elif type_var == 'Showdown':
1185
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1186
  st.download_button(
 
1193
 
1194
  if site_var == 'Draftkings':
1195
  if type_var == 'Regular':
1196
+ name_export = name_export.set_index('PG').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1197
  elif type_var == 'Showdown':
1198
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1199
  elif site_var == 'Fanduel':
1200
  if type_var == 'Regular':
1201
+ name_export = name_export.set_index('PG1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1202
  elif type_var == 'Showdown':
1203
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1204
  st.download_button(
 
1214
  data_export = pd.DataFrame(st.session_state.working_seed.copy(), columns=column_names)
1215
  if site_var == 'Draftkings':
1216
  if type_var == 'Regular':
1217
+ if sport_var == 'NBA':
1218
+ map_columns = ['PG', 'PG', 'SG', 'SG', 'SF', 'SF', 'PF', 'PF', 'C']
1219
+ elif sport_var == 'WNBA':
1220
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1221
  for col_idx in map_columns:
1222
  data_export[col_idx] = data_export[col_idx].map(dk_id_map)
1223
  elif type_var == 'Showdown':
 
1227
 
1228
  elif site_var == 'Fanduel':
1229
  if type_var == 'Regular':
1230
+ if sport_var == 'NBA':
1231
+ map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
1232
+ elif sport_var == 'WNBA':
1233
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1234
  for col_idx in map_columns:
1235
  data_export[col_idx] = data_export[col_idx].map(fd_id_map)
1236
  elif type_var == 'Showdown':
 
1267
  with pm_opt_col:
1268
  if site_var == 'Draftkings':
1269
  if type_var == 'Regular':
1270
+ data_export = data_export.set_index('PG').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1271
  elif type_var == 'Showdown':
1272
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1273
  elif site_var == 'Fanduel':
1274
  if type_var == 'Regular':
1275
+ data_export = data_export.set_index('PG1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1276
  elif type_var == 'Showdown':
1277
  data_export = data_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1278
  st.download_button(
 
1285
 
1286
  if site_var == 'Draftkings':
1287
  if type_var == 'Regular':
1288
+ name_export = name_export.set_index('PG').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1289
  elif type_var == 'Showdown':
1290
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1291
  elif site_var == 'Fanduel':
1292
  if type_var == 'Regular':
1293
+ name_export = name_export.set_index('PG1').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1294
  elif type_var == 'Showdown':
1295
  name_export = name_export.set_index('CPT').drop(columns=['salary', 'proj', 'Team', 'Team_count', 'Secondary', 'Secondary_count', 'Own'], axis=1)
1296
  st.download_button(
 
1342
  name_export = st.session_state.data_export_display.copy()
1343
  if site_var == 'Draftkings':
1344
  if type_var == 'Regular':
1345
+ if sport_var == 'NBA':
1346
+ map_columns = ['PG', 'PG', 'SG', 'SG', 'SF', 'SF', 'PF', 'PF', 'C']
1347
+ elif sport_var == 'WNBA':
1348
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1349
  for col_idx in map_columns:
1350
  export_file[col_idx] = export_file[col_idx].map(dk_id_map)
1351
  elif type_var == 'Showdown':
 
1354
  export_file[col_idx] = export_file[col_idx].map(dk_sd_id_map)
1355
  elif site_var == 'Fanduel':
1356
  if type_var == 'Regular':
1357
+ if sport_var == 'NBA':
1358
+ map_columns = ['PG1', 'PG2', 'SG1', 'SG2', 'SF1', 'SF2', 'PF1', 'PF2', 'C']
1359
+ elif sport_var == 'WNBA':
1360
+ map_columns = ['G1', 'G2', 'F1', 'F2', 'F3', 'UTIL']
1361
  for col_idx in map_columns:
1362
  export_file[col_idx] = export_file[col_idx].map(fd_id_map)
1363
  elif type_var == 'Showdown':