Spaces:
Running
Running
James McCool
Enhance date filtering in init_team_data function of app.py. Updated date range queries to convert date objects to formatted datetime strings, ensuring accurate filtering of game logs. This change improves data consistency and reliability in analysis.
0f5bf62
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): | |
# Convert date objects to datetime strings in the correct format | |
start_datetime = datetime.combine(start_date, datetime.min.time()).strftime("%Y-%m-%d %H:%M:%S") | |
end_datetime = datetime.combine(end_date, datetime.max.time()).strftime("%Y-%m-%d %H:%M:%S") | |
collection = db["gamelogs"] | |
cursor = collection.find({"teamname": team, "date": {"$gte": start_datetime, "$lte": end_datetime}}) | |
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) |