Source code for dispel.providers.sensorlog.processing
"""Processing steps to transform SensorLog readings into internal structure."""
import pandas as pd
from dispel.data.levels import Level
from dispel.data.raw import (
ACCELEROMETER_COLUMNS,
DEFAULT_COLUMNS,
GRAVITY_COLUMNS,
RawDataValueDefinition,
)
from dispel.processing.data_set import StorageError, transformation
from dispel.processing.level import ProcessingStepGroup
from dispel.processing.transform import TransformStep
_TS_COLUMN = RawDataValueDefinition("ts", "ts")
_ACC_COLUMNS = [
RawDataValueDefinition(f"userAcceleration{ax}", ax) for ax in list("XYZ")
]
_GRAVITY_COLUMNS = [RawDataValueDefinition(f"gravity{ax}", ax) for ax in list("XYZ")]
_GYR_COLUMNS = [RawDataValueDefinition(axis, axis) for axis in DEFAULT_COLUMNS]
[docs]
class MeltUserMotionAndGravity(TransformStep):
"""A step to melt the motion and gravity measurements from sensorlog."""
data_set_ids = ["motion-user-acceleration", "motion-gravity"]
storage_error = StorageError.OVERWRITE
definitions = [_TS_COLUMN] + _ACC_COLUMNS + _GRAVITY_COLUMNS
@transformation
def _melt(
self,
user: pd.DataFrame,
gravity: pd.DataFrame,
) -> pd.DataFrame:
data = pd.concat([user, gravity], axis=1)
data.columns = ACCELEROMETER_COLUMNS + GRAVITY_COLUMNS
data.index.name = "ts"
data.sort_index(inplace=True)
data.reset_index(inplace=True)
return data
[docs]
class AlignTimestamp(TransformStep):
"""Align the timestamp of a data set to refer to logging time."""
ts_column = "ts"
storage_error = StorageError.OVERWRITE
[docs]
def get_new_data_set_id(self) -> str:
"""Return the same data set id as provided for the input."""
assert (
len(data_set_ids := list(self.get_data_set_ids())) == 1
), "Only one data set id is allowed to be processed."
return data_set_ids[0]
@transformation
def _align(self, data: pd.DataFrame, level: Level) -> pd.DataFrame:
# Logging based offset to align time stamps
start = data[self.ts_column].min()
offset = level.start - start
data[self.ts_column] += offset
return data
[docs]
class PreprocessAcceleration(ProcessingStepGroup):
"""Preprocessing steps to transform the acceleration."""
# pylint: disable=no-member
steps = [
MeltUserMotionAndGravity(new_data_set_id="acc"),
AlignTimestamp(
data_set_ids="acc",
definitions=MeltUserMotionAndGravity.definitions,
),
]
[docs]
class RenameAndUnsetTimestampIndexForGyroscope(TransformStep):
"""A step to rename columns and reset index for gyro."""
data_set_ids = "gyro"
new_data_set_id = "gyroscope"
definitions = [_TS_COLUMN] + _GYR_COLUMNS
@transformation
def _transform(self, data: pd.DataFrame) -> pd.DataFrame:
data = data.copy()
data.index.name = "ts"
data.reset_index(inplace=True)
data.columns = [
definition.id
for definition in self.get_definitions() # pylint: disable=E1133
]
return data
[docs]
class PreprocessGyroscope(ProcessingStepGroup):
"""Preprocessing steps to transform the gyroscope."""
# pylint: disable=no-member
steps = [
RenameAndUnsetTimestampIndexForGyroscope(),
AlignTimestamp(
data_set_ids="gyroscope",
definitions=RenameAndUnsetTimestampIndexForGyroscope.definitions,
),
]