Source code for pm4py.objects.ocel.util.ev_att_to_obj_type

from pm4py.objects.ocel.obj import OCEL
from typing import Optional, Dict, Any
from enum import Enum
from pm4py.objects.ocel import constants
from pm4py.util import exec_utils, pandas_utils
from copy import deepcopy
import pandas as pd


[docs] class Parameters(Enum): EVENT_ID = constants.PARAM_EVENT_ID EVENT_ACTIVITY = constants.PARAM_EVENT_ACTIVITY EVENT_TIMESTAMP = constants.PARAM_EVENT_TIMESTAMP OBJECT_ID = constants.PARAM_OBJECT_ID OBJECT_TYPE = constants.PARAM_OBJECT_TYPE INTERNAL_INDEX = constants.PARAM_INTERNAL_INDEX
[docs] def apply(ocel: OCEL, param: str, parameters: Optional[Dict[Any, Any]] = None): """ Transforms an event attribute to an object type. Parameters --------------- ocel Object-centric event log param Event attribute that should be moved at the event level parameters Parameters of the algorithm, including: - Parameters.EVENT_ID => the event identifier column - Parameters.EVENT_ACTIVITY => the event activity column - Parameters.EVENT_TIMESTAMP => the event timestamp column - Parameters.OBJECT_ID => the object identifier column - Parameters.OBJECT_TYPE => the object type column - Parameters.INTERNAL_INDEX => the internal index Returns -------------- new_ocel OCEL in which the attribute has been moved to the object type level. """ if parameters is None: parameters = {} event_id = exec_utils.get_param_value( Parameters.EVENT_ID, parameters, ocel.event_id_column ) event_activity = exec_utils.get_param_value( Parameters.EVENT_ACTIVITY, parameters, ocel.event_activity ) event_timestamp = exec_utils.get_param_value( Parameters.EVENT_TIMESTAMP, parameters, ocel.event_timestamp ) object_id = exec_utils.get_param_value( Parameters.OBJECT_ID, parameters, ocel.object_id_column ) object_type = exec_utils.get_param_value( Parameters.OBJECT_TYPE, parameters, ocel.object_type_column ) internal_index = exec_utils.get_param_value( Parameters.INTERNAL_INDEX, parameters, constants.DEFAULT_INTERNAL_INDEX ) new_ocel = deepcopy(ocel) new_ocel.events[param] = new_ocel.events[param].astype(str) ev_param = new_ocel.events.dropna(subset=[param])[ [event_id, event_activity, event_timestamp, param] ] vals = pandas_utils.format_unique(ev_param[param].unique()) ev_param = ev_param.rename(columns={param: object_id}) ev_param[object_type] = param new_objects_df = pandas_utils.instantiate_dataframe( [{object_id: v, object_type: param} for v in vals] ) new_ocel.objects = pandas_utils.concat([new_ocel.objects, new_objects_df]) new_ocel.relations = pandas_utils.concat([new_ocel.relations, ev_param]) new_ocel.relations = pandas_utils.insert_index( new_ocel.relations, internal_index, reset_index=False, copy_dataframe=False, ) new_ocel.relations = new_ocel.relations.sort_values( [event_timestamp, internal_index] ) del new_ocel.events[param] return new_ocel