Source code for pm4py.objects.conversion.log.variants.to_event_log
'''
PM4Py – A Process Mining Library for Python
Copyright (C) 2024 Process Intelligence Solutions UG (haftungsbeschränkt)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see this software project's root or
visit <https://www.gnu.org/licenses/>.
Website: https://processintelligence.solutions
Contact: info@processintelligence.solutions
'''
from copy import copy
from copy import deepcopy
from enum import Enum
from pm4py.objects.conversion.log import constants
from pm4py.objects.conversion.log.variants import to_event_stream
from pm4py.objects.log import obj as log_instance
from pm4py.util import xes_constants as xes
from pm4py.util import exec_utils, constants as pmconstants, pandas_utils
import pandas as pd
[docs]
class Parameters(Enum):
DEEP_COPY = constants.DEEPCOPY
STREAM_POST_PROCESSING = constants.STREAM_POSTPROCESSING
CASE_ATTRIBUTE_PREFIX = "case_attribute_prefix"
CASE_ID_KEY = pmconstants.PARAMETER_CONSTANT_CASEID_KEY
[docs]
def apply(log, parameters=None):
if parameters is None:
parameters = {}
if type(log) is log_instance.Trace or type(log) is log_instance.EventLog:
return log
enable_deepcopy = exec_utils.get_param_value(
Parameters.DEEP_COPY, parameters, False
)
glue = exec_utils.get_param_value(
Parameters.CASE_ID_KEY, parameters, pmconstants.CASE_CONCEPT_NAME
)
case_pref = exec_utils.get_param_value(
Parameters.CASE_ATTRIBUTE_PREFIX, parameters, "case:"
)
if pandas_utils.check_is_pandas_dataframe(log):
log = to_event_stream.apply(log, parameters=parameters)
if isinstance(log, log_instance.EventStream) and (
not isinstance(log, log_instance.EventLog)
):
return __transform_event_stream_to_event_log(
log,
case_glue=glue,
include_case_attributes=True,
case_attribute_prefix=case_pref,
enable_deepcopy=enable_deepcopy,
)
return log
def __transform_event_stream_to_event_log(
log,
case_glue=Parameters.CASE_ID_KEY.value,
include_case_attributes=True,
case_attribute_prefix=Parameters.CASE_ATTRIBUTE_PREFIX.value,
enable_deepcopy=False,
):
"""
Converts the event stream to an event log
Parameters
----------
log: :class:`pm4py.log.log.EventLog`
An event stream
case_glue:
Case identifier. Default is 'case:concept:name'
include_case_attributes:
Default is True
case_attribute_prefix:
Default is 'case:'
enable_deepcopy
Enables deepcopy (avoid references between input and output objects)
Returns
-------
log : :class:`pm4py.log.log.EventLog`
An event log
"""
if enable_deepcopy:
log = deepcopy(log)
traces = {}
for orig_event in log:
event = copy(orig_event)
glue = event[case_glue]
if glue not in traces:
trace_attr = {}
if include_case_attributes:
for k in event.keys():
if k.startswith(case_attribute_prefix):
trace_attr[k.replace(case_attribute_prefix, "")] = (
event[k]
)
if xes.DEFAULT_TRACEID_KEY not in trace_attr:
trace_attr[xes.DEFAULT_TRACEID_KEY] = glue
traces[glue] = log_instance.Trace(attributes=trace_attr)
if include_case_attributes:
for k in list(event.keys()):
if k.startswith(case_attribute_prefix):
del event[k]
traces[glue].append(event)
return log_instance.EventLog(
traces.values(),
attributes=log.attributes,
classifiers=log.classifiers,
omni_present=log.omni_present,
extensions=log.extensions,
properties=log.properties,
)