CodeGoat24's picture
Update app.py
b026a94 verified
import gradio as gr
import pandas as pd
from pathlib import Path
from src.json_leaderboard import create_leaderboard_df
from src.about import (
CITATION_BUTTON_TEXT,
INTRODUCTION_TEXT,
LINKS_AND_INFO,
TITLE,
)
from src.display.css_html_js import custom_css
# 固定列,永远在前面
FIXED_COLUMNS = ["Model Name (clickable)", "Release Date", "HF Model", "Open Source"]
def get_json_df():
"""Load the leaderboard DataFrame"""
json_path = Path(__file__).parent / "leaderboard_data.json"
df = create_leaderboard_df(str(json_path))
return df
# 提取大类及其子类
def extract_categories_and_subs(df):
"""
返回 {大类: {"overall": 大类列, "subs": [子类列]}}
大类列以 '-Overall' 结尾,紧跟其后的列为子类
"""
category_dict = {}
all_cols = list(df.columns)
skip_cols = set(FIXED_COLUMNS + ["Overall"])
i = 0
while i < len(all_cols):
col = all_cols[i]
if col.endswith("-Overall") and col not in skip_cols:
cat_name = col.replace("-Overall", "")
subs = []
j = i + 1
while j < len(all_cols):
next_col = all_cols[j]
if next_col.endswith("-Overall") or next_col in skip_cols:
break
subs.append(next_col)
j += 1
category_dict[cat_name] = {"overall": col, "subs": subs}
i += 1
return category_dict
# 列过滤函数,保持固定列 + 用户选择列 + 顺序不变
def filtered_leaderboard(df, selected_columns):
selected_columns = selected_columns or []
final_cols = FIXED_COLUMNS + [col for col in df.columns if col in selected_columns and col not in FIXED_COLUMNS]
return df[final_cols]
# Update functions
def update_leaderboard_overall(selected_cols, df_overall):
return filtered_leaderboard(df_overall, selected_cols)
def update_leaderboard_cat(selected_cols, df_cat):
return filtered_leaderboard(df_cat, selected_cols)
# 初始化
df = get_json_df()
ALL_COLUMNS_ORDERED = list(df.columns)
categories = extract_categories_and_subs(df)
# 可选列 = 全部列 - 固定列
optional_columns = [col for col in df.columns if col not in FIXED_COLUMNS]
# Gradio interface
demo = gr.Blocks(css=custom_css, title="UniGenBench Leaderboard")
with demo:
gr.HTML(TITLE)
gr.HTML(LINKS_AND_INFO)
gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text")
with gr.Tabs(elem_classes="tab-buttons") as tabs:
# Overall leaderboard
with gr.TabItem("🏅 Overall Leaderboard", elem_id="tab-overall"):
selected_columns_overall = gr.CheckboxGroup(
choices=optional_columns,
label="Select additional columns to display",
value=optional_columns
)
leaderboard_table = gr.Dataframe(
value=df[ALL_COLUMNS_ORDERED],
headers=list(df.columns),
datatype=["html" if col in ["Model Name (clickable)","HF Model"] else "str" for col in df.columns],
interactive=False,
wrap=False
)
selected_columns_overall.change(
fn=update_leaderboard_overall,
inputs=[selected_columns_overall, gr.State(value=df)],
outputs=leaderboard_table
)
# 每个大类 leaderboard
for cat_name, info in categories.items():
with gr.TabItem(f"🏆 {cat_name}", elem_id=f"tab-{cat_name}"):
cat_cols = [info["overall"]] + info["subs"]
cat_df = df[FIXED_COLUMNS + cat_cols]
optional_columns_cat = [col for col in cat_cols if col not in FIXED_COLUMNS]
selected_columns_cat = gr.CheckboxGroup(
choices=optional_columns_cat,
label=f"Select additional columns for {cat_name}",
value=optional_columns_cat
)
leaderboard_table_cat = gr.Dataframe(
value=cat_df,
headers=list(cat_df.columns),
datatype=["html" if col in ["Model Name (clickable)","HF Model"] else "str" for col in cat_df.columns],
interactive=False,
wrap=False
)
selected_columns_cat.change(
fn=update_leaderboard_cat,
inputs=[selected_columns_cat, gr.State(value=cat_df)],
outputs=leaderboard_table_cat
)
# Citation
with gr.Row():
with gr.Column():
gr.Markdown("## 📙 Citation")
gr.Markdown("If you use [UniGenBench]() in your research, please cite our work:")
citation_textbox = gr.Textbox(
value=CITATION_BUTTON_TEXT,
elem_id="citation-textbox",
show_label=False,
interactive=False,
lines=8,
show_copy_button=True
)
if __name__ == "__main__":
demo.launch()