Source code for dispel.providers.sensorlog.io
"""Functionality to read files from SensorLog."""
import hashlib
from typing import Union
import pandas as pd
from dispel.data.core import Device, Evaluation, Reading
from dispel.data.devices import IOSPlatform
from dispel.data.levels import Level
from dispel.io.raw import extract_raw_data_set
from dispel.providers.sensorlog import PROVIDER_ID
from dispel.providers.sensorlog.data import (
DATA_SET_DEFINITIONS_DICT,
SensorLogSensorType,
)
[docs]
def get_evaluation(data: Union[pd.DataFrame, dict]) -> Evaluation:
"""Get the evaluation for the SensorLog reading.
Parameters
----------
data
The data frame obtained with :func:`read_sensor_log_as_data_frame`
Returns
-------
Evaluation
The evaluation information
"""
start, end = pd.to_datetime(data["loggingTime"]).agg(["min", "max"])
evaluation_uuid = hashlib.md5(
(data["identifierForVendor"][0] + data["loggingTime"][0]).encode()
).hexdigest()
return Evaluation(start=start, end=end, uuid=evaluation_uuid)
[docs]
def get_device(data: Union[pd.DataFrame, dict]) -> Device:
"""Get device information from the SensorLog reading.
Parameters
----------
data
The data frame obtained with :func:`read_sensor_log_as_data_frame`
Returns
-------
Device
The device information present in the SensorLog reading
Raises
------
ValueError
If a wrong identifier definition in data set is given.
"""
device_uuid = data["identifierForVendor"].unique()
if len(device_uuid) != 1:
raise ValueError("Wrong identifier definition in data set")
return Device(uuid=device_uuid[0], platform=IOSPlatform())
[docs]
def read_sensor_log_as_data_frame(path: str) -> pd.DataFrame:
"""Read a SensorLog json file into a pandas data frame.
Parameters
----------
path
The path to the SensorLog json file
Returns
-------
pandas.DataFrame
The data frame representation of the SensorLog json file.
"""
return pd.read_json(path)
[docs]
def get_sensor_log_reading(data: Union[pd.DataFrame, dict]) -> Reading:
"""Get the reading representation of a SensorLog data frame.
Parameters
----------
data
The data frame obtained with :func:`read_sensor_log_as_data_frame`
Returns
-------
Reading
The :class:`~dispel.data.core.Reading` representation of the SensorLog json file.
"""
data_sets = []
# try to extract all present data sets
for sensor_type in SensorLogSensorType:
try:
data_sets.append(
extract_raw_data_set(sensor_type, data, DATA_SET_DEFINITIONS_DICT)
)
except KeyError:
pass # skipping columns not being present
evaluation = get_evaluation(data)
device = get_device(data)
return Reading(
evaluation=evaluation,
levels=[
Level(
id_=PROVIDER_ID,
start=evaluation.start,
end=evaluation.end,
raw_data_sets=data_sets,
)
],
device=device,
)
[docs]
def read_sensor_log(path: str) -> Reading:
"""Read data from SensorLog JSON file.
Parameters
----------
path
The path to the JSON file containing the data to be read.
Returns
-------
Reading
The :class:`~dispel.data.core.Reading` representation of the SensorLog json file.
"""
data = read_sensor_log_as_data_frame(path)
return get_sensor_log_reading(data)