- 发行说明
- 在开始之前
- 入门指南
- 集成
- 使用流程应用程序
- 创建应用程序
- 正在加载数据
- 自定义流程应用程序
- 发布流程应用程序
- 应用程序模板
- 其他资源
Process Mining
自定义吞吐量时间指标
通过自定义数据转换和仪表板编辑,您可以创建和使用自定义吞吐量时间指标。 吞吐量时间是两个活动 A 和 B 之间的时间。下面描述了在编辑转换时创建自定义吞吐量时间指标所需执行的步骤,以及如何在流程应用程序仪表板中启用吞吐量时间指标。
您必须首先计算吞吐量时间,然后将其作为“ 案例” 字段提供。
您可以根据情况计算 活动 A 和 活动 B之间的吞吐量时间。由于每个用例可能会多次发生活动,因此您需要考虑是使用第一次还是最后一次发生的活动。
-
根据 事件日志 创建其他模型,以计算所需的吞吐量时间。 例如, Cases_with_throughput_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)"
计算吞吐时间 (以天为单位,不包括周末)
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之间的吞吐时间(以天为单位),不包括周末和节假日。
Holidays.csv
文件以定义应计为节假日的日期。 该文件应至少包含每个假日的记录。 使用以下格式:
假期 |
日期 |
工作日 |
元首 |
2024 年 1 月 1 日 |
是 |
复活节 |
2024 年 3 月 31 日 |
否 |
.. |
.. |
.. |
Holidays.csv
文件中的记录用于计算需要从某个日期范围中排除的天数。
Holidays.csv
文件作为种子文件加载到dbt项目中。 有关详细信息,请参阅有关 Jinja 种子的官方 dbt 文档。
date_from_timestamp
和diff_weekdays
函数计算吞吐时间(以天为单位,不包括周末),如计算吞吐时间(以天为单位,不包括周末)。
.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,并创建新指标。
- 选择要用于吞吐量时间的自定义持续时间字段,然后选择“ 平均值 ”或任何其他所需的聚合。 您还可以在 Data Manager中将自定义案例持续时间字段重命名为所需的名称。
- 编辑应用程序,并将新指标放置在要向业务用户提供的图表上。
- 发布仪表板,以在仪表板上提供吞吐时间指标。
在“ 采购到付款 ”和 “订单到现金” 应用程序模板中,“ Purchase_order_items_with_throughput_times ”和 “Sales_order_items_with_throughput_times”中已经分别提供了吞吐量时间计算。 可以在此处添加自定义吞吐量时间,然后在 Purchase_order_items 或 Sales_order_items 上将其作为自定义持续时间提供。