strompreis/packages/common/common/collectors/weather.py

62 lines
1.6 KiB
Python

"""
Collector for Bright Sky (Weather) API.
"""
import logging
from datetime import datetime, timedelta, timezone
import polars as pl
from ..utils import request_utils
from ..utils.config_loader import settings
logger = logging.getLogger(__name__)
def fetch_weather(lat: float = None, lon: float = None) -> pl.DataFrame:
"""
Fetches historical weather data from Bright Sky API.
Filters for the specific columns defined in the Bronze schema.
Returns:
A Polars DataFrame containing filtered raw weather parameters.
"""
lat = lat or settings.brightsky.lat
lon = lon or settings.brightsky.lon
url = settings.brightsky.base_url
current_utc = datetime.now(timezone.utc)
payload = {
"date": (current_utc - timedelta(hours=72)).isoformat(),
"last_date": current_utc.isoformat(),
"lat": lat,
"lon": lon,
"units": "dwd",
"tz": "Etc/UTC",
}
schema_cols = [
"timestamp",
"temperature",
"wind_speed",
"solar",
"sunshine",
"cloud_cover",
"precipitation",
]
try:
data = request_utils.make_requests(url, params=payload)
weather_list = data.get("weather", [])
if not weather_list:
logger.warning("No weather data returned from API.")
return pl.DataFrame()
df = pl.DataFrame(weather_list)
available_cols = [c for c in schema_cols if c in df.columns]
return df.select(available_cols)
except Exception as e:
logger.error(f"Failed to fetch weather data: {e}")
return pl.DataFrame()