You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 21:36:03