import gradio as gr import pandas as pd def get_data_product_id_from_table(evt: gr.SelectData): id=evt.value return get_data_product_id(id) def get_data_product_id(id): print(id) image_path_front = dataset_merged_df.loc[dataset_merged_df['ID'] == id, 'Front photo'].values[0] image_path_ingredients = dataset_merged_df.loc[dataset_merged_df['ID'] == id, 'Ingredients photo'].values[0] image_path_nutritionals = dataset_merged_df.loc[dataset_merged_df['ID'] == id, 'Nutritionals photo'].values[0] features = ['brand', 'product_name', 'ingredients', 'energy_kj', 'energy_kcal', 'fat', 'saturated_fat', 'carbohydrates', 'sugars', 'fibers', 'proteins', 'salt'] data = [] for feature in features: product_values = dataset_merged_df.loc[dataset_merged_df['ID'] == id, [f'Reference_{feature}',f'Predicted_{feature}',f'accuracy_score_{feature}']] product_values_list = product_values.values.flatten().tolist() data.append([feature]+product_values_list) data = pd.DataFrame(data, columns=['Feature', 'Reference value', 'Predicted value', 'Accuracy score']) gradients = 1-data['Accuracy score'] data = data.map(lambda x: f'{x:g}' if isinstance(x, float) else x) data = data.style.background_gradient(axis=0, gmap=gradients, cmap='summer', vmin=0, vmax=1) plots = [image_path_front, image_path_ingredients, image_path_nutritionals] return {data_df: data, data_plot: plots, } def load_data(filepath): global dataset_merged_df global dataset_metadata dataset_merged_df = pd.read_csv(f"{filepath}") dataset_merged_df['mean_accuracy_score'] = dataset_merged_df.filter(regex='^accuracy_score').mean(axis=1) dataset_df = dataset_merged_df[['ID', 'Reference_brand', 'Reference_product_name', 'mean_accuracy_score']].copy() dataset_df = dataset_df.style.background_gradient(axis=0, gmap=1-dataset_df['mean_accuracy_score'], cmap='summer', vmin=0, vmax=1) return dataset_df def toggle_row_visibility(show): if show: return gr.update(visible=True) else: return gr.update(visible=False) # Custom CSS to set max height for the rows custom_css = """ .dataframe-wrap { max-height: 300px; /* Set the desired height */ overflow-y: scroll; } """ with gr.Blocks(css=custom_css) as demo: gr.HTML("

Euroconsumers Food Data Lake

") gr.HTML("

Food data processing

") with gr.Row(): file_input = gr.File(label="Upload CSV File", type="filepath") with gr.Row(visible=False) as dataset_block: with gr.Column(): gr.HTML("

Dataset summary

") with gr.Row(): gr.HTML("Click on a product ID (FIRST COLUMN) in the table to view product details") # Display summary of the dataset - ID, Reference_brand, Reference_product_name, mean_accuracy_score with gr.Row(elem_classes="dataframe-wrap"): dataframe_component = gr.DataFrame() with gr.Row(visible=False) as product_detail_block: with gr.Column(): # Section for product details gr.HTML("

Product details

") # Display product photos data_plot = gr.Gallery(label="Product photos", show_label=True, elem_id="gallery" , columns=[3], rows=[1], object_fit="contain", height="auto") # Display product data # https://github.com/gradio-app/gradio/pull/5894 data_df = gr.Dataframe(label="Product data", scale=2, column_widths=["10%", "40%", "40%", "10%"], wrap=True) ### Control functions # Linking the select_dataset change event to update both the gradio DataFrame and product_ids dropdown file_input.change(load_data, inputs=file_input, outputs=dataframe_component) # Toggle visibility of the dataset block file_input.change(toggle_row_visibility, inputs=file_input, outputs=dataset_block) # Update the product data and plots when a product ID is clicked in the dataframe dataframe_component.select(fn=get_data_product_id_from_table, outputs=[data_df, data_plot]) # Toggle visibility of the product detail block dataframe_component.select(toggle_row_visibility, inputs=file_input, outputs=product_detail_block) demo.launch(debug=True)