diff --git a/tracetools_analysis/test/tracetools_analysis/test_data_model_util.py b/tracetools_analysis/test/tracetools_analysis/test_data_model_util.py index 96e4348..4be009c 100644 --- a/tracetools_analysis/test/tracetools_analysis/test_data_model_util.py +++ b/tracetools_analysis/test/tracetools_analysis/test_data_model_util.py @@ -70,6 +70,45 @@ class TestDataModelUtil(unittest.TestCase): ) assert_frame_equal(result_df, expected_df, check_dtype=False) + def test_compute_column_difference(self) -> None: + input_df = DataFrame( + data=[ + { + 'a': 10, + 'b': 13, + 'c': 1, + }, + { + 'a': 1, + 'b': 3, + 'c': 69, + }, + ], + ) + expected_df = DataFrame( + data=[ + { + 'a': 10, + 'b': 13, + 'c': 1, + 'diff': 3, + }, + { + 'a': 1, + 'b': 3, + 'c': 69, + 'diff': 2, + }, + ], + ) + DataModelUtil.compute_column_difference( + input_df, + 'b', + 'a', + 'diff', + ) + assert_frame_equal(input_df, expected_df) + if __name__ == '__main__': unittest.main() diff --git a/tracetools_analysis/tracetools_analysis/utils.py b/tracetools_analysis/tracetools_analysis/utils.py index 2343c8b..d415311 100644 --- a/tracetools_analysis/tracetools_analysis/utils.py +++ b/tracetools_analysis/tracetools_analysis/utils.py @@ -79,6 +79,23 @@ class DataModelUtil(): ) return df + @staticmethod + def compute_column_difference( + df: DataFrame, + left_column: str, + right_column: str, + diff_column: str, + ) -> None: + """ + Create new column with difference between two columns. + + :param df: the dataframe (inplace) + :param left_column: the name of the left column + :param right_column: the name of the right column + :param diff_column: the name of the new column with differences + """ + df[diff_column] = df.apply(lambda row: row[left_column] - row[right_column], axis=1) + class ProfileDataModelUtil(DataModelUtil): """Profiling data model utility class.""" @@ -127,6 +144,12 @@ class ProfileDataModelUtil(DataModelUtil): (tid_df['depth'] == depth) & (tid_df['function_name'] == name) ][['start_timestamp', 'duration', 'actual_duration']] + self.compute_column_difference( + data, + 'duration', + 'actual_duration', + 'duration_difference', + ) functions_data.append({ 'depth': depth, 'function_name': name,