Source code for dispel.providers.apdm.tasks.gait
"""Transform module for transform step specific to APDM format.
The transform step below are steps only modifying a reading coming from a APDM input.
"""
import pandas as pd
from dispel.data.raw import DEFAULT_COLUMNS, RawDataValueDefinition
from dispel.data.values import AbbreviatedValue as AV
from dispel.processing.data_set import StorageError, transformation
from dispel.processing.level import ProcessingStepGroup
from dispel.processing.transform import TransformStep
from dispel.providers.apdm.data import APDMReading
from dispel.providers.generic.flags.le_flags import NoMovementDetected
from dispel.providers.generic.tasks.gait.steps import (
    FlagPreprocessing,
    GaitCoreSteps,
    TechnicalFlags,
)
from dispel.providers.registry import process_factory
from dispel.signal.accelerometer import GRAVITY_CONSTANT as G_CONST
TASK_NAME = AV("Two-minute walk test", "2MWT")
[docs]
class ConvertToG(TransformStep):
    """Scale from one m/s^2 to g.
    The step expects a unique data set id for `data_set_ids` pointing to a data frame
    containing both acceleration and gravity with a :class:`pandas.DatetimeIndex` index.
    """
    definitions = [RawDataValueDefinition("ts", "ts", unit="ms")] + [
        RawDataValueDefinition(ax, ax, unit="g") for ax in DEFAULT_COLUMNS
    ]
    @transformation
    def _transform(self, data) -> pd.DataFrame:
        data.loc[:, DEFAULT_COLUMNS] = data.loc[:, DEFAULT_COLUMNS] / G_CONST
        return data
[docs]
    def get_new_data_set_id(self):
        """Overwrite new_data_set_id."""
        return f"{self.data_set_ids[0]}" 
 
[docs]
class ConvertAccelerometersUnits(ProcessingStepGroup):
    """Convert the unit of accelerometers to G."""
    steps = [
        ConvertToG(data_set_ids=id_, storage_error=StorageError.OVERWRITE)
        for id_ in ["raw_accelerometer", "accelerometer"]
    ] 
[docs]
class TwoMinuteWalkTestProcessingSteps(ProcessingStepGroup):
    """Steps to extract 2MWT measures from a reading."""
    steps = [
        # first check technical flags
        TechnicalFlags(),
        # convert to right units
        ConvertAccelerometersUnits(),
        # run the core steps to extract intermediate raw datasets and measures
        GaitCoreSteps(),
        # preprocess flags
        FlagPreprocessing(),
        # run the movement invalidations
        NoMovementDetected(),
    ]
    kwargs = {"task_name": TASK_NAME} 
STEPS = [TwoMinuteWalkTestProcessingSteps()]
process_2mwt = process_factory(
    task_name=TASK_NAME,
    steps=STEPS,
    codes="2mwt",
    supported_type=APDMReading,
)