File size: 5,769 Bytes
d04558f ee49c6f d04558f ee49c6f d04558f ee49c6f d04558f ee49c6f d04558f ee49c6f d04558f 356c7d4 ee49c6f 1604a8f d04558f dc1c8da d04558f dc1c8da d04558f 1604a8f ca4b602 d04558f dc1c8da d04558f e253b51 3dcdcb7 e253b51 3dcdcb7 dc1c8da 3dcdcb7 a134635 3dcdcb7 e253b51 3dcdcb7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import streamlit as st
import numpy as np
import pandas as pd
import time
from fuzzywuzzy import process
def find_name_mismatches(contest_df, projections_df, ownership_df, fpts_df):
# Create a copy of the projections dataframe to avoid modifying the original
projections_raw = projections_df.copy()
contest_raw = contest_df.copy()
ownership_raw = ownership_df.copy()
fpts_raw = fpts_df.copy()
name_columns = [col for col in contest_raw.columns if not col in ['BaseName', 'EntryCount']]
if 'player_names' not in projections_raw.columns:
st.error("No 'player_names' column found in projections file")
return contest_raw, projections_raw
# Get unique player names from portfolio and projections
portfolio_players = set()
for col in name_columns:
portfolio_players.update(contest_raw[col].unique())
projection_players = set(projections_raw['player_names'].unique())
portfolio_players_list = list(portfolio_players)
projection_players_list = list(projection_players)
# Find players in portfolio that are missing from projections
players_missing_from_projections = list(projection_players - portfolio_players)
# Automatically handle 90%+ matches before starting interactive process
auto_matches = {}
players_to_process = []
for player in players_missing_from_projections:
if not isinstance(player, str):
st.warning(f"Skipping non-string value: {player}")
continue
closest_matches = process.extract(player, portfolio_players_list, limit=1)
if closest_matches[0][1] >= 95: # If high confidence match found
match_name = closest_matches[0][0]
auto_matches[player] = match_name
st.success(f"Automatically matched '{player}' with '{match_name}' ({closest_matches[0][1]}% match)")
else:
players_to_process.append(player)
if players_to_process:
st.warning(f"Found {len(players_to_process)} players that need manual matching")
# Create a form for batch processing
with st.form("name_matching_form"):
# Create tabs for each player
tabs = st.tabs([f"Player {i+1}" for i in range(len(players_to_process))])
# Dictionary to store selections
selections = {}
# Populate each tab
for i, player in enumerate(players_to_process):
with tabs[i]:
st.write(f"**Projection Name:** {player}")
# Find the top 3 closest matches
closest_matches = process.extract(player, portfolio_players_list, limit=3)
# Create radio buttons for selection
options = [f"{match[0]} ({match[1]}%)" for match in closest_matches]
options.append("None of these")
selections[player] = st.radio(
f"Select correct match:",
options,
key=f"radio_{player}"
)
# Submit button for the entire form
submitted = st.form_submit_button("Apply All Changes")
if submitted:
# Process automatic matches
for projection_name, contest_name in auto_matches.items():
for col in name_columns:
contest_raw[col] = contest_raw[col].replace(contest_name, projection_name)
ownership_raw['Player'] = ownership_raw['Player'].replace(contest_name, projection_name)
fpts_raw['Player'] = fpts_raw['Player'].replace(contest_name, projection_name)
st.write(contest_name + ' ' + projection_name)
# Process manual selections
for projection_name, selection in selections.items():
if selection != "None of these":
selected_name = selection.split(" (")[0]
for col in name_columns:
contest_raw[col] = contest_raw[col].replace(selected_name, projection_name)
ownership_raw['Player'] = ownership_raw['Player'].replace(selected_name, projection_name)
fpts_raw['Player'] = fpts_raw['Player'].replace(selected_name, projection_name)
st.write(contest_name + ' ' + projection_name)
st.success(f"Replaced '{selected_name}' with '{projection_name}'")
ownership_dict = dict(zip(ownership_raw['Player'], ownership_raw['Own']))
fpts_dict = dict(zip(fpts_raw['Player'], fpts_raw['FPTS']))
st.success("All changes applied successfully!")
return contest_raw, projections_raw, ownership_dict, fpts_dict
else:
st.success("All players have been automatically matched!")
# Apply automatic matches
for projection_name, contest_name in auto_matches.items():
for col in name_columns:
contest_raw[col] = contest_raw[col].replace(contest_name, projection_name)
ownership_raw['Player'] = ownership_raw['Player'].replace(contest_name, projection_name)
fpts_raw['Player'] = fpts_raw['Player'].replace(contest_name, projection_name)
st.write(contest_name + ' ' + projection_name)
ownership_dict = dict(zip(ownership_raw['Player'], ownership_raw['Own']))
fpts_dict = dict(zip(fpts_raw['Player'], fpts_raw['FPTS']))
return contest_raw, projections_raw, ownership_dict, fpts_dict
|