Source code for chap_core.climate_data.seasonal_forecasts

from collections import defaultdict

from pydantic import BaseModel

from chap_core.datatypes import TimeSeriesArray


[docs] class DataElement(BaseModel): orgUnit: str period: str value: float
[docs] class SeasonalForecast: def __init__(self, data_dict: dict[str, dict[str, dict[str, float]]] | None = None): if data_dict is None: data_dict = {} self.data_dict = data_dict
[docs] def add_json(self, field_name: str, json_data: list[DataElement]): data_dict = self.data_dict.get(field_name, defaultdict(dict)) # type: ignore orgUnits = [] for data in json_data: data = DataElement(**data) # type: ignore data_dict[data.orgUnit][data.period] = data.value orgUnits.append(data.orgUnit) print(f"Added periods {orgUnits} to field {field_name}") self.data_dict[field_name] = data_dict
[docs] def get_forecasts(self, org_unit, period_range, field_name, start_date=None): assert field_name in self.data_dict, f"Field {field_name} not found in data {self.data_dict.keys()}" data = self.data_dict[field_name][org_unit] assert all(period.id in data for period in period_range), ( f"Not all periods found in data {data.keys(), org_unit}" ) return TimeSeriesArray(period_range, [data[period.id] for period in period_range])