Spaces:
Running
Running
James McCool
Refactor date input handling in app.py to improve date selection logic. Updated date filtering to ensure proper date formatting and consistency, allowing for seamless selection of date ranges including a "Last Year" option. This enhances user experience and data analysis capabilities.
b9e7e41
import streamlit as st | |
st.set_page_config(layout="wide") | |
import numpy as np | |
import pandas as pd | |
import pymongo | |
import time | |
from datetime import datetime, timedelta | |
def init_conn(): | |
uri = st.secrets['mongo_uri'] | |
client = pymongo.MongoClient(uri, retryWrites=True, serverSelectionTimeoutMS=500000) | |
db = client["League_of_Legends_Database"] | |
collection = db["gamelogs"] | |
min_date = datetime.strptime(collection.find_one({}, sort=[("date", 1)])["date"], "%Y-%m-%d %H:%M:%S") | |
max_date = datetime.strptime(collection.find_one({}, sort=[("date", -1)])["date"], "%Y-%m-%d %H:%M:%S") | |
team_names = collection.distinct("teamname") | |
player_names = collection.distinct("playername") | |
return db, team_names, player_names, min_date, max_date | |
db, team_names, player_names, min_date, max_date = init_conn() | |
display_formats = {'wKill%': '{:.2%}', 'wDeath%': '{:.2%}', 'wAssist%': '{:.2%}', 'lKill%': '{:.2%}', 'lDeath%': '{:.2%}', 'lAssist%': '{:.2%}'} | |
# Create sidebar container for options | |
with st.sidebar: | |
st.header("Team Analysis Options") | |
# Date filtering options | |
st.subheader("Date Range") | |
date_filter = st.radio( | |
"Select Date Range", | |
["Last Year", "Custom Range"] | |
) | |
if date_filter == "Last Year": | |
end_date = max_date | |
start_date = (end_date - timedelta(days=365)) | |
else: | |
col1, col2 = st.columns(2) | |
with col1: | |
start_date = st.date_input( | |
"Start Date", | |
value=(max_date - timedelta(days=365)), | |
min_value=min_date, | |
max_value=max_date | |
) | |
with col2: | |
end_date = st.date_input( | |
"End Date", | |
value=max_date, | |
min_value=min_date, | |
max_value=max_date | |
) | |
selected_team = st.selectbox( | |
"Select Team", | |
options=team_names, | |
index=team_names.index("T1") if "T1" in team_names else 0 | |
) | |
st.subheader("Prediction Settings") | |
win_loss = st.selectbox( | |
"Select Win/Loss", | |
options=["Win", "Loss"], | |
index=0 | |
) | |
kill_prediction = st.number_input( | |
"Predicted Team Kills", | |
min_value=0, | |
max_value=100, | |
value=20 | |
) | |
death_prediction = st.number_input( | |
"Predicted Team Deaths", | |
min_value=0, | |
max_value=100, | |
value=5 | |
) | |
def init_team_data(team, win_loss, kill_prediction, death_prediction, start_date, end_date): | |
collection = db["gamelogs"] | |
cursor = collection.find({"teamname": team, "date": {"$gte": start_date, "$lte": end_date}}) | |
raw_display = pd.DataFrame(list(cursor)) | |
raw_display = raw_display[['playername', 'teamname', 'playername_avg_kill_share_win', 'playername_avg_death_share_win', 'playername_avg_assist_share_win', 'playername_avg_total_cs_win', 'playername_avg_kill_share_loss', 'playername_avg_death_share_loss', 'playername_avg_assist_share_loss', 'playername_avg_total_cs_loss']] | |
raw_display = raw_display.rename(columns = {'playername_avg_kill_share_win': 'wKill%', 'playername_avg_death_share_win': 'wDeath%', 'playername_avg_assist_share_win': 'wAssist%', 'playername_avg_total_cs_win': 'wCS', 'playername_avg_kill_share_loss': 'lKill%', 'playername_avg_death_share_loss': 'lDeath%', 'playername_avg_assist_share_loss': 'lAssist%', 'playername_avg_total_cs_loss': 'lCS'}) | |
team_data = raw_display.drop_duplicates(subset = ['playername']) | |
if win_loss == "Win": | |
team_data['Kill_Proj'] = team_data['wKill%'] * kill_prediction | |
team_data['Death_Proj'] = team_data['wDeath%'] * death_prediction | |
team_data['Assist_Proj'] = team_data['wAssist%'] * kill_prediction | |
team_data = team_data[['playername', 'teamname', 'wKill%', 'wDeath%', 'wAssist%', 'wCS', 'Kill_Proj', 'Death_Proj', 'Assist_Proj']] | |
else: | |
team_data['Kill_Proj'] = team_data['lKill%'] * kill_prediction | |
team_data['Death_Proj'] = team_data['lDeath%'] * death_prediction | |
team_data['Assist_Proj'] = team_data['lAssist%'] * kill_prediction | |
team_data = team_data[['playername', 'teamname', 'lKill%', 'lDeath%', 'lAssist%', 'lCS', 'Kill_Proj', 'Death_Proj', 'Assist_Proj']] | |
return team_data.dropna().reset_index(drop=True) | |
if st.button("Run"): | |
st.dataframe(init_team_data(selected_team, win_loss, kill_prediction, death_prediction, start_date, end_date).style.background_gradient(axis=0).background_gradient(cmap='RdYlGn').format(display_formats, precision=2), use_container_width = True) |