Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
import numpy as np | |
# Flexoki colors for highlighting | |
HIGHLIGHT_COLORS = [ | |
"#D14D41", # Red | |
"#879A39", # Green | |
"#66A1DC", # Blue | |
"#D0A215", # Yellow | |
"#8E5F26", # Brown | |
] | |
def highlight_diff(*values): | |
unique_values = set(str(v) for v in values if pd.notna(v)) | |
if len(unique_values) == 1: | |
return str(values[0]) | |
highlighted = [] | |
for i, value in enumerate(values): | |
if pd.isna(value): | |
continue | |
highlighted.append( | |
f'<span style="background-color: {HIGHLIGHT_COLORS[i]}; color: white;">{value}</span>' | |
) | |
return " | ".join(highlighted) | |
def compare_csvs(*files): | |
valid_files = [f for f in files if f is not None] | |
if len(valid_files) < 2: | |
return "Please upload at least two CSV files.", None | |
# Read CSV files | |
dataframes = [pd.read_csv(file.name) for file in valid_files] | |
# Check if all dataframes have the same shape | |
if len(set(df.shape for df in dataframes)) > 1: | |
return ( | |
"The CSV files have different shapes. Please ensure they all have the same number of rows and columns.", | |
None, | |
) | |
# Create a combined dataframe for comparison | |
combined_df = dataframes[0].copy() | |
for col in combined_df.columns: | |
combined_df[col] = [ | |
highlight_diff(*values) for values in zip(*(df[col] for df in dataframes)) | |
] | |
# Calculate summary | |
total_cells = dataframes[0].size | |
different_cells = sum((dataframes[0] != df).sum().sum() for df in dataframes[1:]) | |
diff_percentage = (different_cells / (total_cells * (len(dataframes) - 1))) * 100 | |
summary = f"Total cells: {total_cells}\n" | |
summary += f"Different cells: {different_cells}\n" | |
summary += f"Percentage of differences: {diff_percentage:.2f}%" | |
return summary, combined_df.to_html(escape=False) | |
with gr.Blocks() as app: | |
gr.Markdown("# π Kindness - CSV Comparison") | |
with gr.Row(): | |
files = [gr.File(label=f"Upload CSV {i+1}") for i in range(5)] | |
compare_btn = gr.Button("Compare CSVs") | |
summary = gr.Textbox(label="Summary") | |
diff_output = gr.HTML(label="Differences") | |
compare_btn.click(compare_csvs, inputs=files, outputs=[summary, diff_output]) | |
app.launch() | |