import streamlit as st st.set_page_config(layout="wide") import numpy as np import pandas as pd import time from fuzzywuzzy import process import random ## import global functions from global_func.clean_player_name import clean_player_name from global_func.load_file import load_file from global_func.load_ss_file import load_ss_file from global_func.find_name_mismatches import find_name_mismatches from global_func.predict_dupes import predict_dupes from global_func.highlight_rows import highlight_changes, highlight_changes_winners, highlight_changes_losers from global_func.load_csv import load_csv from global_func.find_csv_mismatches import find_csv_mismatches tab1, tab2 = st.tabs(["Data Load", "Contest Analysis"]) with tab1: if st.button('Clear data', key='reset1'): st.session_state.clear() # Add file uploaders to your app col1, col2, col3 = st.columns(3) with col1: st.subheader("Draftkings/Fanduel CSV") st.info("Upload the player pricing CSV from the site you are playing on.") upload_csv_col, csv_template_col = st.columns([3, 1]) with upload_csv_col: csv_file = st.file_uploader("Upload CSV File", type=['csv']) if 'csv_file' in st.session_state: del st.session_state['csv_file'] with csv_template_col: csv_template_df = pd.DataFrame(columns=['Name', 'ID', 'Roster Position', 'Salary']) st.download_button( label="CSV Template", data=csv_template_df.to_csv(index=False), file_name="csv_template.csv", mime="text/csv" ) st.session_state['csv_file'] = load_csv(csv_file) try: st.session_state['csv_file']['Salary'] = st.session_state['csv_file']['Salary'].astype(str).str.replace(',', '').astype(int) except: pass if csv_file: st.session_state['csv_file'] = st.session_state['csv_file'].drop_duplicates(subset=['Name']) st.success('Projections file loaded successfully!') st.dataframe(st.session_state['csv_file'].head(10)) with col2: st.subheader("Contest File") st.info("Go ahead and upload a Contest file here. Only include player columns and an optional 'Stack' column if you are playing MLB.") Contest_file = st.file_uploader("Upload Contest File (CSV or Excel)", type=['csv', 'xlsx', 'xls']) if 'Contest' in st.session_state: del st.session_state['Contest'] if Contest_file: st.session_state['Contest'], st.session_state['position_dict'], st.session_state['ownership_dict'], st.session_state['entry_list'] = load_file(Contest_file) st.session_state['Contest'] = st.session_state['Contest'].dropna(how='all') st.session_state['Contest'] = st.session_state['Contest'].reset_index(drop=True) if st.session_state['Contest'] is not None: st.success('Contest file loaded successfully!') st.dataframe(st.session_state['Contest'].head(10)) with col3: st.subheader("Projections File") st.info("upload a projections file that has 'player_names', 'salary', 'median', 'ownership', and 'captain ownership' (Needed for Showdown) columns. Note that the salary for showdown needs to be the FLEX salary, not the captain salary.") # Create two columns for the uploader and template button upload_col, template_col = st.columns([3, 1]) with upload_col: projections_file = st.file_uploader("Upload Projections File (CSV or Excel)", type=['csv', 'xlsx', 'xls']) if 'projections_df' in st.session_state: del st.session_state['projections_df'] with template_col: # Create empty DataFrame with required columns template_df = pd.DataFrame(columns=['player_names', 'position', 'team', 'salary', 'median', 'ownership', 'captain ownership']) # Add download button for template st.download_button( label="Template", data=template_df.to_csv(index=False), file_name="projections_template.csv", mime="text/csv" ) if projections_file: export_projections, projections = load_file(projections_file) if projections is not None: st.success('Projections file loaded successfully!') st.dataframe(projections.head(10)) # if Contest_file and projections_file: # if st.session_state['Contest'] is not None and projections is not None: # st.subheader("Name Matching Analysis") # # Initialize projections_df in session state if it doesn't exist # if 'projections_df' not in st.session_state: # st.session_state['projections_df'] = projections.copy() # st.session_state['projections_df']['salary'] = (st.session_state['projections_df']['salary'].astype(str).str.replace(',', '').astype(float).astype(int)) # # Update projections_df with any new matches # st.session_state['projections_df'] = find_name_mismatches(st.session_state['Contest'], st.session_state['projections_df']) # if csv_file is not None and 'export_dict' not in st.session_state: # # Create a dictionary of Name to Name+ID from csv_file # try: # name_id_map = dict(zip( # st.session_state['csv_file']['Name'], # st.session_state['csv_file']['Name + ID'] # )) # except: # name_id_map = dict(zip( # st.session_state['csv_file']['Nickname'], # st.session_state['csv_file']['Id'] # )) # # Function to find best match # def find_best_match(name): # best_match = process.extractOne(name, name_id_map.keys()) # if best_match and best_match[1] >= 85: # 85% match threshold # return name_id_map[best_match[0]] # return name # Return original name if no good match found # # Apply the matching # projections['upload_match'] = projections['player_names'].apply(find_best_match) # st.session_state['export_dict'] = dict(zip(projections['player_names'], projections['upload_match'])) with tab2: if st.button('Clear data', key='reset3'): st.session_state.clear()