James McCool commited on
Commit
894a694
·
1 Parent(s): c0713d8

Refine player lineup processing logic in load_contest_file function

Browse files

- Enhanced the handling of player names and position indicators by implementing a more robust splitting mechanism, ensuring accurate player assignments.
- Improved debug output to display processed players with their respective positions, aiding in traceability during execution.
- These changes contribute to ongoing efforts to enhance data handling and improve user experience within the application.

Files changed (1) hide show
  1. global_func/load_contest_file.py +51 -32
global_func/load_contest_file.py CHANGED
@@ -87,51 +87,70 @@ def load_contest_file(upload, sport):
87
  print(f"\nProcessing lineup {idx}:")
88
  print(f"Original lineup string: {row['Lineup']}")
89
 
90
- # Get all players in the lineup and clean up the strings
91
- players = row['Lineup'].split(',')
92
- print(f"After initial split: {players}")
 
 
 
 
 
 
93
 
94
- cleaned_players = []
 
95
  current_position = None
96
-
97
- for item in players:
98
- item = item.strip()
99
- print(f"\nProcessing item: {item}")
100
-
101
- # If the item is just a position indicator, store it
102
- if item in pos_values:
103
- current_position = item
104
- print(f"Found position: {current_position}")
105
  continue
106
 
107
- # If we have a position and a player name
108
- if current_position:
109
- # Remove any trailing position indicators
110
- for pos in pos_values:
111
- if item.endswith(pos):
112
- item = item[:-len(pos)].strip()
113
- print(f"Adding player with position {current_position}: {item}")
114
- cleaned_players.append(item)
115
- current_position = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  else:
117
- # If we somehow got a player without a position, try to clean it
118
  for pos in pos_values:
119
- if item.endswith(pos):
120
- item = item[:-len(pos)].strip()
 
 
121
  break
122
- print(f"Adding player without position: {item}")
123
- cleaned_players.append(item)
124
 
125
- print(f"\nFinal cleaned players: {cleaned_players}")
 
 
 
126
 
127
  # First pass: fill required positions (excluding OF)
128
  required_positions = ['SP1', 'SP2', 'C', '1B', '2B', '3B', 'SS']
129
  for pos in required_positions:
130
- for player in cleaned_players:
131
  if is_eligible_for_position(player, pos):
132
  print(f"Assigning {player} to {pos}")
133
  df.at[idx, pos] = player
134
- cleaned_players.remove(player)
135
  break
136
  else:
137
  print(f"No player found for {pos}")
@@ -139,11 +158,11 @@ def load_contest_file(upload, sport):
139
  # Second pass: fill OF positions with remaining players
140
  of_positions = ['OF1', 'OF2', 'OF3']
141
  for pos in of_positions:
142
- for player in cleaned_players:
143
  if 'OF' in pos_dict.get(player, '').split('/'):
144
  print(f"Assigning {player} to {pos}")
145
  df.at[idx, pos] = player
146
- cleaned_players.remove(player)
147
  break
148
  else:
149
  print(f"No player found for {pos}, using -1")
 
87
  print(f"\nProcessing lineup {idx}:")
88
  print(f"Original lineup string: {row['Lineup']}")
89
 
90
+ # First split by position indicators to preserve player names
91
+ lineup_parts = []
92
+ current_part = row['Lineup']
93
+ for pos in pos_values:
94
+ if pos in current_part:
95
+ parts = current_part.split(pos)
96
+ if len(parts) > 1:
97
+ lineup_parts.append(pos) # Add the position
98
+ current_part = parts[1] # Keep the rest for further processing
99
 
100
+ # Now split the remaining parts by commas, but only if they're not part of a player name
101
+ players = []
102
  current_position = None
103
+ for part in lineup_parts:
104
+ part = part.strip()
105
+ if part in pos_values:
106
+ current_position = part
 
 
 
 
 
107
  continue
108
 
109
+ # Split by comma only if it's followed by a position indicator
110
+ if ',' in part:
111
+ subparts = part.split(',')
112
+ for subpart in subparts:
113
+ subpart = subpart.strip()
114
+ # Check if this subpart ends with a position
115
+ has_position = any(subpart.endswith(pos) for pos in pos_values)
116
+ if has_position:
117
+ # This is a complete player entry
118
+ for pos in pos_values:
119
+ if subpart.endswith(pos):
120
+ player = subpart[:-len(pos)].strip()
121
+ players.append((current_position, player))
122
+ current_position = pos
123
+ break
124
+ else:
125
+ # This might be part of a player name (like J.P., Crawford)
126
+ # Combine with the next part
127
+ if players:
128
+ last_pos, last_player = players[-1]
129
+ players[-1] = (last_pos, last_player + ',' + subpart)
130
+ else:
131
+ players.append((current_position, subpart))
132
  else:
133
+ # No comma, just clean and add
134
  for pos in pos_values:
135
+ if part.endswith(pos):
136
+ player = part[:-len(pos)].strip()
137
+ players.append((current_position, player))
138
+ current_position = pos
139
  break
 
 
140
 
141
+ print(f"Processed players with positions: {players}")
142
+
143
+ # Now fill the positions using the processed players
144
+ cleaned_players = [player for _, player in players]
145
 
146
  # First pass: fill required positions (excluding OF)
147
  required_positions = ['SP1', 'SP2', 'C', '1B', '2B', '3B', 'SS']
148
  for pos in required_positions:
149
+ for position, player in players:
150
  if is_eligible_for_position(player, pos):
151
  print(f"Assigning {player} to {pos}")
152
  df.at[idx, pos] = player
153
+ players.remove((position, player))
154
  break
155
  else:
156
  print(f"No player found for {pos}")
 
158
  # Second pass: fill OF positions with remaining players
159
  of_positions = ['OF1', 'OF2', 'OF3']
160
  for pos in of_positions:
161
+ for position, player in players:
162
  if 'OF' in pos_dict.get(player, '').split('/'):
163
  print(f"Assigning {player} to {pos}")
164
  df.at[idx, pos] = player
165
+ players.remove((position, player))
166
  break
167
  else:
168
  print(f"No player found for {pos}, using -1")