import gradio as gr import pandas as pd import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots import io def create_dashboard(file, chart_type, x_column, y_column, color_column): """Create dashboard based on uploaded dataset""" if file is None: return None, "Please upload a CSV file" try: # Read the uploaded file if file.name.endswith('.csv'): df = pd.read_csv(file.name) elif file.name.endswith('.xlsx'): df = pd.read_excel(file.name) else: return None, "Please upload a CSV or Excel file" # Data info info = f""" Dataset Info: - Shape: {df.shape[0]} rows × {df.shape[1]} columns - Columns: {', '.join(df.columns.tolist())} - Memory usage: {df.memory_usage().sum()} bytes """ # Validate columns exist if x_column not in df.columns or y_column not in df.columns: return None, f"Columns not found. Available: {list(df.columns)}" # Create the chart based on type if chart_type == "Bar Chart": fig = px.bar(df, x=x_column, y=y_column, color=color_column if color_column in df.columns else None, title=f"{chart_type}: {y_column} by {x_column}") elif chart_type == "Line Chart": fig = px.line(df, x=x_column, y=y_column, color=color_column if color_column in df.columns else None, title=f"{chart_type}: {y_column} vs {x_column}") elif chart_type == "Scatter Plot": fig = px.scatter(df, x=x_column, y=y_column, color=color_column if color_column in df.columns else None, title=f"{chart_type}: {y_column} vs {x_column}") elif chart_type == "Histogram": fig = px.histogram(df, x=x_column, color=color_column if color_column in df.columns else None, title=f"{chart_type}: Distribution of {x_column}") elif chart_type == "Box Plot": fig = px.box(df, x=x_column, y=y_column, color=color_column if color_column in df.columns else None, title=f"{chart_type}: {y_column} by {x_column}") elif chart_type == "Multi-Chart Dashboard": # Create a comprehensive dashboard fig = make_subplots( rows=2, cols=2, subplot_titles=(f'{y_column} by {x_column}', f'Distribution of {x_column}', f'Correlation Plot', 'Summary Statistics'), specs=[[{"type": "bar"}, {"type": "histogram"}], [{"type": "scatter"}, {"type": "table"}]] ) # Bar chart fig.add_trace( go.Bar(x=df[x_column], y=df[y_column], name="Bar"), row=1, col=1 ) # Histogram fig.add_trace( go.Histogram(x=df[x_column], name="Distribution"), row=1, col=2 ) # Scatter plot if we have numeric columns numeric_cols = df.select_dtypes(include=['number']).columns if len(numeric_cols) >= 2: fig.add_trace( go.Scatter(x=df[numeric_cols[0]], y=df[numeric_cols[1]], mode='markers', name="Correlation"), row=2, col=1 ) # Summary table summary_df = df.describe() fig.add_trace( go.Table( header=dict(values=['Statistic'] + list(summary_df.columns)), cells=dict(values=[summary_df.index] + [summary_df[col] for col in summary_df.columns]) ), row=2, col=2 ) fig.update_layout(height=800, title="Comprehensive Dashboard") else: return None, "Chart type not supported" # Update layout fig.update_layout( template="plotly_white", width=800, height=600 ) return fig, info except Exception as e: return None, f"Error processing file: {str(e)}" def get_columns(file): """Extract column names from uploaded file""" if file is None: return gr.Dropdown(choices=[]) try: if file.name.endswith('.csv'): df = pd.read_csv(file.name) elif file.name.endswith('.xlsx'): df = pd.read_excel(file.name) else: return gr.Dropdown(choices=[]) columns = df.columns.tolist() return (gr.Dropdown(choices=columns, value=columns[0] if columns else None), gr.Dropdown(choices=columns, value=columns[1] if len(columns) > 1 else columns[0]), gr.Dropdown(choices=['None'] + columns, value='None')) except: return (gr.Dropdown(choices=[]), gr.Dropdown(choices=[]), gr.Dropdown(choices=[])) # Create Gradio interface with gr.Blocks(title="Dynamic Dashboard Creator") as demo: gr.Markdown("# 📊 Dynamic Dashboard Creator") gr.Markdown("Upload any CSV/Excel file and create interactive dashboards!") with gr.Row(): with gr.Column(scale=1): file_upload = gr.File( label="Upload Dataset (CSV or Excel)", file_types=[".csv", ".xlsx"] ) chart_type = gr.Dropdown( choices=["Bar Chart", "Line Chart", "Scatter Plot", "Histogram", "Box Plot", "Multi-Chart Dashboard"], label="Chart Type", value="Bar Chart" ) x_column = gr.Dropdown( label="X-axis Column", choices=[] ) y_column = gr.Dropdown( label="Y-axis Column", choices=[] ) color_column = gr.Dropdown( label="Color Column (Optional)", choices=[] ) create_btn = gr.Button("Create Dashboard", variant="primary") with gr.Column(scale=2): plot_output = gr.Plot(label="Dashboard") info_output = gr.Textbox(label="Dataset Info", lines=5) # Update column dropdowns when file is uploaded file_upload.change( fn=get_columns, inputs=[file_upload], outputs=[x_column, y_column, color_column] ) # Create dashboard when button is clicked create_btn.click( fn=create_dashboard, inputs=[file_upload, chart_type, x_column, y_column, color_column], outputs=[plot_output, info_output] ) if __name__ == "__main__": demo.launch(share=True)