James McCool
Refactor file upload sections in `app.py` for improved organization and clarity
1689df1
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("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 col2: | |
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() | |