Spaces:
Running
Running
Shiyu Zhao
commited on
Commit
·
b16c4b6
1
Parent(s):
df3974d
Update space
Browse files
app.py
CHANGED
@@ -14,11 +14,14 @@ from email.mime.text import MIMEText
|
|
14 |
from huggingface_hub import HfApi
|
15 |
import shutil
|
16 |
import tempfile
|
17 |
-
|
18 |
-
from
|
19 |
-
from
|
20 |
-
|
21 |
-
from
|
|
|
|
|
|
|
22 |
from stark_qa import load_qa
|
23 |
from stark_qa.evaluator import Evaluator
|
24 |
|
@@ -32,8 +35,6 @@ try:
|
|
32 |
except Exception as e:
|
33 |
raise RuntimeError(f"Failed to initialize HuggingFace Hub storage: {e}")
|
34 |
|
35 |
-
# Global lock for thread-safe operations
|
36 |
-
result_lock = Lock()
|
37 |
|
38 |
def process_single_instance(args):
|
39 |
"""Process a single instance with improved prediction handling"""
|
@@ -210,7 +211,6 @@ def compute_metrics(csv_path: str, dataset: str, split: str, num_workers: int =
|
|
210 |
print(error_msg)
|
211 |
return error_msg
|
212 |
|
213 |
-
|
214 |
# Data dictionaries for leaderboard
|
215 |
data_synthesized_full = {
|
216 |
'Method': ['BM25', 'DPR (roberta)', 'ANCE (roberta)', 'QAGNN (roberta)', 'ada-002', 'voyage-l2-instruct', 'LLM2Vec', 'GritLM-7b', 'multi-ada-002', 'ColBERTv2'],
|
@@ -289,32 +289,23 @@ def validate_github_url(url):
|
|
289 |
)
|
290 |
return bool(github_pattern.match(url))
|
291 |
|
292 |
-
def validate_csv(
|
293 |
-
"""Validate CSV file format and content
|
294 |
try:
|
295 |
-
df = pd.read_csv(
|
296 |
required_cols = ['query_id', 'pred_rank']
|
297 |
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
|
308 |
-
return False, f"pred_rank must be a list (row {idx})"
|
309 |
-
if len(rank_list) < 20:
|
310 |
-
return False, f"pred_rank must contain at least 20 candidates (row {idx})"
|
311 |
-
except Exception as e:
|
312 |
-
return False, f"Invalid pred_rank format in row {idx}: {str(e)}"
|
313 |
-
|
314 |
return True, "Valid CSV file"
|
315 |
-
|
316 |
-
except pd.errors.EmptyDataError:
|
317 |
-
return False, "CSV file is empty"
|
318 |
except Exception as e:
|
319 |
return False, f"Error processing CSV: {str(e)}"
|
320 |
|
@@ -574,7 +565,7 @@ def save_submission(submission_data, csv_file):
|
|
574 |
def update_leaderboard_data(submission_data):
|
575 |
"""
|
576 |
Update leaderboard data with new submission results
|
577 |
-
Only
|
578 |
"""
|
579 |
global df_synthesized_full, df_synthesized_10, df_human_generated
|
580 |
|
@@ -586,32 +577,26 @@ def update_leaderboard_data(submission_data):
|
|
586 |
}
|
587 |
|
588 |
df_to_update = split_to_df[submission_data['Split']]
|
589 |
-
dataset = submission_data['Dataset'].upper()
|
590 |
|
591 |
-
# Prepare new row data
|
592 |
new_row = {
|
593 |
-
'Method': submission_data['Method Name']
|
|
|
|
|
|
|
|
|
594 |
}
|
595 |
-
# Only add metrics for the submitted dataset
|
596 |
-
new_row.update({
|
597 |
-
f'STARK-{dataset}_Hit@1': submission_data['results']['hit@1'],
|
598 |
-
f'STARK-{dataset}_Hit@5': submission_data['results']['hit@5'],
|
599 |
-
f'STARK-{dataset}_R@20': submission_data['results']['recall@20'],
|
600 |
-
f'STARK-{dataset}_MRR': submission_data['results']['mrr']
|
601 |
-
})
|
602 |
|
603 |
# Check if method already exists
|
604 |
method_mask = df_to_update['Method'] == submission_data['Method Name']
|
605 |
if method_mask.any():
|
606 |
-
# Update
|
607 |
for col in new_row:
|
608 |
df_to_update.loc[method_mask, col] = new_row[col]
|
609 |
else:
|
610 |
-
#
|
611 |
df_to_update.loc[len(df_to_update)] = new_row
|
612 |
|
613 |
-
|
614 |
-
|
615 |
# Function to get emails from meta_data
|
616 |
def get_emails_from_metadata(meta_data):
|
617 |
"""
|
@@ -716,93 +701,143 @@ def process_submission(
|
|
716 |
method_name, team_name, dataset, split, contact_email,
|
717 |
code_repo, csv_file, model_description, hardware, paper_link, model_type
|
718 |
):
|
719 |
-
"""Process
|
720 |
temp_files = []
|
721 |
-
start_time = time.time()
|
722 |
try:
|
723 |
-
#
|
724 |
-
yield "Validating submission details..."
|
725 |
if not all([method_name, team_name, dataset, split, contact_email, code_repo, csv_file, model_type]):
|
726 |
return "Error: Please fill in all required fields"
|
727 |
|
728 |
-
#
|
729 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
730 |
temp_csv_path = None
|
731 |
if isinstance(csv_file, str):
|
732 |
temp_csv_path = csv_file
|
733 |
else:
|
734 |
-
|
735 |
-
|
736 |
-
|
737 |
-
|
|
|
738 |
shutil.copy2(csv_file.name, temp_csv_path)
|
739 |
-
|
740 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
741 |
|
742 |
-
|
743 |
-
|
744 |
-
try:
|
745 |
-
df = pd.read_csv(temp_csv_path)
|
746 |
-
if 'query_id' not in df.columns or 'pred_rank' not in df.columns:
|
747 |
-
return "Error: CSV must contain 'query_id' and 'pred_rank' columns"
|
748 |
-
except Exception as e:
|
749 |
-
return f"Error reading CSV: {str(e)}"
|
750 |
|
751 |
-
#
|
752 |
-
yield f"Computing metrics for {dataset}..."
|
753 |
results = compute_metrics(
|
754 |
csv_path=temp_csv_path,
|
755 |
dataset=dataset.lower(),
|
756 |
split=split,
|
757 |
-
|
758 |
)
|
759 |
|
760 |
if isinstance(results, str):
|
|
|
761 |
return f"Evaluation error: {results}"
|
762 |
|
763 |
-
#
|
764 |
-
yield "Processing results..."
|
765 |
processed_results = {
|
766 |
"hit@1": round(results['hit@1'] * 100, 2),
|
767 |
"hit@5": round(results['hit@5'] * 100, 2),
|
768 |
"recall@20": round(results['recall@20'] * 100, 2),
|
769 |
"mrr": round(results['mrr'] * 100, 2)
|
770 |
}
|
771 |
-
|
772 |
-
# 6. Save submission
|
773 |
-
yield "Saving submission..."
|
774 |
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
775 |
-
folder_name = f"{sanitize_name(method_name)}_{sanitize_name(team_name)}"
|
776 |
|
777 |
-
|
778 |
-
"Method Name": method_name,
|
779 |
-
"Team Name": team_name,
|
780 |
-
"Dataset": dataset,
|
781 |
-
"Split": split,
|
782 |
-
"Contact Email(s)": contact_email,
|
783 |
-
"Code Repository": code_repo,
|
784 |
-
"Model Description": model_description,
|
785 |
-
"Hardware": hardware,
|
786 |
-
"Paper link": paper_link,
|
787 |
-
"Model Type": model_type,
|
788 |
-
"results": processed_results
|
789 |
-
}
|
790 |
-
|
791 |
try:
|
792 |
-
# Save
|
793 |
-
|
|
|
794 |
hub_storage.save_to_hub(
|
795 |
file_content=temp_csv_path,
|
796 |
path_in_repo=csv_path_in_repo,
|
797 |
-
commit_message=f"Add submission: {method_name}"
|
798 |
)
|
799 |
-
except Exception as e:
|
800 |
-
return f"Error saving to HuggingFace Hub: {str(e)}"
|
801 |
|
802 |
-
|
803 |
-
|
804 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
805 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
806 |
return f"""
|
807 |
Submission successful!
|
808 |
|
@@ -812,20 +847,29 @@ def process_submission(
|
|
812 |
Recall@20: {processed_results['recall@20']:.2f}%
|
813 |
MRR: {processed_results['mrr']:.2f}%
|
814 |
|
815 |
-
Your submission
|
|
|
|
|
|
|
|
|
|
|
|
|
816 |
"""
|
817 |
-
|
818 |
except Exception as e:
|
819 |
-
|
820 |
-
|
|
|
821 |
finally:
|
|
|
822 |
for temp_file in temp_files:
|
823 |
try:
|
824 |
if os.path.exists(temp_file):
|
825 |
os.unlink(temp_file)
|
826 |
except Exception as e:
|
827 |
-
print(f"Warning: Failed to delete {temp_file}: {str(e)}")
|
828 |
-
|
|
|
829 |
def filter_by_model_type(df, selected_types):
|
830 |
"""
|
831 |
Filter DataFrame by selected model types, including submitted models.
|
@@ -842,24 +886,10 @@ def filter_by_model_type(df, selected_types):
|
|
842 |
return df[df['Method'].isin(selected_models)]
|
843 |
|
844 |
def format_dataframe(df, dataset):
|
845 |
-
"""
|
846 |
-
Format DataFrame for display, removing rows with no data for the selected dataset
|
847 |
-
"""
|
848 |
-
# Select relevant columns
|
849 |
columns = ['Method'] + [col for col in df.columns if dataset in col]
|
850 |
filtered_df = df[columns].copy()
|
851 |
-
|
852 |
-
# Remove rows where all metric columns are empty/NaN for this dataset
|
853 |
-
metric_columns = [col for col in filtered_df.columns if col != 'Method']
|
854 |
-
filtered_df = filtered_df.dropna(subset=metric_columns, how='all')
|
855 |
-
|
856 |
-
# Rename columns to remove dataset prefix
|
857 |
filtered_df.columns = [col.split('_')[-1] if '_' in col else col for col in filtered_df.columns]
|
858 |
-
|
859 |
-
# Sort by MRR
|
860 |
-
if 'MRR' in filtered_df.columns:
|
861 |
-
filtered_df = filtered_df.sort_values('MRR', ascending=False)
|
862 |
-
|
863 |
return filtered_df
|
864 |
|
865 |
def update_tables(selected_types):
|
@@ -1023,9 +1053,8 @@ with gr.Blocks(css=css) as demo:
|
|
1023 |
method_name, team_name, dataset, split, contact_email,
|
1024 |
code_repo, csv_file, model_description, hardware, paper_link, model_type
|
1025 |
],
|
1026 |
-
outputs=result
|
1027 |
-
|
1028 |
-
).success( # Add success handler to update tables
|
1029 |
fn=update_tables,
|
1030 |
inputs=[model_type_filter],
|
1031 |
outputs=all_dfs
|
|
|
14 |
from huggingface_hub import HfApi
|
15 |
import shutil
|
16 |
import tempfile
|
17 |
+
|
18 |
+
from stark_qa import load_qa
|
19 |
+
from stark_qa.evaluator import Evaluator
|
20 |
+
|
21 |
+
from utils.hub_storage import HubStorage
|
22 |
+
from utils.token_handler import TokenHandler
|
23 |
+
|
24 |
+
|
25 |
from stark_qa import load_qa
|
26 |
from stark_qa.evaluator import Evaluator
|
27 |
|
|
|
35 |
except Exception as e:
|
36 |
raise RuntimeError(f"Failed to initialize HuggingFace Hub storage: {e}")
|
37 |
|
|
|
|
|
38 |
|
39 |
def process_single_instance(args):
|
40 |
"""Process a single instance with improved prediction handling"""
|
|
|
211 |
print(error_msg)
|
212 |
return error_msg
|
213 |
|
|
|
214 |
# Data dictionaries for leaderboard
|
215 |
data_synthesized_full = {
|
216 |
'Method': ['BM25', 'DPR (roberta)', 'ANCE (roberta)', 'QAGNN (roberta)', 'ada-002', 'voyage-l2-instruct', 'LLM2Vec', 'GritLM-7b', 'multi-ada-002', 'ColBERTv2'],
|
|
|
289 |
)
|
290 |
return bool(github_pattern.match(url))
|
291 |
|
292 |
+
def validate_csv(file_obj):
|
293 |
+
"""Validate CSV file format and content"""
|
294 |
try:
|
295 |
+
df = pd.read_csv(file_obj.name)
|
296 |
required_cols = ['query_id', 'pred_rank']
|
297 |
|
298 |
+
if not all(col in df.columns for col in required_cols):
|
299 |
+
return False, "CSV must contain 'query_id' and 'pred_rank' columns"
|
300 |
+
|
301 |
+
try:
|
302 |
+
first_rank = eval(df['pred_rank'].iloc[0]) if isinstance(df['pred_rank'].iloc[0], str) else df['pred_rank'].iloc[0]
|
303 |
+
if not isinstance(first_rank, list) or len(first_rank) < 20:
|
304 |
+
return False, "pred_rank must be a list with at least 20 candidates"
|
305 |
+
except:
|
306 |
+
return False, "Invalid pred_rank format"
|
307 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
308 |
return True, "Valid CSV file"
|
|
|
|
|
|
|
309 |
except Exception as e:
|
310 |
return False, f"Error processing CSV: {str(e)}"
|
311 |
|
|
|
565 |
def update_leaderboard_data(submission_data):
|
566 |
"""
|
567 |
Update leaderboard data with new submission results
|
568 |
+
Only uses model name in the displayed table
|
569 |
"""
|
570 |
global df_synthesized_full, df_synthesized_10, df_human_generated
|
571 |
|
|
|
577 |
}
|
578 |
|
579 |
df_to_update = split_to_df[submission_data['Split']]
|
|
|
580 |
|
581 |
+
# Prepare new row data
|
582 |
new_row = {
|
583 |
+
'Method': submission_data['Method Name'], # Only use method name in table
|
584 |
+
f'STARK-{submission_data["Dataset"].upper()}_Hit@1': submission_data['results']['hit@1'],
|
585 |
+
f'STARK-{submission_data["Dataset"].upper()}_Hit@5': submission_data['results']['hit@5'],
|
586 |
+
f'STARK-{submission_data["Dataset"].upper()}_R@20': submission_data['results']['recall@20'],
|
587 |
+
f'STARK-{submission_data["Dataset"].upper()}_MRR': submission_data['results']['mrr']
|
588 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
589 |
|
590 |
# Check if method already exists
|
591 |
method_mask = df_to_update['Method'] == submission_data['Method Name']
|
592 |
if method_mask.any():
|
593 |
+
# Update existing row
|
594 |
for col in new_row:
|
595 |
df_to_update.loc[method_mask, col] = new_row[col]
|
596 |
else:
|
597 |
+
# Add new row
|
598 |
df_to_update.loc[len(df_to_update)] = new_row
|
599 |
|
|
|
|
|
600 |
# Function to get emails from meta_data
|
601 |
def get_emails_from_metadata(meta_data):
|
602 |
"""
|
|
|
701 |
method_name, team_name, dataset, split, contact_email,
|
702 |
code_repo, csv_file, model_description, hardware, paper_link, model_type
|
703 |
):
|
704 |
+
"""Process and validate submission"""
|
705 |
temp_files = []
|
|
|
706 |
try:
|
707 |
+
# Input validation
|
|
|
708 |
if not all([method_name, team_name, dataset, split, contact_email, code_repo, csv_file, model_type]):
|
709 |
return "Error: Please fill in all required fields"
|
710 |
|
711 |
+
# Validate model type
|
712 |
+
is_valid, message = validate_model_type(method_name, model_type)
|
713 |
+
if not is_valid:
|
714 |
+
return f"Error: {message}"
|
715 |
+
|
716 |
+
# Create metadata
|
717 |
+
meta_data = {
|
718 |
+
"Method Name": method_name,
|
719 |
+
"Team Name": team_name,
|
720 |
+
"Dataset": dataset,
|
721 |
+
"Split": split,
|
722 |
+
"Contact Email(s)": contact_email,
|
723 |
+
"Code Repository": code_repo,
|
724 |
+
"Model Description": model_description,
|
725 |
+
"Hardware": hardware,
|
726 |
+
"(Optional) Paper link": paper_link,
|
727 |
+
"Model Type": model_type
|
728 |
+
}
|
729 |
+
|
730 |
+
# Generate folder name and timestamp
|
731 |
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
732 |
+
folder_name = f"{sanitize_name(method_name)}_{sanitize_name(team_name)}"
|
733 |
+
|
734 |
+
# Process CSV file
|
735 |
temp_csv_path = None
|
736 |
if isinstance(csv_file, str):
|
737 |
temp_csv_path = csv_file
|
738 |
else:
|
739 |
+
temp_fd, temp_csv_path = tempfile.mkstemp(suffix='.csv')
|
740 |
+
temp_files.append(temp_csv_path)
|
741 |
+
os.close(temp_fd)
|
742 |
+
|
743 |
+
if hasattr(csv_file, 'name'):
|
744 |
shutil.copy2(csv_file.name, temp_csv_path)
|
745 |
+
else:
|
746 |
+
with open(temp_csv_path, 'wb') as temp_file:
|
747 |
+
if hasattr(csv_file, 'seek'):
|
748 |
+
csv_file.seek(0)
|
749 |
+
if hasattr(csv_file, 'read'):
|
750 |
+
shutil.copyfileobj(csv_file, temp_file)
|
751 |
+
else:
|
752 |
+
temp_file.write(csv_file)
|
753 |
|
754 |
+
if not os.path.exists(temp_csv_path):
|
755 |
+
raise FileNotFoundError(f"Failed to create temporary CSV file at {temp_csv_path}")
|
|
|
|
|
|
|
|
|
|
|
|
|
756 |
|
757 |
+
# Compute metrics
|
|
|
758 |
results = compute_metrics(
|
759 |
csv_path=temp_csv_path,
|
760 |
dataset=dataset.lower(),
|
761 |
split=split,
|
762 |
+
num_workers=4
|
763 |
)
|
764 |
|
765 |
if isinstance(results, str):
|
766 |
+
# send_error_notification(meta_data, results)
|
767 |
return f"Evaluation error: {results}"
|
768 |
|
769 |
+
# Process results
|
|
|
770 |
processed_results = {
|
771 |
"hit@1": round(results['hit@1'] * 100, 2),
|
772 |
"hit@5": round(results['hit@5'] * 100, 2),
|
773 |
"recall@20": round(results['recall@20'] * 100, 2),
|
774 |
"mrr": round(results['mrr'] * 100, 2)
|
775 |
}
|
|
|
|
|
|
|
|
|
|
|
776 |
|
777 |
+
# Save files to HuggingFace Hub
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
778 |
try:
|
779 |
+
# 1. Save CSV file
|
780 |
+
csv_filename = f"predictions_{timestamp}.csv"
|
781 |
+
csv_path_in_repo = f"submissions/{folder_name}/{csv_filename}"
|
782 |
hub_storage.save_to_hub(
|
783 |
file_content=temp_csv_path,
|
784 |
path_in_repo=csv_path_in_repo,
|
785 |
+
commit_message=f"Add submission: {method_name} by {team_name}"
|
786 |
)
|
|
|
|
|
787 |
|
788 |
+
# 2. Save metadata
|
789 |
+
submission_data = {
|
790 |
+
**meta_data,
|
791 |
+
"results": processed_results,
|
792 |
+
"status": "approved", # or "pending_review"
|
793 |
+
"submission_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
794 |
+
"csv_path": csv_path_in_repo
|
795 |
+
}
|
796 |
+
|
797 |
+
metadata_fd, temp_metadata_path = tempfile.mkstemp(suffix='.json')
|
798 |
+
temp_files.append(temp_metadata_path)
|
799 |
+
os.close(metadata_fd)
|
800 |
+
|
801 |
+
with open(temp_metadata_path, 'w') as f:
|
802 |
+
json.dump(submission_data, f, indent=4)
|
803 |
+
|
804 |
+
metadata_path = f"submissions/{folder_name}/metadata_{timestamp}.json"
|
805 |
+
hub_storage.save_to_hub(
|
806 |
+
file_content=temp_metadata_path,
|
807 |
+
path_in_repo=metadata_path,
|
808 |
+
commit_message=f"Add metadata: {method_name} by {team_name}"
|
809 |
+
)
|
810 |
+
|
811 |
+
# 3. Create or update latest.json
|
812 |
+
latest_info = {
|
813 |
+
"latest_submission": timestamp,
|
814 |
+
"status": "approved", # or "pending_review"
|
815 |
+
"method_name": method_name,
|
816 |
+
"team_name": team_name
|
817 |
+
}
|
818 |
+
|
819 |
+
latest_fd, temp_latest_path = tempfile.mkstemp(suffix='.json')
|
820 |
+
temp_files.append(temp_latest_path)
|
821 |
+
os.close(latest_fd)
|
822 |
+
|
823 |
+
with open(temp_latest_path, 'w') as f:
|
824 |
+
json.dump(latest_info, f, indent=4)
|
825 |
+
|
826 |
+
latest_path = f"submissions/{folder_name}/latest.json"
|
827 |
+
hub_storage.save_to_hub(
|
828 |
+
file_content=temp_latest_path,
|
829 |
+
path_in_repo=latest_path,
|
830 |
+
commit_message=f"Update latest submission info for {method_name}"
|
831 |
+
)
|
832 |
|
833 |
+
except Exception as e:
|
834 |
+
raise RuntimeError(f"Failed to save files to HuggingFace Hub: {str(e)}")
|
835 |
+
|
836 |
+
# Send confirmation email and update leaderboard data
|
837 |
+
# send_submission_confirmation(meta_data, processed_results)
|
838 |
+
update_leaderboard_data(submission_data)
|
839 |
+
|
840 |
+
# Return success message
|
841 |
return f"""
|
842 |
Submission successful!
|
843 |
|
|
|
847 |
Recall@20: {processed_results['recall@20']:.2f}%
|
848 |
MRR: {processed_results['mrr']:.2f}%
|
849 |
|
850 |
+
Your submission has been saved and a confirmation email has been sent to {contact_email}.
|
851 |
+
Once approved, your results will appear in the leaderboard under: {method_name}
|
852 |
+
|
853 |
+
You can find your submission at:
|
854 |
+
https://huggingface.co/spaces/{REPO_ID}/tree/main/submissions/{folder_name}
|
855 |
+
|
856 |
+
Please refresh the page to see your submission in the leaderboard.
|
857 |
"""
|
858 |
+
|
859 |
except Exception as e:
|
860 |
+
error_message = f"Error processing submission: {str(e)}"
|
861 |
+
# send_error_notification(meta_data, error_message)
|
862 |
+
return error_message
|
863 |
finally:
|
864 |
+
# Clean up temporary files
|
865 |
for temp_file in temp_files:
|
866 |
try:
|
867 |
if os.path.exists(temp_file):
|
868 |
os.unlink(temp_file)
|
869 |
except Exception as e:
|
870 |
+
print(f"Warning: Failed to delete temporary file {temp_file}: {str(e)}")
|
871 |
+
|
872 |
+
|
873 |
def filter_by_model_type(df, selected_types):
|
874 |
"""
|
875 |
Filter DataFrame by selected model types, including submitted models.
|
|
|
886 |
return df[df['Method'].isin(selected_models)]
|
887 |
|
888 |
def format_dataframe(df, dataset):
|
|
|
|
|
|
|
|
|
889 |
columns = ['Method'] + [col for col in df.columns if dataset in col]
|
890 |
filtered_df = df[columns].copy()
|
|
|
|
|
|
|
|
|
|
|
|
|
891 |
filtered_df.columns = [col.split('_')[-1] if '_' in col else col for col in filtered_df.columns]
|
892 |
+
filtered_df = filtered_df.sort_values('MRR', ascending=False)
|
|
|
|
|
|
|
|
|
893 |
return filtered_df
|
894 |
|
895 |
def update_tables(selected_types):
|
|
|
1053 |
method_name, team_name, dataset, split, contact_email,
|
1054 |
code_repo, csv_file, model_description, hardware, paper_link, model_type
|
1055 |
],
|
1056 |
+
outputs=result
|
1057 |
+
).success( # Add a success handler to update tables after successful submission
|
|
|
1058 |
fn=update_tables,
|
1059 |
inputs=[model_type_filter],
|
1060 |
outputs=all_dfs
|