Spaces:
Sleeping
Sleeping
import matplotlib | |
matplotlib.use('Agg') # Set non-GUI backend for Matplotlib | |
import tensorflow as tf | |
import numpy as np | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
from flask import Flask, render_template, request | |
from keras.models import model_from_json | |
import folium | |
import json | |
import requests | |
from pathlib import Path | |
from io import BytesIO | |
import base64 | |
app = Flask(__name__) | |
# Load the model | |
def load_model(name): | |
with open(f"{name}.json", "r") as json_file: | |
loaded_model_json = json_file.read() | |
loaded_model = model_from_json(loaded_model_json) | |
weights_file = f"{name}.weights.h5" | |
if not Path(weights_file).is_file(): | |
raise FileNotFoundError(f"Weight file {weights_file} not found.") | |
loaded_model.load_weights(weights_file) | |
print("Loaded model from disk") | |
return loaded_model | |
#MAP CREATING | |
# Function to create map | |
def create_map(df, predicted_wind_speed, map_file): | |
# Extract latitude, longitude, and actual wind speed | |
latitude = df['lat'].iloc[0] | |
longitude = df['lon'].iloc[0] | |
actual_wind_speed = df['wind_kph'].iloc[0] | |
# Ensure single numeric values for plotting | |
if isinstance(actual_wind_speed, (list, np.ndarray)): | |
actual_wind_speed = actual_wind_speed[0] | |
if isinstance(predicted_wind_speed, (list, np.ndarray)): | |
predicted_wind_speed = predicted_wind_speed[0] | |
# Create folium map | |
m = folium.Map(location=[latitude, longitude], zoom_start=10) | |
# Create a bar chart comparing actual and predicted wind speeds | |
fig, ax = plt.subplots(figsize=(3, 3)) | |
bars = ax.bar(['Actual', 'Predicted'], [actual_wind_speed, predicted_wind_speed], color=['blue', 'green']) | |
ax.set_ylabel('Wind Speed (km/h)') | |
ax.set_title('Wind Speed Comparison') | |
# Add labels inside each bar | |
for bar in bars: | |
yval = bar.get_height() # Get the height of each bar (wind speed value) | |
# Position the label inside the bar, slightly adjusted to avoid overlap with the top | |
ax.text(bar.get_x() + bar.get_width() / 2, yval / 2, round(yval, 2), ha='center', va='center', color='white') | |
# Adjust layout | |
plt.tight_layout() | |
# Save chart to a BytesIO buffer in PNG format and encode to base64 | |
buffer = BytesIO() | |
plt.savefig(buffer, format="png") | |
plt.close(fig) | |
buffer.seek(0) | |
image_base64 = base64.b64encode(buffer.read()).decode('utf-8') | |
# HTML for the popup with base64 image | |
popup_html = f'<img src="data:image/png;base64,{image_base64}" alt="Wind Speed Comparison">' | |
popup = folium.Popup(html=popup_html, max_width=300) | |
# Add a marker to the map with popup containing the chart | |
folium.Marker( | |
location=[latitude, longitude], | |
popup=popup, | |
tooltip=df['location'].iloc[0] | |
).add_to(m) | |
# Save the folium map as an HTML file | |
m.save(map_file) | |
model = load_model('Wind_Model_New_v1') | |
# Route to input form | |
def index(): | |
return render_template('index.html') | |
# Prediction route | |
def predict(): | |
latitude = float(request.form['latitude']) | |
longitude = float(request.form['longitude']) | |
api_key = "846ca0bb2fa144cdb7195352240711" | |
base_url = "http://api.weatherapi.com/v1/current.json" | |
params = {"key": api_key, "q": f"{latitude},{longitude}"} | |
response = requests.get(base_url, params=params) | |
if response.status_code == 200: | |
current_weather = response.json() | |
extracted_data = { | |
'location': current_weather['location']['name'], | |
'lat': latitude, | |
'lon': longitude, | |
'date': current_weather['location']['localtime'].split()[0], | |
'time': current_weather['location']['localtime'], | |
'temp_c': current_weather['current']['temp_c'], | |
'temp_f': current_weather['current']['temp_f'], | |
'is_day': current_weather['current']['is_day'], | |
'condition': current_weather['current']['condition']['text'], | |
'wind_mph': current_weather['current']['wind_mph'], | |
'wind_kph': current_weather['current']['wind_kph'], | |
'humidity': current_weather['current']['humidity'], | |
'cloud': current_weather['current']['cloud'], | |
'feelslike_c': current_weather['current']['feelslike_c'], | |
'feelslike_f': current_weather['current']['feelslike_f'], | |
'windchill_c': current_weather['current']['windchill_c'], | |
'windchill_f': current_weather['current']['windchill_f'], | |
'heatindex_c': current_weather['current']['heatindex_c'], | |
'heatindex_f': current_weather['current']['heatindex_f'], | |
'dewpoint_c': current_weather['current']['dewpoint_c'], | |
'dewpoint_f': current_weather['current']['dewpoint_f'], | |
'vis_km': current_weather['current']['vis_km'], | |
'vis_miles': current_weather['current']['vis_miles'], | |
'gust_mph': current_weather['current']['gust_mph'], | |
'gust_kph': current_weather['current']['gust_kph'], | |
'uv': current_weather['current']['uv'] | |
} | |
df = pd.DataFrame([extracted_data]) | |
print("dataframe",df) | |
df['time'] = pd.to_datetime(df['time']) | |
df['day'] = df['time'].dt.day | |
df['month'] = df['time'].dt.month | |
df['hour'] = df['time'].dt.hour | |
dx=df[['temp_c', 'temp_f', 'is_day','wind_mph', 'wind_kph', 'humidity', 'cloud', 'feelslike_c', | |
'feelslike_f', 'windchill_c', 'windchill_f', 'heatindex_c','heatindex_f', 'dewpoint_c', | |
'dewpoint_f', 'vis_km', 'vis_miles','gust_mph', 'gust_kph', 'uv', 'day', 'month', 'hour']] | |
x=dx.drop(['wind_mph', 'wind_kph'],axis=1) | |
x_unk = np.array(x) | |
x_unk = x_unk / 100 | |
predictions = model.predict(x_unk) | |
predicted_wind_speed = predictions[0][0] | |
print("predictions",predictions) | |
map_file = "static/multiple_wind_speed_map.html" | |
create_map(df, predicted_wind_speed, map_file) | |
return render_template('results.html', | |
actual=df['wind_kph'][0], | |
predicted=predicted_wind_speed, | |
map_file='multiple_wind_speed_map.html') | |
else: | |
return "Failed to retrieve weather data." | |
# forcast | |
def forcast(): | |
latitude = float(request.form['latitude']) | |
longitude = float(request.form['longitude']) | |
api_key = "846ca0bb2fa144cdb7195352240711" | |
base_url = "http://api.weatherapi.com/v1/forecast.json" | |
params = { | |
"key": api_key, | |
"q": f"{latitude},{longitude}", | |
"days": 1 # Fetch forecast for 1 day | |
} | |
response = requests.get(base_url, params=params) | |
extracted_data = {} | |
if response.status_code == 200: | |
data = response.json() | |
for location in data: | |
location_name = data['location']['name'] | |
forecast_days = data['forecast']['forecastday'] | |
# Loop through each day in forecastdays | |
for day in forecast_days: | |
date = day['date'] | |
hours = day['hour'] | |
# Extract hourly data for each hour | |
for hour_data in hours: | |
# Add extra details (date, location) for each hourly data | |
extracted_data={ | |
"location": location_name, | |
"lat": latitude, | |
"lon": longitude, | |
"date": date, | |
"time": hour_data["time"], | |
"temp_c": hour_data["temp_c"], | |
"temp_f": hour_data["temp_f"], | |
"is_day": hour_data["is_day"], | |
"condition": hour_data["condition"]["text"], | |
"wind_mph": hour_data["wind_mph"], | |
"wind_kph": hour_data["wind_kph"], | |
"humidity": hour_data["humidity"], | |
"cloud": hour_data["cloud"], | |
"feelslike_c": hour_data["feelslike_c"], | |
"feelslike_f": hour_data["feelslike_f"], | |
"windchill_c": hour_data["windchill_c"], | |
"windchill_f": hour_data["windchill_f"], | |
"heatindex_c": hour_data["heatindex_c"], | |
"heatindex_f": hour_data["heatindex_f"], | |
"dewpoint_c": hour_data["dewpoint_c"], | |
"dewpoint_f": hour_data["dewpoint_f"], | |
"vis_km": hour_data["vis_km"], | |
"vis_miles": hour_data["vis_miles"], | |
"gust_mph": hour_data["gust_mph"], | |
"gust_kph": hour_data["gust_kph"], | |
"uv": hour_data["uv"] | |
} | |
# Convert extracted data into a DataFrame | |
df = pd.DataFrame([extracted_data]) | |
print("dataframe", df) | |
# Extracting additional date/time features | |
df['time']=pd.to_datetime(df['time']) | |
df['datetime']=pd.to_datetime(df['time']) | |
df['day'] = df['datetime'].dt.day # Extracts day of the month | |
df['month'] = df['datetime'].dt.month # Extracts month | |
df['hour'] = df['datetime'].dt.hour | |
# Prepare features for prediction | |
dx=df[['temp_c', 'temp_f', 'is_day','wind_mph', 'wind_kph', 'humidity', 'cloud', 'feelslike_c','feelslike_f', 'windchill_c', 'windchill_f', 'heatindex_c','heatindex_f', 'dewpoint_c', 'dewpoint_f', 'vis_km', 'vis_miles','gust_mph', 'gust_kph', 'uv', 'day', 'month', 'hour']] | |
x = dx.drop(['wind_mph', 'wind_kph'], axis=1) | |
x_unk = np.array(x) | |
x_unk = x_unk / 110 | |
predictions = model.predict(x_unk) | |
predicted_wind_speed = predictions[0][0] | |
print("predictions",predictions) | |
map_file = "static/multiple_wind_speed_map.html" | |
create_map(df, predicted_wind_speed, map_file) | |
return render_template('results.html', | |
actual=df['wind_kph'][0], | |
predicted=predicted_wind_speed, | |
map_file='multiple_wind_speed_map.html') | |
else: | |
return "Failed to retrieve weather data." | |
if __name__ == '__main__': | |
app.run(debug=True) | |