import gradio as gr from datetime import datetime from risk_model import predict_risk import pandas as pd import plotly.express as px import logging import os # Setup logging logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s") logger = logging.getLogger(__name__) # Store prediction history history = [] def gradio_predict_risk(temperature, duration): """ Makes predictions and updates the history of predictions. Args: temperature (float): Temperature in °C duration (float): Duration in minutes Returns: tuple: (prediction output, history table, history plot) """ try: # Validate inputs temperature = float(temperature) duration = float(duration) # Make prediction risk_level, risk_score, alert = predict_risk(temperature, duration) # Generate timestamp timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # Update history history.append({ "timestamp": timestamp, "temperature": temperature, "duration": duration, "risk_level": risk_level, "risk_score": risk_score, "alert": alert }) # Keep only the last 10 predictions if len(history) > 10: history.pop(0) # Format prediction output prediction_output = ( f"**Risk Level**: {risk_level}\n" f"**Risk Score**: {risk_score}% (Model Confidence)\n" f"**Alert**: {alert}\n" f"**Timestamp**: {timestamp}" ) # Format history output history_df = pd.DataFrame(history) history_output = history_df.to_markdown(index=False) if not history_df.empty else "No predictions yet." # Generate history plot history_plot = create_history_plot(history_df) logger.info(f"Prediction made: Temperature={temperature}°C, Duration={duration} min, Result={prediction_output}") return prediction_output, history_output, history_plot except ValueError as e: logger.error(f"Input error: {e}") return f"Error: {e}", "No predictions yet.", None except Exception as e: logger.error(f"Unexpected error: {e}") return f"Error: An unexpected error occurred: {e}", "No predictions yet.", None def create_history_plot(history_df): """ Creates a scatter plot of prediction history using Plotly. Args: history_df (pd.DataFrame): DataFrame containing prediction history Returns: plotly.graph_objects.Figure: Plotly figure for scatter plot """ if history_df.empty: return None # Define colors for risk levels colors = { "Low": "#4CAF50", # Green "Moderate": "#FFC107", # Amber "High": "#F44336" # Red } # Create scatter plot fig = px.scatter( history_df, x="temperature", y="duration", color="risk_level", color_discrete_map=colors, title="Prediction History", labels={"temperature": "Temperature (°C)", "duration": "Duration (min)"}, hover_data=["timestamp", "risk_score", "alert"] ) # Update layout fig.update_layout( xaxis_range=[50, 200], yaxis_range=[5, 120], showlegend=True, template="plotly_dark" # Use dark theme for compatibility ) return fig # Create Gradio interface with gr.Blocks(theme=gr.themes.Soft()) as iface: gr.Markdown("# Heating Mantle Risk Prediction") gr.Markdown("Enter temperature and duration to predict the risk level of the heating mantle operation.") with gr.Row(): temp_input = gr.Slider(minimum=50, maximum=200, value=100, label="Temperature (°C)", step=1) duration_input = gr.Slider(minimum=5, maximum=120, value=30, label="Duration (min)", step=1) predict_button = gr.Button("Predict Risk") with gr.Row(): with gr.Column(): prediction_output = gr.Textbox(label="Prediction Result", lines=5) history_output = gr.Textbox(label="Prediction History (Last 10)", lines=10) with gr.Column(): history_plot = gr.Plot(label="Prediction History Plot") predict_button.click( fn=gradio_predict_risk, inputs=[temp_input, duration_input], outputs=[prediction_output, history_output, history_plot] )