File size: 3,355 Bytes
4fc79a4
ff768e2
 
4fc79a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7d1e58a
 
4fc79a4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bfc4e12
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
import io
import base64
import google.generativeai as genai

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

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

    # Analyze data and get visualization suggestions from Gemini
    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.'}
    
    Suggest 3 ways to visualize this data. For each visualization:
    1. Describe the visualization type and what it will show.
    2. Provide Python code using matplotlib to create the visualization.
    3. Explain why this visualization is useful for understanding the data.
    
    Format your response as:
    Visualization 1:
    Description: ...
    Code: ...
    Explanation: ...
    
    Visualization 2:
    ...
    
    Visualization 3:
    ...
    """

    response = model.generate_content(prompt)
    suggestions = response.text.split("Visualization")

    visualizations = []
    for i, suggestion in enumerate(suggestions[1:4], 1):  # Process only the first 3 visualizations
        parts = suggestion.split("Code:")
        description = parts[0].strip()
        code = parts[1].split("Explanation:")[0].strip()
        
        # Execute the code
        plt.figure(figsize=(10, 6))
        exec(code)
        plt.title(f"Visualization {i}")
        
        # Save the plot to a BytesIO object
        buf = io.BytesIO()
        plt.savefig(buf, format='png')
        buf.seek(0)
        img_str = base64.b64encode(buf.getvalue()).decode()
        plt.close()
        
        visualizations.append((f"data:image/png;base64,{img_str}", description, code))

    return visualizations

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# Data Visualization with Gemini")
    api_key = gr.Textbox(label="Enter Gemini API Key", type="password")
    file = gr.File(label="Upload Excel or CSV file")
    instructions = gr.Textbox(label="Optional visualization instructions")
    submit = gr.Button("Generate Visualizations")
    
    with gr.Row():
        output1 = gr.Image(label="Visualization 1")
        output2 = gr.Image(label="Visualization 2")
        output3 = gr.Image(label="Visualization 3")
    
    with gr.Row():
        desc1 = gr.Textbox(label="Description 1")
        desc2 = gr.Textbox(label="Description 2")
        desc3 = gr.Textbox(label="Description 3")
    
    with gr.Row():
        code1 = gr.Code(language="python", label="Code 1")
        code2 = gr.Code(language="python", label="Code 2")
        code3 = gr.Code(language="python", label="Code 3")

    submit.click(
        fn=process_file,
        inputs=[api_key, file, instructions],
        outputs=[
            output1, desc1, code1,
            output2, desc2, code2,
            output3, desc3, code3
        ],
        show_progress=True,
    )

demo.launch()