Spaces:
Sleeping
Sleeping
import requests | |
from collections import defaultdict | |
from datetime import datetime, timedelta | |
import json | |
import pandas as pd | |
import threading | |
import time | |
import os | |
import signal | |
api_key = "c6dfc4d92a8f972d237ef696ec87b37a" | |
def shutdown(): | |
# Wait a bit before shutdown to allow the response to be returned | |
def stop(): | |
time.sleep(1) | |
os.kill(os.getpid(), signal.SIGTERM) # Send SIGTERM to the current process to stop Gradio | |
os._exit(0) | |
threading.Thread(target=stop).start() | |
return "Shutting down and closing the Gradio window..." | |
def get_weather_info(city): | |
"""Fetches current weather information for a city using OpenWeatherMap API.""" | |
url_current = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric" | |
response_current = requests.get(url_current) | |
if response_current.status_code != 200: | |
return "Error: Could not fetch weather data." | |
data_current = response_current.json() | |
weather_description = data_current['weather'][0]['description'] | |
temperature_current = data_current['main']['temp'] | |
temperature_feels_like = data_current['main']['feels_like'] | |
temperature_min = data_current['main']['temp_min'] | |
temperature_max = data_current['main']['temp_max'] | |
pressure_sea_level = data_current['main'].get('sea_level', data_current['main']['pressure']) | |
pressure_ground_level = data_current['main'].get('grnd_level', data_current['main']['pressure']) | |
humidity = data_current['main']['humidity'] | |
visibility = data_current['visibility'] | |
wind_speed = data_current['wind']['speed'] | |
wind_deg = data_current['wind']['deg'] | |
clouds = data_current['clouds']['all'] | |
rain = data_current.get('rain', {}).get('1h', 0) | |
dt = datetime.utcfromtimestamp(data_current['dt']).strftime('%Y-%m-%d %H:%M:%S') | |
timezone = data_current['timezone'] | |
city_name = data_current['name'] | |
response_code = data_current['cod'] | |
formatted_info = ( | |
f"Weather: {weather_description}, " | |
f"Temperature: current {temperature_current}°C, feels like {temperature_feels_like}°C, min {temperature_min}°C, max {temperature_max}°C, " | |
f"Pressure: sea level {pressure_sea_level} hPa, ground level {pressure_ground_level} hPa, " | |
f"Humidity: {humidity}%, " | |
f"Visibility: {visibility} meters, " | |
f"Wind: speed {wind_speed} m/s, deg {wind_deg}, " | |
f"Clouds: {clouds}%, " | |
f"Rain: {rain} mm, " | |
f"Date/Time: {dt}, " | |
f"Timezone: {timezone} seconds, " | |
f"City Name: {city_name}, " | |
f"Response Code: {response_code}" | |
) | |
return formatted_info | |
def get_forecast(city): | |
"""Fetches 2-day weather forecast for a city using OpenWeatherMap API and restructures the data into a table format.""" | |
url_forecast = f"http://api.openweathermap.org/data/2.5/forecast?q={city}&appid={api_key}&units=metric" | |
response_forecast = requests.get(url_forecast) | |
if response_forecast.status_code != 200: | |
return "Error: Could not fetch forecast data." | |
forecast_json = response_forecast.json() | |
current_date = datetime.now().date() | |
forecast_dates = [current_date + timedelta(days=i) for i in range(1, 3)] | |
important_hours = ['09:00:00', '15:00:00', '21:00:00'] | |
data = [] | |
for entry in forecast_json['list']: | |
date, time = entry['dt_txt'].split() | |
date_obj = datetime.strptime(date, '%Y-%m-%d').date() | |
if date_obj in forecast_dates and time in important_hours: | |
data.append({ | |
'Date': date, | |
'Time': time, | |
'Temperature': entry['main']['temp'], | |
'Feels Like': entry['main']['feels_like'], | |
'Temp Min': entry['main']['temp_min'], | |
'Temp Max': entry['main']['temp_max'], | |
'Pressure': entry['main']['pressure'], | |
'Humidity': entry['main']['humidity'], | |
'Weather': entry['weather'][0]['description'], | |
'Icon': entry['weather'][0]['icon'], | |
'Wind Speed': entry['wind']['speed'], | |
'Wind Deg': entry['wind']['deg'], | |
'Visibility': entry['visibility'], | |
'Pop': entry['pop'], | |
'Rain': entry['rain']['3h'] if 'rain' in entry else 0, | |
'Clouds': entry['clouds']['all'] | |
}) | |
df = pd.DataFrame(data) | |
df.set_index(['Date', 'Time'], inplace=True) | |
return df | |
def restructure_forecast_00(forecast_json): | |
"""Restructures the forecast JSON data into a single-line sentence format.""" | |
current_date = datetime.now().date() | |
forecast_dates = [current_date + timedelta(days=i) for i in range(1, 3)] | |
important_hours = ['09:00:00', '12:00:00', '15:00:00', '18:00:00', '21:00:00'] | |
structured_data = defaultdict(dict) | |
for entry in forecast_json['list']: | |
date, time = entry['dt_txt'].split() | |
date_obj = datetime.strptime(date, '%Y-%m-%d').date() | |
if date_obj in forecast_dates and time in important_hours: | |
structured_data[date][time] = { | |
'temperature': entry['main']['temp'], | |
'feels like': entry['main']['feels_like'], | |
'temp min': entry['main']['temp_min'], | |
'temp max': entry['main']['temp_max'], | |
'pressure': entry['main']['pressure'], | |
'humidity': entry['main']['humidity'], | |
'weather': entry['weather'][0]['description'], | |
'icon': entry['weather'][0]['icon'], | |
'wind speed': entry['wind']['speed'], | |
'wind deg': entry['wind']['deg'], | |
'visibility': entry['visibility'], | |
'pop': entry['pop'], | |
'rain': entry['rain']['3h'] if 'rain' in entry else 0, | |
'clouds': entry['clouds']['all'] | |
} | |
return format_forecast(structured_data, forecast_dates) | |
def format_forecast_00(structured_data, forecast_dates): | |
"""Formats the structured forecast data into a single-line sentence format.""" | |
formatted_forecast = [] | |
for date in forecast_dates: | |
date_str = str(date) | |
for time, data in structured_data[date_str].items(): | |
formatted_forecast.append( | |
f"{date_str} : {time} ( " + | |
", ".join(f"{key} - {value}" for key, value in data.items()) + | |
" )" | |
) | |
return "\n".join(formatted_forecast) | |
def restructure_forecast2(forecast_json): | |
"""Restructures the forecast JSON data into a nested dictionary by date and time, including the next three days.""" | |
current_date = datetime.now().date() | |
forecast_dates = [current_date + timedelta(days=i) for i in range(1, 3)] | |
structured_data = defaultdict(dict) | |
for entry in forecast_json['list']: | |
date, time = entry['dt_txt'].split() | |
date_obj = datetime.strptime(date, '%Y-%m-%d').date() | |
if date_obj in forecast_dates: | |
structured_data[date][time] = { | |
'temperature': entry['main']['temp'], | |
'feels_like': entry['main']['feels_like'], | |
'temp_min': entry['main']['temp_min'], | |
'temp_max': entry['main']['temp_max'], | |
'pressure': entry['main']['pressure'], | |
'humidity': entry['main']['humidity'], | |
'weather': entry['weather'][0]['description'], | |
'icon': entry['weather'][0]['icon'], | |
'wind_speed': entry['wind']['speed'], | |
'wind_deg': entry['wind']['deg'], | |
'visibility': entry['visibility'], | |
'pop': entry['pop'], | |
'rain': entry['rain']['3h'] if 'rain' in entry else 0, | |
'clouds': entry['clouds']['all'] | |
} | |
return {str(date): structured_data[str(date)] for date in forecast_dates} | |
def restructure_forecast_0(forecast_json): | |
"""Restructures the forecast JSON data into a nested dictionary by date and specific times.""" | |
current_date = datetime.now().date() | |
forecast_dates = [current_date + timedelta(days=i) for i in range(1, 3)] | |
important_hours = ['09:00:00', '12:00:00', '15:00:00', '18:00:00', '21:00:00'] | |
structured_data = defaultdict(dict) | |
for entry in forecast_json['list']: | |
date, time = entry['dt_txt'].split() | |
date_obj = datetime.strptime(date, '%Y-%m-%d').date() | |
if date_obj in forecast_dates and time in important_hours: | |
structured_data[date][time] = { | |
'temperature': entry['main']['temp'], | |
'feels_like': entry['main']['feels_like'], | |
'temp_min': entry['main']['temp_min'], | |
'temp_max': entry['main']['temp_max'], | |
'pressure': entry['main']['pressure'], | |
'humidity': entry['main']['humidity'], | |
'weather': entry['weather'][0]['description'], | |
'icon': entry['weather'][0]['icon'], | |
'wind_speed': entry['wind']['speed'], | |
'wind_deg': entry['wind']['deg'], | |
'visibility': entry['visibility'], | |
'pop': entry['pop'], | |
'rain': entry['rain']['3h'] if 'rain' in entry else 0, | |
'clouds': entry['clouds']['all'] | |
} | |
return {str(date): structured_data[str(date)] for date in forecast_dates} | |
def restructure_forecast3(forecast_json): | |
"""Restructures the forecast JSON data into a nested dictionary by date and time, including the next three days.""" | |
current_date = datetime.now().date() | |
forecast_dates = [current_date + timedelta(days=i) for i in range(1, 4)] | |
structured_data = defaultdict(dict) | |
for entry in forecast_json['list']: | |
date, time = entry['dt_txt'].split() | |
date_obj = datetime.strptime(date, '%Y-%m-%d').date() | |
if date_obj in forecast_dates: | |
structured_data[date][time] = { | |
'temperature': entry['main']['temp'], | |
'feels_like': entry['main']['feels_like'], | |
'temp_min': entry['main']['temp_min'], | |
'temp_max': entry['main']['temp_max'], | |
'pressure': entry['main']['pressure'], | |
'humidity': entry['main']['humidity'], | |
'weather': entry['weather'][0]['description'], | |
'icon': entry['weather'][0]['icon'], | |
'wind_speed': entry['wind']['speed'], | |
'wind_deg': entry['wind']['deg'], | |
'visibility': entry['visibility'], | |
'pop': entry['pop'], | |
'rain': entry['rain']['3h'] if 'rain' in entry else 0, | |
'clouds': entry['clouds']['all'] | |
} | |
return {str(date): structured_data[str(date)] for date in forecast_dates} | |
def get_weather_info_0(city): | |
"""Fetches current weather information for a city using OpenWeatherMap API.""" | |
url_current = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric" | |
response_current = requests.get(url_current) | |
if response_current.status_code != 200: | |
return "Error: Could not fetch weather data." | |
data_current = response_current.json() | |
response = { | |
'coordinates': data_current['coord'], | |
'weather': data_current['weather'][0], | |
'temperature': { | |
'current': data_current['main']['temp'], | |
'feels_like': data_current['main']['feels_like'], | |
'min': data_current['main']['temp_min'], | |
'max': data_current['main']['temp_max'] | |
}, | |
'pressure': { | |
'sea_level': data_current['main'].get('sea_level', data_current['main']['pressure']), | |
'ground_level': data_current['main'].get('grnd_level', data_current['main']['pressure']) | |
}, | |
'humidity': data_current['main']['humidity'], | |
'visibility': data_current['visibility'], | |
'wind': data_current['wind'], | |
'clouds': data_current['clouds'], | |
'rain': data_current.get('rain', {}), | |
'dt': data_current['dt'], | |
'sys': data_current['sys'], | |
'timezone': data_current['timezone'], | |
'id': data_current['id'], | |
'name': data_current['name'], | |
'cod': data_current['cod'] | |
} | |
return json.dumps(response, indent=2) | |