Extract base DataModelUtil class

This commit is contained in:
Christophe Bedard 2019-08-07 14:25:38 +02:00
parent 41a7a95fd4
commit 24f5cecb4d

View file

@ -25,25 +25,71 @@ from typing import Union
from pandas import DataFrame from pandas import DataFrame
from .data_model import DataModel
from .data_model.cpu_time import CpuTimeDataModel from .data_model.cpu_time import CpuTimeDataModel
from .data_model.profile import ProfileDataModel from .data_model.profile import ProfileDataModel
from .data_model.ros import RosDataModel from .data_model.ros import RosDataModel
class ProfileDataModelUtil(): class DataModelUtil():
""" """
Profiling data model utility class. Base data model util class, which provides functions to get more info about a data model.
Provides functions to get more info on the data. This class provides basic util functions.
""" """
def __init__(self, data_model: DataModel) -> None:
"""
Constructor.
:param data_model: the data model
"""
self.__data = data_model
@property
def data(self) -> DataModel:
return self.__data
@staticmethod
def convert_time_columns(
original: DataFrame,
columns_ns_to_ms: List[str] = [],
columns_ns_to_datetime: List[str] = [],
inplace: bool = True,
) -> DataFrame:
"""
Convert time columns from nanoseconds to either milliseconds or `datetime` objects.
:param original: the original `DataFrame`
:param columns_ns_to_ms: the columns for which to convert ns to ms
:param columns_ns_to_datetime: the columns for which to convert ns to `datetime`
:param inplace: whether to convert in place or to return a copy
:return: the resulting `DataFrame`
"""
df = original if inplace else original.copy()
# Convert from ns to ms
if len(columns_ns_to_ms) > 0:
df[columns_ns_to_ms] = df[columns_ns_to_ms].applymap(
lambda t: t / 1000000.0
)
# Convert from ns to ms + ms to datetime, as UTC
if len(columns_ns_to_datetime) > 0:
df[columns_ns_to_datetime] = df[columns_ns_to_datetime].applymap(
lambda t: dt.utcfromtimestamp(t / 1000000000.0)
)
return df
class ProfileDataModelUtil(DataModelUtil):
"""Profiling data model utility class."""
def __init__(self, data_model: ProfileDataModel) -> None: def __init__(self, data_model: ProfileDataModel) -> None:
""" """
Constructor. Constructor.
:param data_model: the data model object to use :param data_model: the data model object to use
""" """
self.data = data_model super().__init__(data_model)
def with_tid(self, tid: int) -> DataFrame: def with_tid(self, tid: int) -> DataFrame:
return self.data.times.loc[self.data.times['tid'] == tid] return self.data.times.loc[self.data.times['tid'] == tid]
@ -90,12 +136,8 @@ class ProfileDataModelUtil():
return functions_data return functions_data
class CpuTimeDataModelUtil(): class CpuTimeDataModelUtil(DataModelUtil):
""" """CPU time data model utility class."""
CPU time data model utility class.
Provides functions to get info on a CPU time data model.
"""
def __init__(self, data_model: CpuTimeDataModel) -> None: def __init__(self, data_model: CpuTimeDataModel) -> None:
""" """
@ -103,19 +145,15 @@ class CpuTimeDataModelUtil():
:param data_model: the data model object to use :param data_model: the data model object to use
""" """
self.data = data_model super().__init__(data_model)
def get_time_per_thread(self) -> DataFrame: def get_time_per_thread(self) -> DataFrame:
"""Get a DataFrame of total duration for each thread.""" """Get a DataFrame of total duration for each thread."""
return self.data.times.loc[:, ['tid', 'duration']].groupby(by='tid').sum() return self.data.times.loc[:, ['tid', 'duration']].groupby(by='tid').sum()
class RosDataModelUtil(): class RosDataModelUtil(DataModelUtil):
""" """ROS data model utility class."""
ROS data model utility class.
Provides functions to get info on a ROS data model.
"""
def __init__(self, data_model: RosDataModel) -> None: def __init__(self, data_model: RosDataModel) -> None:
""" """
@ -123,7 +161,7 @@ class RosDataModelUtil():
:param data_model: the data model object to use :param data_model: the data model object to use
""" """
self.data = data_model super().__init__(data_model)
def _prettify(self, original: str) -> str: def _prettify(self, original: str) -> str:
""" """
@ -210,13 +248,8 @@ class RosDataModelUtil():
self.data.callback_instances.loc[:, 'callback_object'] == callback_obj, self.data.callback_instances.loc[:, 'callback_object'] == callback_obj,
['timestamp', 'duration'] ['timestamp', 'duration']
] ]
# Transform both columns to ms # Time conversion
data[['timestamp', 'duration']] = data[ return self.convert_time_columns(data, ['timestamp', 'duration'], ['timestamp'])
['timestamp', 'duration']
].apply(lambda d: d / 1000000.0)
# Transform start timestamp column to datetime objects
data['timestamp'] = data['timestamp'].apply(lambda t: dt.fromtimestamp(t / 1000.0))
return data
def get_node_tid_from_name( def get_node_tid_from_name(
self, node_name: str self, node_name: str