from flask import Flask, render_template, request, redirect, url_for import pandas as pd import numpy as np import joblib import requests from keras.models import model_from_json import folium import matplotlib.pyplot as plt from io import BytesIO import base64 import os from collections import defaultdict app = Flask(__name__) # Load model and scalers def load_model(name): with open(f"{name}.json", "r") as json_file: loaded_model_json = json_file.read() model = model_from_json(loaded_model_json) model.load_weights(f"{name}.weights.h5") return model model = load_model("FUTURE_AQI_v1") scaler_X = joblib.load('scaler_X_cpcb_4.pkl') scaler_y = joblib.load('scaler_y_cpcb_4.pkl') API_KEY = "26daca1b78f44099a755b921be4bfcf1" @app.route('/') def index(): return render_template('index.html') @app.route('/forecast', methods=['POST']) def forecast(): # Get user input latitude = float(request.form['latitude']) longitude = float(request.form['longitude']) # Fetch current AQI from API current_url = f"https://api.weatherbit.io/v2.0/current/airquality?lat={latitude}&lon={longitude}&key={API_KEY}" response = requests.get(current_url) if response.status_code == 200: current_data = response.json()['data'][0] # Prepare input for the model now = pd.to_datetime("now") input_data = pd.DataFrame([{ 'PM2.5': current_data['pm25'], 'PM10': current_data['pm10'], 'NO2': current_data['no2'], 'SO2': current_data['so2'], 'CO': current_data['co'], 'AQI': current_data['aqi'], 'Day': now.day, 'Month': now.month, 'Hour': now.hour }]) # Scale and predict input_scaled = scaler_X.transform(input_data) predictions = model.predict(input_scaled) predictions_actual = scaler_y.inverse_transform(predictions) # Fetch forecasted AQI from API forecast_url = f"https://api.weatherbit.io/v2.0/forecast/airquality?lat={latitude}&lon={longitude}&key={API_KEY}" response = requests.get(forecast_url) forecast_data = response.json()['data'] grouped_aqi = defaultdict(list) for entry in forecast_data: date = entry['datetime'].split(':')[0] grouped_aqi[date].append(entry['aqi']) api_predictions = {date: max(values) for date, values in grouped_aqi.items()} # Save results to CSV forecast_df = pd.DataFrame([{ **input_data.iloc[0], 'lat': latitude, 'lon': longitude, 'AQI_step_1': predictions_actual[0, 0], 'AQI_step_2': predictions_actual[0, 1], 'AQI_step_3': predictions_actual[0, 2] }]) forecast_df.to_csv('aqi_data.csv', mode='a', header=False, index=False) api_df = pd.DataFrame([{ 'AQI_currrent_API': current_data['aqi'], 'AQI_step_1_API': api_predictions.get(list(api_predictions.keys())[0], None), 'AQI_step_2_API': api_predictions.get(list(api_predictions.keys())[1], None), 'AQI_step_3_API': api_predictions.get(list(api_predictions.keys())[2], None) }]) api_df.to_csv('aqi_data_actual_api.csv', mode='a', header=False, index=False) # Generate updated map and return generate_map() return redirect(url_for('result')) @app.route('/result') def result(): return render_template('result.html') def generate_map(): # Load data df1 = pd.read_csv('aqi_data.csv') df2 = pd.read_csv('aqi_data_actual_api.csv') data = pd.concat([df1, df2], axis=1) # Create Folium map # Create the Folium map map_center = [data['lat'].mean(), data['lon'].mean()] m = folium.Map(location=map_center, zoom_start=10) # AQI Color Legend legend_html = """
Color | Remark | Range |
---|---|---|
Good | 0-50 | |
Moderate | 51-100 | |
Unhealthy for Sensitive Groups | 101-150 | |
Unhealthy | 151-200 | |
Very Unhealthy | 201-300 | |
Hazardous | 301+ |