File size: 4,146 Bytes
b87ce7c
 
 
 
 
141f1e0
 
b87ce7c
 
141f1e0
 
b87ce7c
 
141f1e0
 
b87ce7c
141f1e0
30f0c04
 
 
 
dcb04e7
 
 
 
aabac86
 
 
 
dcb04e7
aabac86
 
 
 
 
 
 
 
 
 
 
 
 
dcb04e7
141f1e0
b87ce7c
 
 
141f1e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc714de
 
 
 
 
 
141f1e0
 
 
 
 
 
dcb04e7
 
 
 
 
 
141f1e0
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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