cmcmaster's picture
Update app.py
42cef27 verified
import gradio as gr
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from io import StringIO
import sys
import contextlib
from sklearn import datasets, metrics, model_selection, preprocessing
import warnings
warnings.filterwarnings('ignore')
# Capture output helper
@contextlib.contextmanager
def capture_output():
new_out, new_err = StringIO(), StringIO()
old_out, old_err = sys.stdout, sys.stderr
try:
sys.stdout, sys.stderr = new_out, new_err
yield sys.stdout, sys.stderr
finally:
sys.stdout, sys.stderr = old_out, old_err
def execute_code(code: str):
"""
Execute the provided Python code and return the output
"""
# Initialize output components
output_text = ""
output_plot = None
output_df = None
# Create a namespace for code execution
namespace = {
'np': np,
'pd': pd,
'plt': plt,
'sns': sns,
'datasets': datasets,
'metrics': metrics,
'model_selection': model_selection,
'preprocessing': preprocessing
}
try:
# Capture print outputs
with capture_output() as (out, err):
# Execute the code
exec(code, namespace)
# Capture print statements
output_text = out.getvalue()
if err.getvalue():
output_text += "\nErrors:\n" + err.getvalue()
# Check if there's a plot and convert to image
if plt.gcf().axes:
# Save plot to a temporary file
import tempfile
import os
# Create a temporary file with .png extension
temp_dir = tempfile.gettempdir()
temp_file = os.path.join(temp_dir, f"plot_{os.getpid()}.png")
# Save the current figure
plt.savefig(temp_file, bbox_inches='tight', dpi=300)
plt.close()
# Set the output_plot to the file path
output_plot = temp_file
# Check for DataFrame output
for var in namespace:
if isinstance(namespace[var], pd.DataFrame):
output_df = namespace[var]
break
except Exception as e:
output_text = f"Error: {str(e)}"
return output_text, output_plot, output_df
# Create the Gradio interface
with gr.Blocks() as demo:
gr.Markdown("""
# Python Data Science Code Executor
Execute Python code with access to common data science libraries:
- NumPy (np)
- Pandas (pd)
- Matplotlib (plt)
- Seaborn (sns)
- Scikit-learn (datasets, metrics, model_selection, preprocessing)
""")
with gr.Row():
with gr.Column():
code_input = gr.Code(
label="Python Code",
language="python",
value="""# Example: Load and visualize iris dataset
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
# Create a scatter plot
plt.figure(figsize=(10, 6))
plt.scatter(df['sepal length (cm)'], df['sepal width (cm)'], c=df['target'])
plt.xlabel('Sepal Length (cm)')
plt.ylabel('Sepal Width (cm)')
plt.title('Iris Dataset - Sepal Length vs Width')
# Print first few rows
print("First 5 rows of the dataset:")
print(df.head())
"""
)
run_button = gr.Button("Execute Code", variant="primary")
with gr.Column():
output_text = gr.Textbox(label="Output", lines=5)
output_plot = gr.Image(label="Plot Output")
output_df = gr.Dataframe(label="DataFrame Output")
# Handle code execution
run_button.click(
fn=execute_code,
inputs=[code_input],
outputs=[output_text, output_plot, output_df]
)
# Launch the app
if __name__ == "__main__":
demo.launch()