File size: 2,833 Bytes
4fc79a4
ff768e2
 
4fc79a4
 
29f87f1
4fc79a4
 
29f87f1
4fc79a4
 
 
29f87f1
4fc79a4
 
 
 
 
29f87f1
4fc79a4
 
 
 
 
 
 
 
 
 
 
 
29f87f1
 
1e2b302
29f87f1
1e2b302
29f87f1
1e2b302
29f87f1
7d1e58a
 
29f87f1
4fc79a4
1e2b302
 
29f87f1
4fc79a4
1e2b302
4fc79a4
e6ca829
29f87f1
ccd7bab
 
e6ca829
 
29f87f1
e6ca829
29f87f1
e6ca829
29f87f1
 
e6ca829
29f87f1
1e2b302
e6ca829
29f87f1
 
4fc79a4
 
 
29f87f1
 
 
 
 
 
 
 
 
4fc79a4
 
29f87f1
e6ca829
4fc79a4
29f87f1
4fc79a4
29f87f1
4fc79a4
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
import io
import google.generativeai as genai
from PIL import Image

def process_file(api_key, file, instructions):
    # Configure Gemini API
    genai.configure(api_key=api_key)
    model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25')

    # Read uploaded file
    if file.name.endswith('.csv'):
        df = pd.read_csv(file.name)
    else:
        df = pd.read_excel(file.name)

    # Generate analysis prompt
    data_description = df.describe().to_string()
    columns_info = "\n".join([f"{col}: {df[col].dtype}" for col in df.columns])
    prompt = f"""
    Given this dataset:
    Columns and types:
    {columns_info}
    
    Data summary:
    {data_description}
    
    User instructions: {instructions if instructions else 'No specific instructions provided.'}
    
    Generate Python code for 3 different matplotlib visualizations. Only provide executable code without explanations.
    Format as:
    # Visualization 1
    [code]
    # Visualization 2
    [code]
    # Visualization 3
    [code]
    """

    # Get Gemini response
    response = model.generate_content(prompt)
    code = response.text.strip()

    # Process visualizations
    visualizations = []
    for i, viz_code in enumerate(code.split("# Visualization")[1:4], 1):
        plt.figure(figsize=(10, 6))
        try:
            # Clean and execute generated code
            cleaned_code = '\n'.join(line.strip() for line in viz_code.split('\n') if line.strip())
            exec(cleaned_code, {'df': df, 'plt': plt})
            plt.title(f"Visualization {i}")
            
            # Convert plot to Gradio-compatible format
            buf = io.BytesIO()
            plt.savefig(buf, format='png', bbox_inches='tight')
            plt.close()
            buf.seek(0)
            visualizations.append(Image.open(buf))
        except Exception as e:
            print(f"Visualization {i} error: {str(e)}")
            visualizations.append(None)

    # Ensure 3 outputs for Gradio
    return visualizations + [None]*(3-len(visualizations))

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("""# AI-Powered Data Visualizer
    Upload your data file and get automatic visualizations powered by Gemini""")
    
    with gr.Row():
        api_key = gr.Textbox(label="Gemini API Key", type="password")
        instructions = gr.Textbox(label="Custom Instructions (optional)")
    
    file = gr.File(label="Dataset (CSV/Excel)", file_types=[".csv", ".xlsx"])
    submit = gr.Button("Generate Insights", variant="primary")
    
    with gr.Row():
        outputs = [gr.Image(label=f"Visualization {i+1}") for i in range(3)]

    submit.click(
        process_file,
        inputs=[api_key, file, instructions],
        outputs=outputs
    )

demo.launch()