Source code for src.model.base
"""Base classes for health data models.
Provides HK_GROUPS registry to public API .
"""
from enum import Enum
from types import MappingProxyType
from typing import Any
# ---------------------------------------------------------------------------
# Sentinel
# ---------------------------------------------------------------------------
[docs]
class MissingUnit(Enum):
"""Sentinel unit value assigned to categorical (non-numeric) records.
Example::
df.loc[mask, "unit"] = MissingUnit.CATEGORICAL.value # → "Categorical"
"""
CATEGORICAL = "Categorical"
# ---------------------------------------------------------------------------
# Base model classes
# ---------------------------------------------------------------------------
[docs]
class HKIdentifier:
"""Sentinel identifier base class."""
group: str
identifier_type: str
[docs]
class HKQuantityTypeIdentifier(HKIdentifier):
"""Sentinel quantity identifier values."""
identifier_type = "quantity"
[docs]
class HKCategoryTypeIdentifier(HKIdentifier):
"""Sentinel category identifier values."""
identifier_type = "category"
[docs]
class Values:
"""HK category identifier values :class:`Enum` template.
Subclasses overwrite this class as Enum with their associated values.
"""
pass
[docs]
@classmethod
def category_values(cls) -> dict[str, int]:
"""Return name: value dict of `HKCategoryTypeIdentifier` values."""
return {i.name: i.value for i in cls.Values}
[docs]
class HKMiscTypeIdentifier(HKIdentifier):
"""Sentinel miscellaneous identifier values."""
identifier_type = "miscellaneous"
# ---------------------------------------------------------------------------
# Groups
# ---------------------------------------------------------------------------
[docs]
class HKGroup: # noqa: D101
group: str
[docs]
class BodyMeasurements(HKGroup): # noqa: D101
group = "body_measurements"
[docs]
class Fitness(HKGroup): # noqa: D101
group = "body_measurements"
[docs]
class ReproductiveHealth(HKGroup): # noqa: D101
group = "reproductive_health"
[docs]
class Hearing(HKGroup): # noqa: D101
group = "hearing"
[docs]
class VitalSigns(HKGroup): # noqa: D101
group = "vital_signs"
[docs]
class LabTestResults(HKGroup): # noqa: D101
group = "lab_test_results"
[docs]
class Mobility(HKGroup): # noqa: D101
group = "mobility"
[docs]
class Nutrition(HKGroup): # noqa: D101
group = "nutrition"
[docs]
class UVExposure(HKGroup): # noqa: D101
group = "uv_exposure"
[docs]
class Diving(HKGroup): # noqa: D101
group = "diving"
[docs]
class Mindfulness(HKGroup): # noqa: D101
group = "mindfulness"
[docs]
class Symptoms(HKGroup): # noqa: D101
group = "symptoms"
[docs]
class Other(HKGroup): # noqa: D101
group = "other"
# ---------------------------------------------------------------------------
# Group Registry
# ---------------------------------------------------------------------------
HK_GROUPS: MappingProxyType[str, Any] = MappingProxyType(
{group.__name__: group for group in HKGroup.__subclasses__()}
)
# ---------------------------------------------------------------------------
# Misc. data type(s) that don't fit the category/quantity type distinction
# ---------------------------------------------------------------------------
[docs]
class HKDataTypeSleepDurationGoal(HKMiscTypeIdentifier, Fitness): # noqa: D101
pass
# ---------------------------------------------------------------------------
# Misc Registry
# ---------------------------------------------------------------------------
HKMiscTypeIdentifierRegistry: MappingProxyType[str, Any] = MappingProxyType(
{group.__name__: group for group in HKMiscTypeIdentifier.__subclasses__()}
)