BOOM / src /populate.py
annamonica's picture
parse model config from json files and display clickable links under Model column
c3ba57d
raw
history blame
4.82 kB
import json
import os
import pandas as pd
from dataclasses import fields
from src.display.formatting import has_no_nan_values, make_clickable_model
from src.display.utils import AutoEvalColumn, EvalQueueColumn
from src.leaderboard.read_evals import get_model_info
from src.display.utils import ModelType
def get_model_info_df(results_path: str) -> pd.DataFrame:
"""Creates a dataframe from all the individual experiment results"""
raw_data = get_model_info(results_path)
all_data_json = [v.to_dict() for v in raw_data]
df = pd.DataFrame.from_records(all_data_json)
return df
def get_merged_df(result_df: pd.DataFrame, model_info_df: pd.DataFrame) -> pd.DataFrame:
"""Merges the model info dataframe with the results dataframe"""
result_df = result_df.rename(columns={"Model": "tmp_name"})
merged_df = pd.merge(model_info_df, result_df, on="tmp_name", how="inner")
assert len(merged_df) == len(result_df)
merged_df = merged_df.drop(columns=["Model", "tmp_name"])
merged_df = merged_df.rename(columns={"model_w_link": "Model"})
return merged_df
# def get_leaderboard_df(results_path: str, requests_path: str, cols: list, benchmark_cols: list) -> pd.DataFrame:
# """Creates a dataframe from all the individual experiment results"""
# raw_data = get_raw_eval_results(results_path, requests_path)
# all_data_json = [v.to_dict() for v in raw_data]
# df = pd.DataFrame.from_records(all_data_json)
# df = df.sort_values(by=[AutoEvalColumn.average.name], ascending=False)
# df = df[cols].round(decimals=2)
# # filter out if any of the benchmarks have not been produced
# df = df[has_no_nan_values(df, benchmark_cols)]
# return df
def get_leaderboard_df(results_path: str, requests_path: str, cols: list, benchmark_cols: list) -> pd.DataFrame:
"""
Processes a STATIC results CSV file to generate a leaderboard DataFrame with formatted columns and sorted values.
Args:
results_path (str): The file path to the results CSV file.
Returns:
pd.DataFrame: A processed DataFrame with renamed columns, additional formatting, and sorted values.
Notes:
- The function reads a CSV file from the given `results_path`.
- Internal column names are mapped to display names using `AutoEvalColumn`.
- A new column for model type symbols is created by parsing the `model_type` column.
- The `model_type` column is updated to prepend the model type symbol.
- The DataFrame is sorted by the `Rank_6750_scaled` column in ascending order.
"""
df = pd.read_csv(results_path)
# Create the mapping from internal column name to display name
column_mapping = {field.name: getattr(AutoEvalColumn, field.name).name for field in fields(AutoEvalColumn)}
# Assuming `df` is your DataFrame:
df.rename(columns=column_mapping, inplace=True)
df = df.sort_values(by=[AutoEvalColumn.Rank_6750_scaled.name], ascending=True)
return df
def get_evaluation_queue_df(save_path: str, cols: list) -> list[pd.DataFrame]:
"""Creates the different dataframes for the evaluation queues requestes"""
entries = [entry for entry in os.listdir(save_path) if not entry.startswith(".")]
all_evals = []
for entry in entries:
if ".json" in entry:
file_path = os.path.join(save_path, entry)
with open(file_path) as fp:
data = json.load(fp)
data[EvalQueueColumn.model.name] = make_clickable_model(data["model"])
data[EvalQueueColumn.revision.name] = data.get("revision", "main")
all_evals.append(data)
elif ".md" not in entry:
# this is a folder
sub_entries = [
e for e in os.listdir(f"{save_path}/{entry}") if os.path.isfile(e) and not e.startswith(".")
]
for sub_entry in sub_entries:
file_path = os.path.join(save_path, entry, sub_entry)
with open(file_path) as fp:
data = json.load(fp)
data[EvalQueueColumn.model.name] = make_clickable_model(data["model"])
data[EvalQueueColumn.revision.name] = data.get("revision", "main")
all_evals.append(data)
pending_list = [e for e in all_evals if e["status"] in ["PENDING", "RERUN"]]
running_list = [e for e in all_evals if e["status"] == "RUNNING"]
finished_list = [e for e in all_evals if e["status"].startswith("FINISHED") or e["status"] == "PENDING_NEW_EVAL"]
df_pending = pd.DataFrame.from_records(pending_list, columns=cols)
df_running = pd.DataFrame.from_records(running_list, columns=cols)
df_finished = pd.DataFrame.from_records(finished_list, columns=cols)
return df_finished[cols], df_running[cols], df_pending[cols]