- 在开始之前
- 管理访问权限
- 入门指南
- 集成
- 使用流程应用程序
- 创建应用程序
- 正在加载数据
- Transforming data
- 自定义仪表板
- 发布流程应用程序
- 应用程序模板
- 通知
- 其他资源

Process Mining 用户指南
自定义吞吐量时间指标
简介
通过自定义数据转换和仪表板编辑,您可以创建和使用自定义吞吐时间指标。 吞吐量时间是两个活动 A 和 B 之间的时间。以下各节描述了在编辑转换时创建自定义吞吐时间指标所需的步骤,以及如何在流程应用程序仪表板中启用吞吐量时间指标。
使用编辑转换创建自定义吞吐量时间指标
您必须首先计算吞吐量时间,然后将其作为案例字段提供。
计算吞吐时间
根据每种情况,您可以计算活动 A和活动 B之间的吞吐量时间。由于活动在每个案例中可能发生多次,因此您需要考虑是记录活动的第一次出现还是最后一次出现。
- 根据事件日志创建其他模型,以计算所需的吞吐时间。例如,Cases_with_吞吐量_times。
- 在此模型中,创建预处理表,您可以在其中定义要用于计算的事件端。对于每个表格,您需要案例 ID 和活动的事件结尾。以下代码示例说明了如何选择案例中最后一次出现的活动 A。
Event_end_activity_A as ( select Event_log."Case_ID", max(Event_log."Event_end") as "Event_end_activity_A" from Event_log where Event_log."Activity" = 'Activity A' group by Event_log."Case_ID")Event_end_activity_A as ( select Event_log."Case_ID", max(Event_log."Event_end") as "Event_end_activity_A" from Event_log where Event_log."Activity" = 'Activity A' group by Event_log."Case_ID")备注:在此示例中,如果要选择活动的第一个匹配项,请将 max 替换为 min。
- 通过将预处理表联接到事件日志并计算实际吞吐时间来定义吞吐时间表。
提示:
您可以使用 pm-utils 包中提供的 datediff 函数来计算任何两个事件结束之间的时间差。
对于活动 A先于活动 B 的实例,应以毫秒为单位计算吞吐量时间。毫秒是用于在应用程序模板中定义持续时间的时间单位。由于预处理表中的吞吐量时间已按案例进行分组,因此您可以选择任何记录。在上面的示例中,使用了聚合最小值。可以定义吞吐时间表,选择“吞吐时间”和“案例 ID”,如以下代码块所示。
Cases_with_throughput_times as (
select
Event_log."Case_ID",
case
when min(Event_end_activity_A."Event_end_activity_A") <= min(Event_end_activity_B."Event_end_activity_B")
then {{ pm_utils.datediff('millisecond',
'min(Event_end_activity_A."Event_end_activity_A")',
'min(Event_end_activity_B."Event_end_activity_B")') }}
end as "Throughput_time_activity_A_to_activity_B"
from Event_log
left join Event_end_activity_A
on Event_log."Case_ID" = Event_end_activity_A."Case_ID"
left join Event_end_activity_B
on Event_log."Case_ID" = Event_end_activity_B."Case_ID"
group by Event_log."Case_ID)"
Cases_with_throughput_times as (
select
Event_log."Case_ID",
case
when min(Event_end_activity_A."Event_end_activity_A") <= min(Event_end_activity_B."Event_end_activity_B")
then {{ pm_utils.datediff('millisecond',
'min(Event_end_activity_A."Event_end_activity_A")',
'min(Event_end_activity_B."Event_end_activity_B")') }}
end as "Throughput_time_activity_A_to_activity_B"
from Event_log
left join Event_end_activity_A
on Event_log."Case_ID" = Event_end_activity_A."Case_ID"
left join Event_end_activity_B
on Event_log."Case_ID" = Event_end_activity_B."Case_ID"
group by Event_log."Case_ID)"
计算吞吐时间 (以天为单位,不包括周末)
您可以使用 pm-utils 包中提供的date_from_timestamp函数来计算两个活动之间的天数。此外,您可使用diff_weekdays函数筛选出周末。
以下代码示例显示了如何计算活动 A和活动 B之间工作日的数量。
with Event_log as (
select * from {{ ref('Event_log') }}
),
Activity_A as (
select
Event_log."Case_ID",
min({{ pm_utils.date_from_timestamp('Event_log."Event_end"') }}) as "Date_activity_A"
from Event_log
where Event_log."Activity" = 'Receive invoice'
group by Event_log."Case_ID"
),
Activity_B as (
select
Event_log."Case_ID",
min({{ pm_utils.date_from_timestamp('Event_log."Event_end"') }}) as "Date_activity_B"
from Event_log
where Event_log."Activity" = 'Pay invoice'
group by Event_log."Case_ID"
),
Total_days_minus_weekends as (
select
Activity_A."Case_ID",
Activity_A."Date_activity_A",
Activity_B."Date_activity_B",
{{ pm_utils.diff_weekdays('Activity_A."Date_activity_A"', 'Activity_B."Date_activity_B"') }}
-- Only compute for cases where both dates are known.
from Activity_A
inner join Activity_B
on Activity_A."Case_ID" = Activity_B."Case_ID"
)
select * from Total_days_minus_weekends
with Event_log as (
select * from {{ ref('Event_log') }}
),
Activity_A as (
select
Event_log."Case_ID",
min({{ pm_utils.date_from_timestamp('Event_log."Event_end"') }}) as "Date_activity_A"
from Event_log
where Event_log."Activity" = 'Receive invoice'
group by Event_log."Case_ID"
),
Activity_B as (
select
Event_log."Case_ID",
min({{ pm_utils.date_from_timestamp('Event_log."Event_end"') }}) as "Date_activity_B"
from Event_log
where Event_log."Activity" = 'Pay invoice'
group by Event_log."Case_ID"
),
Total_days_minus_weekends as (
select
Activity_A."Case_ID",
Activity_A."Date_activity_A",
Activity_B."Date_activity_B",
{{ pm_utils.diff_weekdays('Activity_A."Date_activity_A"', 'Activity_B."Date_activity_B"') }}
-- Only compute for cases where both dates are known.
from Activity_A
inner join Activity_B
on Activity_A."Case_ID" = Activity_B."Case_ID"
)
select * from Total_days_minus_weekends
计算吞吐时间 (以天为单位,不包括节假日)
请按照以下步骤计算活动 A和活动 B之间的吞吐量时间(天),不包括周末和节假日。
1.创建一个Holidays.csv文件以定义应计为节假日的天。文件至少应包含每个节假日的记录。使用以下格式:
| 假期 | 日期 | 工作日 |
|---|---|---|
| 元首 | 2024 年 1 月 1 日 | 是 |
| 复活节 | 2024 年 3 月 31 日 | 否 |
| .. | .. | .. |
Holidays.csv文件中的记录用于计算需要从某个日期范围中排除的天数。
2.将Holidays.csv文件作为种子文件加载到dbt项目中。有关详细信息,请参阅 Jinja 种子上的官方 dbt 文档。
3.使用 pm-utils 包中提供的date_from_timestamp和diff_weekdays函数计算以天为单位的吞吐时间,不包括周末,如计算以天为单位的吞吐时间,不包括周末。
4.计算存储在假期.csv文件中的每个案例的给定日期范围内的记录数。以下代码显示了一个示例。
Holidays_count as (
select
Total_days_minus_weekends."Case_ID",
count(Holidays."Date") as "Number_of_holidays"
from Total_days_minus_weekends
left join Holidays
on Holidays."Date" between Total_days_minus_weekends."Date_activity_A" and Total_days_minus_weekends."Date_activity_B"
where Holidays."Weekday" = 'Yes'
group by Total_days_minus_weekends."Case_ID"
)
Holidays_count as (
select
Total_days_minus_weekends."Case_ID",
count(Holidays."Date") as "Number_of_holidays"
from Total_days_minus_weekends
left join Holidays
on Holidays."Date" between Total_days_minus_weekends."Date_activity_A" and Total_days_minus_weekends."Date_activity_B"
where Holidays."Weekday" = 'Yes'
group by Total_days_minus_weekends."Case_ID"
)
在上面的示例中,当假期是星期六或星期日时,筛选条件“ Weekday = 'Yes' ”用于不减去节假日。 diff_weekday函数已处理此问题。
5.从为每个案例计算的总天数减去计算的节假日数。以下代码显示了一个示例。
Total_days_minus_weekends_and_holidays as (
select
Total_days_minus_weekends."Case_ID",
Total_days_minus_weekends."Number_of_days" - Holidays_count."Number_of_holidays" as "Number_of_days_between_dates"
from Total_days_minus_weekends
inner join Holidays_count
on Total_days_minus_weekends."Case_ID" = Holidays_count."Case_ID"
)
Total_days_minus_weekends_and_holidays as (
select
Total_days_minus_weekends."Case_ID",
Total_days_minus_weekends."Number_of_days" - Holidays_count."Number_of_holidays" as "Number_of_days_between_dates"
from Total_days_minus_weekends
inner join Holidays_count
on Total_days_minus_weekends."Case_ID" = Holidays_count."Case_ID"
)
将吞吐量时间作为案例字段提供
创建吞吐时间表后,需要将此表联接到案例表,以将其他吞吐时间数据添加为案例信息。要在仪表板中提供新的吞吐时间字段,需要将新的吞吐时间字段转换为其中一个自定义案例持续时间字段。
替换“案例”表格中的一个自定义案例持续时间行,如下所示:
{{ pm_utils.optional(ref('Cases_base'), '"custom_case_duration_1"', 'integer') }} as "custom_case_duration_1",
{{ pm_utils.optional(ref('Cases_base'), '"custom_case_duration_1"', 'integer') }} as "custom_case_duration_1",
使用新创建的吞吐时间:
Cases_with_throughput_times."Throughput_time_activity_A_to_activity_B" as "custom_case_duration_1",
Cases_with_throughput_times."Throughput_time_activity_A_to_activity_B" as "custom_case_duration_1",
自定义吞吐量时间指标的转换更新现已完成,并且可以导入到应用程序模板中。
在流程应用程序仪表板中启用吞吐量时间指标
在转换中创建自定义吞吐时间后,该时间可在应用程序模板中用作其别名下的案例属性。您可以自定义流程应用程序,以根据已在转换中创建的自定义吞吐时间创建吞吐时间指标。
默认情况下,新的自定义持续时间字段将添加为数字字段。请务必编辑该字段,并将新字段的“类型”更改为“持续时间” 。请参阅“数据管理器” 。
- 转到 Data Manager,并创建新指标。
- 选择要用于吞吐时间的自定义持续时间字段,然后选择平均值或任何其他所需的聚合。您还可以在数据管理器中将自定义案例持续时间字段重命名为所需的名称。
- 编辑应用程序,并将新指标放置在要向业务用户提供的图表上。
- 发布仪表板,以在仪表板上提供吞吐时间指标。
备注:
在“Purchase-to-Pay”和“Order-to-Cash”应用程序模板中,Purchase_order_items_with_throtput_times 和 Sales_order_items_with_throtput_times 已分别提供吞吐时间计算。可以在此处添加自定义吞吐量时间,然后将其用作“采购订单项目”或“销售订单项目”的自定义持续时间。