|
import streamlit as st |
|
import requests |
|
import datetime |
|
|
|
def get_weather_data(city, weather_api_key): |
|
base_url = "https://api.openweathermap.org/data/2.5/weather?" |
|
complete_url = base_url + "appid=" + weather_api_key + "&q=" + city |
|
response = requests.get(complete_url) |
|
return response.json() |
|
|
|
def generate_weather_description(data): |
|
try: |
|
temperature = data['main']['temp'] - 273.15 |
|
description = data['weather'][0]['description'] |
|
wind_speed = data['wind']['speed'] |
|
breeze = breeze_status(wind_speed) |
|
return f"The current weather in your city {description}, {breeze} with a temperature of {temperature:.1f}°C." |
|
except Exception as e: |
|
return str(e) |
|
|
|
def breeze_status(wind_speed): |
|
if wind_speed < 1: |
|
return "Calm" |
|
elif wind_speed < 5: |
|
return "Light breeze" |
|
elif wind_speed < 11: |
|
return "Gentle breeze" |
|
elif wind_speed < 19: |
|
return "Moderate breeze" |
|
elif wind_speed < 29: |
|
return "Fresh breeze" |
|
elif wind_speed < 39: |
|
return "Strong breeze" |
|
elif wind_speed < 50: |
|
return "High wind" |
|
elif wind_speed < 62: |
|
return "Gale" |
|
elif wind_speed < 75: |
|
return "Strong gale" |
|
else: |
|
return "Storm" |
|
|
|
def get_weekly_forecast(city, weather_api_key): |
|
base_url = "https://api.openweathermap.org/data/2.5/forecast?" |
|
complete_url = base_url + "appid=" + weather_api_key + "&q=" + city |
|
response = requests.get(complete_url) |
|
return response.json() |
|
|
|
def display_weekly_forecast(data): |
|
try: |
|
st.write("Weekly Weather Forecast") |
|
displayed_dates = set() |
|
|
|
c1, c2, c3, c4, c5, c6, c7 = st.columns(7) |
|
with c1: |
|
st.metric("","Date") |
|
with c2: |
|
st.metric("","Temperature") |
|
with c3: |
|
st.metric("", "Weather Condition") |
|
with c4: |
|
st.metric("","Precipitation") |
|
with c5: |
|
st.metric("", "Wind Speed") |
|
with c6: |
|
st.metric("", "Humidity") |
|
with c7: |
|
st.metric("", "UV Index") |
|
|
|
for day in data['list']: |
|
date = datetime.datetime.fromtimestamp(day['dt']).strftime('%A, %B %d') |
|
if date not in displayed_dates: |
|
displayed_dates.add(date) |
|
|
|
min_temp = day['main']['temp_min'] - 273.15 |
|
max_temp = day['main']['temp_max'] - 273.15 |
|
description = day['weather'][0]['description'] |
|
main_weather = day['weather'][0]['main'] |
|
precipitation = day.get('rain', 'None') if 'rain' in day else day.get('snow', 'None') |
|
wind_speed = day['wind'].get('speed', 'Unknown') if 'wind' in day else 'Unknown' |
|
humidity = day['main'].get('humidity', 'Unknown') |
|
uv_index = day.get('uv_index', 'Unknown') |
|
|
|
precipitation_label = "None" if precipitation == 'None' else f"{precipitation} mm" |
|
wind_speed_label = "Unknown" if wind_speed == 'Unknown' else f"{wind_speed} m/s" |
|
humidity_label = "Unknown" if humidity == 'Unknown' else f"{humidity}%" |
|
uv_index_label = "Unknown" if uv_index == 'Unknown' else uv_index |
|
|
|
with c1: |
|
st.write(f"{date}") |
|
with c2: |
|
st.write(f"Min: {min_temp:.1f}°C\nMax: {max_temp:.1f}°C") |
|
with c3: |
|
st.write(f"{description.capitalize()}") |
|
with c4: |
|
st.write(f"{precipitation_label}") |
|
with c5: |
|
st.write(f"{wind_speed_label}") |
|
with c6: |
|
st.write(f"{humidity_label}") |
|
with c7: |
|
st.write(f"{uv_index_label}") |
|
|
|
except Exception as e: |
|
st.error("Error in displaying weekly forecast:" + str(e)) |
|
|
|
def main(): |
|
st.sidebar.title("Weather Forecasting with LLM") |
|
city = st.sidebar.text_input("Enter city name") |
|
|
|
weather_api_key = "6ec4c3a3f2fc502d15fdd18a1080a25b" |
|
|
|
submit = st.sidebar.button("Get weather") |
|
|
|
|
|
if submit: |
|
st.title("Weather updates for " + city + " is:") |
|
with st.spinner('Fetching weather data..'): |
|
weather_data = get_weather_data(city , weather_api_key) |
|
|
|
if weather_data.get("cod") != 404: |
|
col1, col2 = st.columns(2) |
|
with col1: |
|
st.metric("Temperature ", f"{weather_data['main']['temp'] - 273.5:.2f}°c") |
|
st.metric("Humidity", f"{weather_data['main']['humidity']}%") |
|
with col2: |
|
st.metric("Pressure ", f"{weather_data['main']['pressure']}hPa") |
|
st.metric("Wind speed", f"{weather_data['wind']['speed']}m/s") |
|
|
|
weather_description = generate_weather_description(weather_data) |
|
st.write(weather_description) |
|
else: |
|
st.error("City not found or an error occurred!") |
|
|
|
weekly_forecast_data = get_weekly_forecast(city, weather_api_key) |
|
display_weekly_forecast(weekly_forecast_data) |
|
|
|
if __name__ == "__main__": |
|
main() |