|
import numpy as np |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
import gradio as gr |
|
import joblib |
|
|
|
|
|
class DummyLSTM: |
|
def predict(self, x): |
|
|
|
return np.mean(x, axis=1) + np.random.rand(1, 5) * 5 |
|
|
|
class DummyRF: |
|
def predict(self, x): |
|
|
|
avg = np.mean(x) |
|
return [100 - min(avg, 100)] |
|
|
|
|
|
lstm_model = DummyLSTM() |
|
rf_model = DummyRF() |
|
pollutants = ['Ozone', 'SO2', 'NO2', 'PM10', 'PM2.5'] |
|
|
|
def predict_pollution(*inputs): |
|
try: |
|
input_data = np.array([inputs[i:i+5] for i in range(0, 15, 5)], dtype=np.float32) |
|
reshaped = input_data.reshape(1, 3, 5) |
|
|
|
pred = lstm_model.predict(reshaped) |
|
pred = np.clip(pred, 0, 500) |
|
|
|
health_score = rf_model.predict(pred)[0] |
|
|
|
|
|
plt.figure(figsize=(8, 4)) |
|
sns.barplot(x=pollutants, y=pred[0]) |
|
plt.title("Predicted Pollutant Levels") |
|
plt.ylabel("µg/m³") |
|
plot_path = "plot.png" |
|
plt.savefig(plot_path) |
|
plt.close() |
|
|
|
|
|
if health_score > 80: |
|
risk = "🔴 High Risk" |
|
color = "#ff6b6b" |
|
advice = "Avoid outdoor activities." |
|
elif health_score > 60: |
|
risk = "🟠 Moderate Risk" |
|
color = "#ffd166" |
|
advice = "Limit outdoor exposure." |
|
else: |
|
risk = "🟢 Low Risk" |
|
color = "#06d6a0" |
|
advice = "Air quality is acceptable." |
|
|
|
health_html = f""" |
|
<div style="background:{color}20; padding:15px; border-radius:8px; border-left:6px solid {color};"> |
|
<h3>{risk}</h3> |
|
<p><strong>Health Score:</strong> {health_score:.1f}/100</p> |
|
<p>{advice}</p> |
|
</div> |
|
""" |
|
|
|
results = [[p, f"{val:.1f} µg/m³"] for p, val in zip(pollutants, pred[0])] |
|
return plot_path, health_html, results |
|
|
|
except Exception as e: |
|
return None, f"<div style='color:red;'>Error: {str(e)}</div>", [] |
|
|
|
|
|
with gr.Blocks(title="Air Quality Predictor", theme=gr.themes.Soft()) as demo: |
|
gr.Markdown("# 🌍 Air Quality Prediction Tool") |
|
gr.Markdown("Enter pollutant data for the past 3 days. The app will predict pollution for the next day and estimate health impact.") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
inputs = [] |
|
for i in range(3): |
|
gr.Markdown(f"### Day {i+1}") |
|
inputs.extend([ |
|
gr.Number(label="Ozone", value=30 + i * 5), |
|
gr.Number(label="SO2", value=20 + i * 2), |
|
gr.Number(label="NO2", value=35 + i), |
|
gr.Number(label="PM10", value=120 + i * 5), |
|
gr.Number(label="PM2.5", value=90 - i * 3), |
|
]) |
|
btn = gr.Button("Predict", variant="primary") |
|
|
|
with gr.Column(): |
|
with gr.Tabs(): |
|
with gr.Tab("Chart"): |
|
plot = gr.Image() |
|
with gr.Tab("Health Impact"): |
|
health = gr.HTML() |
|
with gr.Tab("Details"): |
|
table = gr.DataFrame(headers=["Pollutant", "Predicted µg/m³"], datatype=["str", "str"], interactive=False) |
|
|
|
btn.click(predict_pollution, inputs=inputs, outputs=[plot, health, table]) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|