code: def _parse_logging_execution_to_df(
      logging_file_path: str,
  ) -> pd.DataFrame:
      """Parse the logged messages into a dataframe that contains execution info.
  
      Parameters
      ----------
      logging_file_path: str
          The file path where the logged messages are stored. This is the file path that
          is passed to the `FeatureCollection` its `calculate` method.
  
      Returns
      -------
      pd.DataFrame
          A DataFrame with the features its function, input series names, output names,
          and (%) calculation duration.
  
      Note
      ----
      This function only works when the ``logging_file_path`` used in a
      ``FeatureCollection`` its ``calculate`` method is passed.
  
      """
      df = logging_file_to_df(logging_file_path)
      df[
          [
              "function",
              "series_names",
              "window",
              "stride",
              "output_names",
              "duration",
          ]
      ] = pd.DataFrame(
          list(df["message"].apply(_parse_message)),
          index=df.index,
      )
      # Parse the window
      if (df["window"] == "manual").any():
          # All should be manual
          assert (df["window"] == "manual").all()
      elif df["window"].str.isnumeric().all():
          df["window"] = pd.to_numeric(df["window"])
      else:
          df["window"] = pd.to_timedelta(df["window"]).apply(
              timedelta_to_str
          )
      # Parse the stride
      if (df["stride"] == "manual").any():
          # All should be manual
          assert (df["stride"] == "manual").all()
      elif (
          df["stride"]
          .apply(
              lambda stride_tuple: np.char.isnumeric(stride_tuple).all()
          )
          .all()
      ):
          df["stride"] = df["stride"].apply(
              lambda stride_tuple: tuple(
                  sorted(pd.to_numeric(s) for s in stride_tuple)
              )
          )
      else:
          df["stride"] = df["stride"].apply(
              lambda stride_tuple: tuple(
                  timedelta_to_str(pd.to_timedelta(s))
                  for s in stride_tuple
              )
          )
      df["duration %"] = (
          100 * (df["duration"] / df["duration"].sum())
      ).round(2)
      return df.drop(columns=["name", "log_level", "message"])
  
file_path: tsflex/tsflex/features/logger.py
imports: import logging
  import re
  import numpy
  import pandas
  from ..utils.logging import logging_file_to_df, remove_inner_brackets
  from ..utils.time import timedelta_to_str
label_desc: Use image node_id 2 for calling a global function with example usage: _parse_logging_execution_to_df(logging_file_path) and returns: df