Source code for laser_measles.biweekly.base

"""
Basic classes for biweekly model.
"""

import numpy as np
import patito as pt
import polars as pl

from laser_measles.base import BasePatchLaserFrame
from laser_measles.base import BaseScenario


[docs] class PatchLaserFrame(BasePatchLaserFrame): ...
[docs] class BaseScenarioSchema(pt.Model): """ Schema for the scenario data. """ pop: int # population lat: float # latitude lon: float # longitude id: str # ids of the nodes mcv1: float # MCV1 coverages (as percentages, will be divided by 100)
[docs] class BaseBiweeklyScenario(BaseScenario): def __init__(self, df: pl.DataFrame): super().__init__(df) BaseScenarioSchema.validate(df, allow_superfluous_columns=True) def _validate(self, df: pl.DataFrame): # Validate required columns exist required_columns = ["pop", "lat", "lon", "id", "mcv1"] missing_columns = [col for col in required_columns if col not in df.columns] if missing_columns: raise ValueError(f"Missing required columns: {missing_columns}") # Validate data types using Polars' native operations try: # Validate pop is integer if not df["pop"].dtype == pl.Int64: raise ValueError("Column 'pop' must be integer type") # Validate lat and lon are float if not df["lat"].dtype == pl.Float64: raise ValueError("Column 'lat' must be float type") if not df["lon"].dtype == pl.Float64: raise ValueError("Column 'lon' must be float type") # Validate mcv1 is float if not df["mcv1"].dtype == pl.Float64: raise ValueError("Column 'mcv1' must be float type") # Validate mcv1 is between 0 and 1 (as percentages) if not df["mcv1"].is_between(0, 1).all(): raise ValueError("Column 'mcv1' must be between 0 and 1") # Validate ids are either string or integer if not (df["id"].dtype == pl.String or df["id"].dtype == pl.Int64): raise ValueError("Column 'id' must be either string or integer type") # Validate no null values null_counts = df.null_count() if np.any(null_counts): raise ValueError(f"DataFrame contains null values:\n{null_counts}") except Exception as e: raise ValueError(f"DataFrame validation error:\n{e}") from e
BaseScenario = BaseBiweeklyScenario