Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import joblib | |
| import numpy as np | |
| import matplotlib.pyplot as plt | |
| # Load trained model and scaler | |
| model = joblib.load("aqi_model.pkl") | |
| scaler = joblib.load("scaler.pkl") | |
| # Function to create AQI gauge chart | |
| def create_aqi_gauge(aqi): | |
| fig, ax = plt.subplots(figsize=(5, 2)) | |
| # Define AQI categories and their color ranges | |
| categories = [ | |
| (0, 50, "green"), | |
| (50, 100, "yellow"), | |
| (100, 150, "orange"), | |
| (150, 200, "red"), | |
| (200, 300, "purple"), | |
| (300, 500, "maroon") | |
| ] | |
| # Draw color bands | |
| for start, end, color in categories: | |
| ax.barh(0, end-start, left=start, color=color, height=5, align="center") | |
| # Plot AQI marker | |
| ax.scatter(aqi, 0, color="black", s=200, marker="o", label=f"AQI: {aqi}") | |
| # Formatting | |
| ax.set_xlim(0, 500) | |
| ax.set_yticks([]) | |
| ax.set_xticks([0, 50, 100, 150, 200, 300, 500]) | |
| ax.set_xticklabels(["0", "50", "100", "150", "200", "300", "500"]) | |
| ax.set_title("AQI Level Indicator") | |
| return fig | |
| # Prediction function | |
| def predict_aqi(pm25, pm10, co, no2, so2, o3): | |
| input_data = np.array([[pm25, pm10, co, no2, so2, o3]]) | |
| input_scaled = scaler.transform(input_data) # Normalize input | |
| prediction = model.predict(input_scaled) | |
| aqi = round(prediction[0], 2) | |
| # Determine AQI category and suggestions | |
| if aqi <= 50: | |
| category = "Good" | |
| suggestion = "Air quality is satisfactory. Enjoy your day!" | |
| elif aqi <= 100: | |
| category = "Moderate" | |
| suggestion = "Air quality is acceptable. Sensitive groups should take care." | |
| elif aqi <= 150: | |
| category = "Unhealthy for Sensitive Groups" | |
| suggestion = "Sensitive groups should limit outdoor activities." | |
| elif aqi <= 200: | |
| category = "Unhealthy" | |
| suggestion = "Everyone should limit prolonged outdoor exertion." | |
| elif aqi <= 300: | |
| category = "Very Unhealthy" | |
| suggestion = "Health alert: Avoid outdoor activities." | |
| else: | |
| category = "Hazardous" | |
| suggestion = "Health warning: Stay indoors and avoid physical activities." | |
| # Generate AQI gauge chart | |
| gauge_plot = create_aqi_gauge(aqi) | |
| return f"AQI: {aqi} ({category})", suggestion, gauge_plot | |
| # Function to clear input fields | |
| def clear_inputs(): | |
| return None, None, None, None, None, None, "", "", None # Reset all fields | |
| # Create Gradio UI | |
| with gr.Blocks() as iface: | |
| gr.Markdown("<h1 style='text-align: center;'>🌎 AQI Predictor</h1>") | |
| gr.Markdown("<h3 style='text-align: center;'>Enter pollutant levels to predict the Air Quality Index (AQI).</h3>") | |
| # with gr.Row(): | |
| # pm25 = gr.Number(label="PM2.5 (µg/m³)", info="Typical: 0 - 500", value=None) | |
| # pm10 = gr.Number(label="PM10 (µg/m³)", info="Typical: 0 - 600", value=None) | |
| # co = gr.Number(label="CO (mg/m³)", info="Typical: 0 - 50", value=None) | |
| # no2 = gr.Number(label="NO2 (µg/m³)", info="Typical: 0 - 200", value=None) | |
| # so2 = gr.Number(label="SO2 (µg/m³)", info="Typical: 0 - 300", value=None) | |
| # o3 = gr.Number(label="O3 (µg/m³)", info="Typical: 0 - 400", value=None) | |
| with gr.Row(): | |
| pm25 = gr.Number(label="PM2.5 (µg/m³)", info="Examples: 12.5, 85.9", value=23.7) | |
| pm10 = gr.Number(label="PM10 (µg/m³)", info="Examples: 35.8, 280.5", value=78.3) | |
| co = gr.Number(label="CO (mg/m³)", info="Examples: 2.1, 11.2", value=4.9) | |
| no2 = gr.Number(label="NO2 (µg/m³)", info="Examples: 28.7, 95.0", value=42.1) | |
| so2 = gr.Number(label="SO2 (µg/m³)", info="Examples: 15.3, 70.6", value=25.8) | |
| o3 = gr.Number(label="O3 (µg/m³)", info="Examples: 65.0, 180.2", value=90.5) | |
| with gr.Row(): | |
| predict_button = gr.Button("Predict AQI") | |
| clear_button = gr.Button("Clear") # Added Clear button | |
| # Two-column layout for AQI Result & Suggestion vs. AQI Indicator | |
| with gr.Row(): | |
| with gr.Column(): | |
| aqi_output = gr.Textbox(label="AQI Result", interactive=False) | |
| suggestion_output = gr.Textbox(label="Suggestion", interactive=False) | |
| aqi_gauge = gr.Plot(label="AQI Indicator") # AQI Indicator (Gauge Chart) | |
| # Button Click Actions | |
| predict_button.click( | |
| predict_aqi, | |
| inputs=[pm25, pm10, co, no2, so2, o3], | |
| outputs=[aqi_output, suggestion_output, aqi_gauge] | |
| ) | |
| clear_button.click( | |
| clear_inputs, | |
| inputs=[], | |
| outputs=[pm25, pm10, co, no2, so2, o3, aqi_output, suggestion_output, aqi_gauge] | |
| ) | |
| # # Example cases | |
| # gr.Markdown("<h3 style='text-align: center;'>🔥 Try These Examples:</h3>") | |
| # examples = gr.Examples( | |
| # examples=[ | |
| # [10, 20, 0.3, 15, 5, 30], # Low AQI example | |
| # [180, 200, 2.5, 100, 40, 80] # High AQI example | |
| # ], | |
| # inputs=[pm25, pm10, co, no2, so2, o3], | |
| # outputs=[aqi_output, suggestion_output, aqi_gauge], | |
| # fn=predict_aqi, | |
| # cache_examples=True # Speeds up example execution | |
| # ) | |
| # Assuming pm25, pm10, co, no2, so2, o3, aqi_output, suggestion_output, aqi_gauge, predict_aqi are defined elsewhere | |
| # Example cases | |
| gr.Markdown("<h3 style='text-align: center;'>🔥 Try These Examples:</h3>") | |
| examples = gr.Examples( | |
| examples=[ | |
| [12.5, 35.8, 2.1, 28.7, 15.3, 65.0], # Moderate AQI example | |
| [85.9, 280.5, 11.2, 95.0, 70.6, 180.2], # High AQI example | |
| ], | |
| inputs=[pm25, pm10, co, no2, so2, o3], | |
| outputs=[aqi_output, suggestion_output, aqi_gauge], | |
| fn=predict_aqi, | |
| cache_examples=True # Speeds up example execution | |
| ) | |
| # Run Gradio app | |
| if __name__ == "__main__": | |
| iface.launch() | |