import tensorflow as tf import numpy as np import pandas as pd import matplotlib.pyplot as plt from pathlib import Path from keras.models import model_from_json import tensorflow as tf import matplotlib.pyplot as plt import joblib import requests import json from datetime import datetime def load_model(name): # Load JSON and create model json_file = open("%s.json" % name, "r") loaded_model_json = json_file.read() json_file.close() loaded_model = model_from_json(loaded_model_json) # Check if the weights file exists before loading weights_file = f"{name}.weights.h5" if not Path(weights_file).is_file(): raise FileNotFoundError(f"Weight file {weights_file} not found.") # Load weights into the new model loaded_model.load_weights(weights_file) print("Loaded model from disk") return loaded_model model = load_model("3_day_forecast_AQI_v5") #################################### # Load the scalers scaler_X = joblib.load('scaler_X_AQI.pkl') scaler_y = joblib.load('scaler_y_AQI.pkl') import requests import pandas as pd import joblib import os from datetime import datetime # delhi 28.639638713652012, 77.19002000205269 # bhopal 23.23731292701139, 77.44433463788636 # ahemdabad 23.0364012974141, 72.58238347964425 # ankleshwar 21.62880896774956, 73.0043990197163 # jamnagar 22.3033564155508, 70.8012921707898 # 21.22050672027795 72.83355967457062# # 21.236796371788703, 72.8665479925569 # Define API parameters api_key = "26daca1b78f44099a755b921be4bfcf1" # Your WeatherAPI key latitude = 21.236796371788703 # Example latitude longitude = 72.8665479925569 # # Example longitude base_url = f"https://api.weatherbit.io/v2.0/current/airquality?lat={latitude}&lon={longitude}&key={api_key}" # Make the API request response = requests.get(base_url) if response.status_code == 200: data = response.json() # Extract forecast data dx = [data['data'][0]] test = pd.DataFrame(dx) # Add time-based features now = datetime.now() current_time = now.strftime("%Y-%m-%d %H:%M:%S") test = test[['pm25', 'pm10', 'no2', 'so2', 'co', 'aqi']] test['Date'] = pd.to_datetime(current_time) test['Day'] = test['Date'].dt.day test['Month'] = test['Date'].dt.month test['Hour'] = test['Date'].dt.hour test = test[['pm25', 'pm10', 'no2', 'so2', 'co', 'aqi', 'Day', 'Month', 'Hour']] test.columns = ['PM2.5', 'PM10', 'NO2', 'SO2', 'CO', 'AQI', 'Day', 'Month', 'Hour'] # Load scalers scaler_X = joblib.load('scaler_X_AQI.pkl') scaler_y = joblib.load('scaler_y_AQI.pkl') # Standardize data and make predictions data_normalized = scaler_X.transform(test) prediction_Test = model.predict(data_normalized) predictions_actual = scaler_y.inverse_transform(prediction_Test) test['lat']= latitude test['lon']= longitude # Create a DataFrame for predictions pred = pd.DataFrame(predictions_actual, columns=['AQI_step_1', 'AQI_step_2', 'AQI_step_3']) df = pd.concat([test, pred], axis=1) # Define the CSV file path csv_file_path = "aqi_data.csv" # Create the CSV file with headers if it doesn't exist if not os.path.exists(csv_file_path): columns = ['PM2.5', 'PM10', 'NO2', 'SO2', 'CO', 'AQI', 'Day', 'Month', 'Hour', 'lat', 'lon', 'AQI_step_1', 'AQI_step_2', 'AQI_step_3'] df_empty = pd.DataFrame(columns=columns) df_empty.to_csv(csv_file_path, index=False) # Append new data to the existing CSV df.to_csv(csv_file_path, mode='a', index=False, header=False) print(f"Data appended to {csv_file_path}") #################################### import requests import json from datetime import datetime # Define API parameters api_key = "26daca1b78f44099a755b921be4bfcf1" # Your WeatherAPI key # 21.195069775800516,72.79324648126439 # 21.22050672027795, 72.83355967457062 # 28.639638713652012,77.19002000205269 # 23.23731292701139,77.44433463788636, # 23.0364012974141,72.58238347964425, # 21.62880896774956,73.0043990197163, # jamnagar 22.3033564155508, 70.8012921707898 # new delhi 28.619913380208967, 77.20633325621425 latitude = 21.236796371788703 # Example latitude longitude = 72.8665479925569 # # Example longitude base_url = f"https://api.weatherbit.io/v2.0/forecast/airquality?lat={latitude}&lon={longitude}&key={api_key}" # Make the API request response = requests.get(base_url) if response.status_code == 200: # Parse the returned JSON data data = response.json() data data=data['data'] from collections import defaultdict # Group AQI values by date (ignoring the hour) grouped_aqi = defaultdict(list) for entry in data: # Extract date part only from the datetime (before the colon) date = entry['datetime'].split(':')[0] aqi = entry['aqi'] grouped_aqi[date].append(aqi) # Convert defaultdict to a regular dictionary grouped_aqi = dict(grouped_aqi) # Display the result print(grouped_aqi) index=11 key= grouped_aqi.keys() samp={} samp.clear() for i in key: print(i) ls=grouped_aqi[i] if index AQI Color Legend
Color Remark Range
Good 0-50
Moderate 51-100
Unhealthy for Sensitive Groups 101-150
Unhealthy 151-200
Very Unhealthy 201-300
Hazardous 301+
""" # Add the legend to the map legend = folium.Element(legend_html) m.get_root().html.add_child(legend) # Function to generate a horizontal bar plot def create_aqi_comparison_plot(data): fig, ax = plt.subplots(figsize=(5, 2)) categories = ['DAY 1', 'DAY 2', 'DAY 3'] actual_values = [data['AQI_step_1'], data['AQI_step_2'], data['AQI_step_3']] api_values = [data['AQI_step_1_API'], data['AQI_step_2_API'], data['AQI_step_3_API']] bar_width = 0.35 index = range(len(categories)) # Plot horizontal bars bars_actual = ax.barh(index, actual_values, bar_width, label="Model AQI", color='blue') bars_api = ax.barh([i + bar_width for i in index], api_values, bar_width, label="API AQI", color='green') # Add values to each bar max_value = 0 # Track the maximum value for axis limit adjustment for bar in bars_actual: value = bar.get_width() ax.text(value + 2, bar.get_y() + bar.get_height() / 2, f'{value:.1f}', va='center', fontsize=10) max_value = max(max_value, value) for bar in bars_api: value = bar.get_width() ax.text(value + 2, bar.get_y() + bar.get_height() / 2, f'{value:.1f}', va='center', fontsize=10) max_value = max(max_value, value) # Adjust x-axis limits to accommodate annotations ax.set_xlim(0, max_value * 1.2) # Customize y-ticks and labels ax.set_yticks([i + bar_width / 2 for i in index]) ax.set_yticklabels(categories) ax.set_xlabel('AQI') ax.set_title('AQI Comparison') # Place legend outside the plot area ax.legend(loc='center left', bbox_to_anchor=(1, 0.5), frameon=False) plt.tight_layout() # Save the plot to a PNG image in memory buffer = BytesIO() plt.savefig(buffer, format="png", bbox_inches='tight') plt.close(fig) buffer.seek(0) # Encode the image to base64 to embed it in the HTML image_base64 = base64.b64encode(buffer.read()).decode() return f'' # Function to determine AQI marker color def get_color_for_aqi(aqi_value): if aqi_value <= 50: return 'green' elif aqi_value <= 100: return 'yellow' elif aqi_value <= 150: return 'orange' elif aqi_value <= 200: return 'red' elif aqi_value <= 300: return 'purple' else: return 'maroon' # Add markers with AQI comparison plot for _, row in data.iterrows(): color = get_color_for_aqi(row['AQI_step_1']) popup_html = create_aqi_comparison_plot(row) folium.Marker( location=[row["lat"], row["lon"]], popup=folium.Popup(html=popup_html, max_width=500), #tooltip=row["name"], icon=folium.Icon(color=color) ).add_to(m) # Save the map m.save("aqi_forecast_with_legend.html") m