| 
							 | 
						import streamlit as st | 
					
					
						
						| 
							 | 
						import numpy as np | 
					
					
						
						| 
							 | 
						import pandas as pd | 
					
					
						
						| 
							 | 
						import time | 
					
					
						
						| 
							 | 
						from fuzzywuzzy import process | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def optimize_lineup(row): | 
					
					
						
						| 
							 | 
						    current_lineup = [] | 
					
					
						
						| 
							 | 
						    total_salary = 0 | 
					
					
						
						| 
							 | 
						    salary_cap = 50000 | 
					
					
						
						| 
							 | 
						    used_players = set() | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    roster = {} | 
					
					
						
						| 
							 | 
						    for col, player in zip(row.index, row): | 
					
					
						
						| 
							 | 
						        if col not in ['salary', 'median', 'Own', 'Finish_percentile', 'Dupes', 'Lineup Edge']: | 
					
					
						
						| 
							 | 
						            roster[col] = { | 
					
					
						
						| 
							 | 
						                'name': player, | 
					
					
						
						| 
							 | 
						                'position': map_dict['pos_map'].get(player, '').split('/'), | 
					
					
						
						| 
							 | 
						                'team': map_dict['team_map'].get(player, ''), | 
					
					
						
						| 
							 | 
						                'salary': map_dict['salary_map'].get(player, 0), | 
					
					
						
						| 
							 | 
						                'median': map_dict['proj_map'].get(player, 0), | 
					
					
						
						| 
							 | 
						                'ownership': map_dict['own_map'].get(player, 0) | 
					
					
						
						| 
							 | 
						            } | 
					
					
						
						| 
							 | 
						            total_salary += roster[col]['salary'] | 
					
					
						
						| 
							 | 
						            used_players.add(player) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    roster_positions = list(roster.items()) | 
					
					
						
						| 
							 | 
						    random.shuffle(roster_positions) | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    for roster_pos, current in roster_positions: | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        if current['team'] in remove_teams_var: | 
					
					
						
						| 
							 | 
						            continue | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        valid_positions = position_rules[roster_pos] | 
					
					
						
						| 
							 | 
						        better_options = [] | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        for pos in valid_positions: | 
					
					
						
						| 
							 | 
						            if pos in position_groups: | 
					
					
						
						| 
							 | 
						                pos_options = [ | 
					
					
						
						| 
							 | 
						                    p for p in position_groups[pos] | 
					
					
						
						| 
							 | 
						                    if p['median'] > current['median'] | 
					
					
						
						| 
							 | 
						                    and (total_salary - current['salary'] + p['salary']) <= salary_cap | 
					
					
						
						| 
							 | 
						                    and p['player_names'] not in used_players | 
					
					
						
						| 
							 | 
						                    and any(valid_pos in p['positions'] for valid_pos in valid_positions) | 
					
					
						
						| 
							 | 
						                    and map_dict['team_map'].get(p['player_names']) not in remove_teams_var   | 
					
					
						
						| 
							 | 
						                ] | 
					
					
						
						| 
							 | 
						                better_options.extend(pos_options) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						        if better_options: | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            better_options = {opt['player_names']: opt for opt in better_options}.values() | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            best_replacement = max(better_options, key=lambda x: x['median']) | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						             | 
					
					
						
						| 
							 | 
						            used_players.remove(current['name']) | 
					
					
						
						| 
							 | 
						            used_players.add(best_replacement['player_names']) | 
					
					
						
						| 
							 | 
						            total_salary = total_salary - current['salary'] + best_replacement['salary'] | 
					
					
						
						| 
							 | 
						            roster[roster_pos] = { | 
					
					
						
						| 
							 | 
						                'name': best_replacement['player_names'], | 
					
					
						
						| 
							 | 
						                'position': map_dict['pos_map'][best_replacement['player_names']].split('/'), | 
					
					
						
						| 
							 | 
						                'team': map_dict['team_map'][best_replacement['player_names']], | 
					
					
						
						| 
							 | 
						                'salary': best_replacement['salary'], | 
					
					
						
						| 
							 | 
						                'median': best_replacement['median'], | 
					
					
						
						| 
							 | 
						                'ownership': best_replacement['ownership'] | 
					
					
						
						| 
							 | 
						            } | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    return [roster[pos]['name'] for pos in row.index if pos in roster] |