如何使用Python计算Precedence Matrix(前置关系矩阵)
Precedence diagrams(前置图)
Precedence Matrix是以矩形格式呈现不同活动之间的流转关系的二维矩阵,可通过调整参数生成不同类型的统计数值(比如绝对流转频次、流转平均耗时等)。
在R中可以使用bupar包进行计算,示例如下:
#Example # Absolute Frequencies patients %>% precedence_matrix(type = "absolute")
输出结果:
## # A tibble: 13 x 3 ## antecedent consequent n ## <fct> <fct> <int> ## 1 Triage and Assessment End 2 ## 2 Blood test End 1 ## 3 Start Registration 500 ## 4 Registration Triage and Assessment 500 ## 5 MRI SCAN Discuss Results 236 ## 6 Triage and Assessment Blood test 237 ## 7 Blood test MRI SCAN 236 ## 8 Discuss Results Check-out 492 ## 9 X-Ray End 2 ## 10 Check-out End 491 ## 11 X-Ray Discuss Results 259 ## 12 Triage and Assessment X-Ray 261 ## 13 Discuss Results End 3
针对问题「如何在Python中实现Precedence Matrix的计算?是否有可直接获取前置矩阵的第三方包?」,解答如下:
Python中可以使用流程挖掘工具包pm4py直接生成前置矩阵,也可以基于pandas手动实现计算逻辑,两种方法如下:
方法1:使用pm4py第三方包直接计算(推荐)
pm4py是Python生态下主流的流程挖掘工具,功能对标R的bupar,内置了前置矩阵(直接跟随图DFG的统计模块),可以直接输出和bupar格式一致的结果。
首先安装依赖:pip install pm4py
示例代码:
import pm4py import pandas as pd # 1. 处理事件日志,核心需要三个字段:案例ID、活动名称、事件时间戳 df = pd.read_csv("你的事件日志文件路径.csv") # 重命名为pm4py要求的标准字段名 df = df.rename(columns={ "你的案例ID列名": "case:concept:name", "你的活动名称列名": "concept:name", "你的时间戳列名": "time:timestamp" }) # 转换时间格式 df["time:timestamp"] = pd.to_datetime(df["time:timestamp"]) # 2. 计算前置矩阵,measure参数对应bupar的type参数 # measure="frequency" 输出绝对流转频次,measure="performance"输出平均流转耗时 precedence_matrix = pm4py.algo.discovery.dfg.adapters.pandas.dfg_statistics.get_dfg_graph( df, measure="frequency" ) # 3. 转换为和bupar输出一致的表格格式 pm_result = [] for (antecedent, consequent), count in precedence_matrix.items(): pm_result.append({"antecedent": antecedent, "consequent": consequent, "n": count}) pm_df = pd.DataFrame(pm_result).sort_values("n", ascending=False).reset_index(drop=True) print(pm_df)
方法2:手动实现前置矩阵(无额外依赖)
前置矩阵本质是统计所有案例中相邻两个活动的出现频次,只需要按案例分组、按时间排序、提取相邻活动对、统计频次四步即可实现,无需额外安装第三方包:
import pandas as pd df = pd.read_csv("你的事件日志文件路径.csv") activity_pairs = [] # 按案例分组,每组内按时间升序排序 for case_id, group in df.sort_values("你的时间戳列名").groupby("你的案例ID列名"): activities = group["你的活动名称列名"].tolist() # 提取当前案例的所有相邻活动对 for i in range(len(activities)-1): activity_pairs.append((activities[i], activities[i+1])) # 统计活动对出现频次,转换为标准输出格式 pair_counts = pd.Series(activity_pairs).value_counts().reset_index() pair_counts.columns = ["activity_pair", "n"] pair_counts[["antecedent", "consequent"]] = pd.DataFrame(pair_counts["activity_pair"].tolist(), index=pair_counts.index) pm_df = pair_counts[["antecedent", "consequent", "n"]].reset_index(drop=True) print(pm_df)
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

