import json import os import pandas as pd from src.display.utils import SubmissionQueueColumn, TeamColumn from src.leaderboard.read_team_results import get_team_results def get_leaderboard_df(results_path: str, cols: list) -> pd.DataFrame: raw_data = get_team_results(results_path) all_data_json = [v.to_dict() for v in raw_data] if not all_data_json: return pd.DataFrame(columns=cols) df = pd.DataFrame.from_records(all_data_json) df = df.sort_values( by=[TeamColumn.best_f1.name, TeamColumn.best_submission_date.name], ascending=[False, True], ) team_name_col = TeamColumn.team_name.name if team_name_col in df.columns and len(df) > 0: medals = ["🥇", "🥈", "🥉"] creative_emoji = "🎨" non_aurigin_count = 0 for idx in range(len(df)): current_name = str(df.iloc[idx][team_name_col]) if current_name.lower() == "aurigin": if not current_name.startswith("🤖"): df.iloc[idx, df.columns.get_loc(team_name_col)] = f"🤖 {current_name}" continue if not any(current_name.startswith(emoji) for emoji in medals + [creative_emoji, "🤖"]): if non_aurigin_count < 3: df.iloc[idx, df.columns.get_loc(team_name_col)] = f"{medals[non_aurigin_count]} {current_name}" elif non_aurigin_count < 6: df.iloc[idx, df.columns.get_loc(team_name_col)] = f"{creative_emoji} {current_name}" non_aurigin_count += 1 df = df[cols].round(decimals=4) return df def get_submission_queue_df(save_path: str, cols: list) -> list[pd.DataFrame]: all_submissions = [] if not os.path.exists(save_path): empty_df = pd.DataFrame(columns=cols) return empty_df, empty_df, empty_df for filename in os.listdir(save_path): if not filename.endswith(".json"): continue filepath = os.path.join(save_path, filename) if not os.path.isfile(filepath): continue filepath = os.path.join(save_path, filename) try: with open(filepath, "r") as f: data = json.load(f) submission_data = { SubmissionQueueColumn.team_name.name: data.get("team_name", ""), SubmissionQueueColumn.submission_date.name: data.get("timestamp", ""), SubmissionQueueColumn.accuracy.name: data.get("scores", {}).get("accuracy", 0.0), SubmissionQueueColumn.f1.name: data.get("scores", {}).get("f1", 0.0), SubmissionQueueColumn.precision.name: data.get("scores", {}).get("precision", 0.0), SubmissionQueueColumn.recall.name: data.get("scores", {}).get("recall", 0.0), SubmissionQueueColumn.tp.name: data.get("scores", {}).get("tp", 0), SubmissionQueueColumn.fp.name: data.get("scores", {}).get("fp", 0), SubmissionQueueColumn.fn.name: data.get("scores", {}).get("fn", 0), SubmissionQueueColumn.tn.name: data.get("scores", {}).get("tn", 0), SubmissionQueueColumn.status.name: data.get("status", "UNKNOWN"), } all_submissions.append(submission_data) except Exception: continue accepted_list = [ s for s in all_submissions if s[SubmissionQueueColumn.status.name] in ["ACCEPTED", "ACCEPTED, BUT WORST"] ] rejected_list = [ s for s in all_submissions if s[SubmissionQueueColumn.status.name] not in ["ACCEPTED", "ACCEPTED, BUT WORST"] ] df_accepted = ( pd.DataFrame.from_records(accepted_list, columns=cols) if accepted_list else pd.DataFrame(columns=cols) ) df_rejected = ( pd.DataFrame.from_records(rejected_list, columns=cols) if rejected_list else pd.DataFrame(columns=cols) ) df_all = ( pd.DataFrame.from_records(all_submissions, columns=cols) if all_submissions else pd.DataFrame(columns=cols) ) return df_accepted, df_rejected, df_all