bluenevus's picture
Update app.py
e5b6950 verified
raw
history blame
2.8 kB
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):
genai.configure(api_key=api_key)
model = genai.GenerativeModel('gemini-2.5-pro-preview-03-25')
# Read file
if file.name.endswith('.csv'):
df = pd.read_csv(file.name)
else:
df = pd.read_excel(file.name)
# Updated prompt with valid matplotlib styles
prompt = f"""Generate 3 matplotlib codes with these requirements:
1. Start with: plt.figure(figsize=(16,9), dpi=120)
2. Use one of these styles: ggplot, bmh, dark_background, fast
3. Include: title, labels, grid, legend if needed
4. Different chart types (bar, line, scatter, etc)
Data columns: {list(df.columns)}
Sample data: {df.head(3).to_dict()}
User instructions: {instructions or 'None'}
Format exactly as:
# Visualization 1
plt.figure(figsize=(16,9), dpi=120)
plt.style.use('ggplot') # Example valid style
[code]
plt.tight_layout()
"""
response = model.generate_content(prompt)
code_blocks = response.text.split("# Visualization ")[1:4]
visualizations = []
for i, block in enumerate(code_blocks, 1):
try:
cleaned_code = '\n'.join([
line.strip() for line in block.split('\n')
if line.strip() and not line.startswith('```')
])
buf = io.BytesIO()
plt.figure(figsize=(16, 9), dpi=120)
# Execute code with safe environment
exec_env = {
'df': df,
'plt': plt,
'pd': pd
}
exec(cleaned_code, exec_env)
plt.tight_layout()
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)
return visualizations + [None]*(3-len(visualizations))
# Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Data Visualization Tool")
with gr.Row():
api_key = gr.Textbox(label="Gemini API Key", type="password")
file = gr.File(label="Upload CSV/Excel", file_types=[".csv", ".xlsx"])
instructions = gr.Textbox(label="Custom Instructions")
submit = gr.Button("Generate Visualizations")
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()