Source code for pm4py.algo.discovery.dfg.variants.clean
import time
from enum import Enum
from typing import Optional, Dict, Any
import numpy as np
import pandas as pd
from pm4py.objects.dfg.obj import DFG
from pm4py.util import constants, exec_utils
from pm4py.util import xes_constants as xes_util
[docs]
class Parameters(Enum):
ACTIVITY_KEY = constants.PARAMETER_CONSTANT_ACTIVITY_KEY
CASE_ID_KEY = constants.PARAMETER_CONSTANT_CASEID_KEY
TIMESTAMP_KEY = constants.PARAMETER_CONSTANT_TIMESTAMP_KEY
CONST_AUX_ACT_START = "aux_act_start"
CONST_PROCESS_START = "#!$#PROCESS_START#!$#"
CONST_AUX_ACT_END = "aux_act_end"
CONST_PROCESS_END = "#!$#PROCESS_END#!$#"
[docs]
def apply(
log: pd.DataFrame, parameters: Optional[Dict[str, Any]] = None
) -> DFG:
parameters = {} if parameters is None else parameters
act_key = exec_utils.get_param_value(
Parameters.ACTIVITY_KEY, parameters, xes_util.DEFAULT_NAME_KEY
)
cid_key = exec_utils.get_param_value(
Parameters.CASE_ID_KEY, parameters, constants.CASE_ATTRIBUTE_GLUE
)
time_key = exec_utils.get_param_value(
Parameters.TIMESTAMP_KEY, parameters, xes_util.DEFAULT_TIMESTAMP_KEY
)
df = (
log.sort_values([cid_key, time_key])
.loc[:, [cid_key, act_key]]
.reset_index()
)
aux_act_start = CONST_AUX_ACT_START + str(time.time())
aux_act_end = CONST_AUX_ACT_END + str(time.time())
df[aux_act_start] = (
df.groupby(cid_key)[act_key]
.shift(1)
.replace(np.nan, CONST_PROCESS_START)
)
df[aux_act_end] = (
df.groupby(cid_key)[act_key]
.shift(-1)
.replace(np.nan, CONST_PROCESS_END)
)
starters = df[(df[aux_act_start] == CONST_PROCESS_START)]
borders = df[(df[aux_act_end] == CONST_PROCESS_END)]
connections = df[
(
(df[aux_act_start] != CONST_PROCESS_START)
& (df[aux_act_end] != CONST_PROCESS_END)
)
]
dfg = DFG()
for a, b, f in list(
connections.groupby([act_key, aux_act_end])
.size()
.reset_index()
.itertuples(index=False, name=None)
):
dfg.graph[(a, b)] += f
for a, f in list(
starters.groupby([act_key])
.size()
.reset_index()
.itertuples(index=False, name=None)
):
dfg.start_activities[a] += f
for a, f in list(
borders.groupby([act_key])
.size()
.reset_index()
.itertuples(index=False, name=None)
):
dfg.end_activities[a] += f
return dfg