app.schemas module#
Pydantic models for request/response payloads and internal validation.
This module defines the data transfer objects (DTOs) used by the FastAPI application and background jobs to validate inputs and serialize outputs. Schemas mirror the structure of the SQLAlchemy ORM models where appropriate and are designed to be safe for JSON encoding in API responses and logs.
See Also#
app.modelsSQLAlchemy models mirrored by these schemas.
app.mainFastAPI endpoints that emit and consume these schemas.
app.databaseSession/engine configuration used to produce ORM objects.
Notes#
Primary role: provide Pydantic v2 models for API endpoints and service boundaries, enabling strict, well-typed validation and serialization.
Key dependencies: relies on Pydantic v2. The
from_attributes=Trueconfiguration allows converting ORM objects (e.g.,app.models) into schemas viamodel_validate.Invariants: field names intentionally match ORM attributes to simplify conversions. Timestamps are naive
datetimeobjects assumed to be in UTC.
Examples#
>>> from datetime import datetime
>>> from app.schemas import CoordinateSchema, WeatherObservationSchema
>>> center = CoordinateSchema(latitude=59.33, longitude=18.06, label="STHLM")
>>> center.model_dump()["label"]
'STHLM'
>>> obs = WeatherObservationSchema(
... timestamp=datetime(2024, 1, 1, 12, 0, 0),
... latitude=59.33,
... longitude=18.06,
... air_temperature=2.3,
... is_imputed=False,
... )
>>> isinstance(obs.timestamp, datetime)
True
- class app.schemas.CoordinateListResponse(*, coordinates: List[CoordinateSchema])[source]#
Bases:
BaseModelResponse payload carrying a list of coordinates.
- Parameters:
- coordinates
list[CoordinateSchema] Collection of coordinates to return to the client.
- coordinates
- Attributes:
- coordinates
list[CoordinateSchema] The returned coordinates.
- coordinates
Examples
>>> resp = CoordinateListResponse( ... coordinates=[CoordinateSchema(latitude=0, longitude=0)] ... ) >>> len(resp.coordinates) 1
- coordinates: List[CoordinateSchema]#
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class app.schemas.CoordinateSchema(*, id: int | None = None, latitude: float, longitude: float, label: str | None = None, is_central: bool | None = None)[source]#
Bases:
BaseModelGeographic coordinate used for data collection and grouping.
This schema represents a point on Earth expressed in decimal degrees. It mirrors
app.models.Coordinateand is commonly returned by the API for map/grid operations and stored as part of training metadata.- Parameters:
- id
int,optional Surrogate primary key if available; not required for requests.
- latitude
float Coordinate latitude in decimal degrees.
- longitude
float Coordinate longitude in decimal degrees.
- label
str,optional Optional human‑readable label for the coordinate.
- is_centralbool,
optional Marks the central coordinate used as a reference point.
- id
- Attributes:
See also
app.models.CoordinateORM model providing the database mapping.
Examples
>>> CoordinateSchema(latitude=59.33, longitude=18.06).model_dump()["latitude"] 59.33
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {'from_attributes': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'id': FieldInfo(annotation=Union[int, NoneType], required=False, default=None, description='Primary key'), 'is_central': FieldInfo(annotation=Union[bool, NoneType], required=False, default=None, description='True if this is the central coordinate'), 'label': FieldInfo(annotation=Union[str, NoneType], required=False, default=None, description='Optional label for the point'), 'latitude': FieldInfo(annotation=float, required=True, description='Latitude of the point'), 'longitude': FieldInfo(annotation=float, required=True, description='Longitude of the point')}#
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- class app.schemas.GenericStatusResponse(*, status: str, message: str | None = None)[source]#
Bases:
BaseModelSimple status envelope for human‑readable messages.
- Parameters:
- Attributes:
- Same as Parameters.
Examples
>>> GenericStatusResponse(status="ok").model_dump()["status"] 'ok'
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'message': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'status': FieldInfo(annotation=str, required=True)}#
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- class app.schemas.PredictionDataResponse(*, history: Dict[str, Dict[str, Any]])[source]#
Bases:
BaseModelHistorical model performance keyed by horizon identifier.
- Parameters:
- Attributes:
Examples
>>> payload = PredictionDataResponse(history={"h1": {"r2": 0.9}}) >>> float(payload.history["h1"]["r2"]) == 0.9 True
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- class app.schemas.TrainingLogSchema(*, id: str, timestamp: datetime, horizon: str, sklearn_score: float, pytorch_score: float, data_count: int, coord_latitude: float | None = None, coord_longitude: float | None = None, horizon_label: str | None = None)[source]#
Bases:
BaseModelAppend‑only log entry with training scores and metadata.
Mirrors
app.models.TrainingLog. Each entry captures model scores for a given horizon and, optionally, coordinate context.- Parameters:
- id
str Unique identifier (UUID string) for the run.
- timestamp
datetime Completion time of the training run in UTC.
- horizon
str Non‑empty key identifying the grouping (often
"<coord>_<horizon_label>").- sklearn_score
float R^2 score from the Scikit‑learn model.
- pytorch_score
float R^2 score from the PyTorch model.
- data_count
int Number of data points used for the run.
- coord_latitude
float,optional Coordinate latitude associated with the run.
- coord_longitude
float,optional Coordinate longitude associated with the run.
- horizon_label
str,optional Human‑friendly label for the horizon (e.g.,
"5min").
- id
- Attributes:
- Same as Parameters.
See also
app.models.TrainingLogORM model persisted by the training jobs.
Examples
>>> TrainingLogSchema( ... id="00000000-0000-0000-0000-000000000000", ... timestamp=datetime(2024, 1, 1, 12, 0, 0), ... horizon="59.33_18.06_5min", ... sklearn_score=0.92, ... pytorch_score=0.93, ... data_count=1000, ... ).model_dump()["horizon"] '59.33_18.06_5min'
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {'from_attributes': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'coord_latitude': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'coord_longitude': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'data_count': FieldInfo(annotation=int, required=True), 'horizon': FieldInfo(annotation=str, required=True), 'horizon_label': FieldInfo(annotation=Union[str, NoneType], required=False, default=None), 'id': FieldInfo(annotation=str, required=True), 'pytorch_score': FieldInfo(annotation=float, required=True), 'sklearn_score': FieldInfo(annotation=float, required=True), 'timestamp': FieldInfo(annotation=datetime, required=True)}#
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- class app.schemas.TrainingStatusSchema(*, id: int, is_training: bool, last_trained_at: datetime | None, train_count: int, current_horizon: str | None)[source]#
Bases:
BaseModelSnapshot of the current ML training state.
Represents the single logical row tracked by the application to indicate whether a training job is running and metadata about recent runs.
- Parameters:
- id
int Primary key, conventionally
1for the singleton row.- is_trainingbool
Flag indicating whether a training job is currently running.
- last_trained_at
datetime,optional Timestamp of the last completed training job in UTC.
- train_count
int Monotonic counter of completed training runs.
- current_horizon
str,optional Human‑readable horizon label (e.g.,
"5min") or status text.
- id
- Attributes:
- Same as Parameters.
See also
app.models.TrainingStatusORM model used by the backend.
Examples
>>> TrainingStatusSchema(id=1, is_training=False, train_count=3).train_count 3
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {'from_attributes': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'current_horizon': FieldInfo(annotation=Union[str, NoneType], required=True), 'id': FieldInfo(annotation=int, required=True), 'is_training': FieldInfo(annotation=bool, required=True), 'last_trained_at': FieldInfo(annotation=Union[datetime, NoneType], required=True), 'train_count': FieldInfo(annotation=int, required=True)}#
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.
- class app.schemas.WeatherObservationSchema(*, timestamp: datetime, latitude: float, longitude: float, air_temperature: float | None = None, wind_speed: float | None = None, wind_direction: float | None = None, cloud_area_fraction: float | None = None, precipitation_amount: float | None = None, is_imputed: bool)[source]#
Bases:
BaseModelPoint‑in‑time weather values at a geographic location.
Mirrors
app.models.WeatherObservation. The composite identity of an observation is(timestamp, latitude, longitude). Optional fields may be missing in raw feeds but can be provided after imputation.- Parameters:
- timestamp
datetime Observation timestamp in UTC (naive
datetimeassumed to be UTC).- latitude
float Coordinate latitude in decimal degrees.
- longitude
float Coordinate longitude in decimal degrees.
- air_temperature
float,optional Air temperature in degrees Celsius.
- wind_speed
float,optional Wind speed in meters per second.
- wind_direction
float,optional Wind direction in degrees (meteorological convention).
- cloud_area_fraction
float,optional Fraction of the sky covered by clouds (0–1).
- precipitation_amount
float,optional Precipitation amount in millimeters over the interval.
- is_imputedbool
Whether this record was generated by an imputation process.
- timestamp
- Attributes:
- Same as Parameters.
See also
app.models.WeatherObservationORM model with the canonical schema.
Examples
>>> WeatherObservationSchema( ... timestamp=datetime(2024, 1, 1, 0, 0, 0), ... latitude=59.33, ... longitude=18.06, ... is_imputed=False, ... ).model_dump()["is_imputed"] False
- model_computed_fields: ClassVar[Dict[str, ComputedFieldInfo]] = {}#
A dictionary of computed field names and their corresponding ComputedFieldInfo objects.
- model_config: ClassVar[ConfigDict] = {'from_attributes': True}#
Configuration for the model, should be a dictionary conforming to [ConfigDict][pydantic.config.ConfigDict].
- model_fields: ClassVar[Dict[str, FieldInfo]] = {'air_temperature': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'cloud_area_fraction': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'is_imputed': FieldInfo(annotation=bool, required=True), 'latitude': FieldInfo(annotation=float, required=True), 'longitude': FieldInfo(annotation=float, required=True), 'precipitation_amount': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'timestamp': FieldInfo(annotation=datetime, required=True), 'wind_direction': FieldInfo(annotation=Union[float, NoneType], required=False, default=None), 'wind_speed': FieldInfo(annotation=Union[float, NoneType], required=False, default=None)}#
Metadata about the fields defined on the model, mapping of field names to [FieldInfo][pydantic.fields.FieldInfo] objects.
This replaces Model.__fields__ from Pydantic V1.