from __future__ import annotations from datetime import datetime from typing import Any import pandas as pd import requests from config.settings import OPENWEATHER_API_KEY, OPENWEATHER_URL BALLPARK_COORDS: dict[str, tuple[float, float]] = { "loanDepot park": (25.7781, -80.2197), "Daikin Park": (29.7573, -95.3555), "Dodger Stadium": (34.0739, -118.2400), "Petco Park": (32.7073, -117.1566), "Chase Field": (33.4455, -112.0667), } def fetch_weather_for_venue(venue_name: str) -> pd.DataFrame: if not OPENWEATHER_API_KEY or venue_name not in BALLPARK_COORDS: return pd.DataFrame() lat, lon = BALLPARK_COORDS[venue_name] params = { "lat": lat, "lon": lon, "appid": OPENWEATHER_API_KEY, "units": "imperial", } response = requests.get(OPENWEATHER_URL, params=params, timeout=30) response.raise_for_status() payload = response.json() weather_list = payload.get("weather", []) description = weather_list[0].get("description", "") if weather_list else "" row = { "fetched_at": datetime.utcnow(), "venue_key": venue_name, "location_name": payload.get("name", venue_name), "temperature_f": (payload.get("main") or {}).get("temp"), "humidity": (payload.get("main") or {}).get("humidity"), "wind_speed_mph": (payload.get("wind") or {}).get("speed"), "wind_deg": (payload.get("wind") or {}).get("deg"), "description": description, } return pd.DataFrame([row])