计算两步过程的每日平均持续时间

Posted

技术标签:

【中文标题】计算两步过程的每日平均持续时间【英文标题】:Calculate daily average duration for two step process 【发布时间】:2021-12-11 23:42:06 【问题描述】:

我有一个如下所示的数据框。

data = 'user': [3249, 2160, 2160, 3249, 5120, 3900, 3900, 3900, 5200, 5200], 'action': ['step 1', 'step 1', 'step 2', 'step 2', 'step 1', 'step 1', 'step 1', 'step 2', 'step 1', 'step 2'], 'time': ['2021-10-25 19:45:43', '2021-10-25 19:48:46', '2021-10-25 19:50:21', '2021-10-25 19:57:34', '2021-10-25 20:30:56', '2021-10-25 20:35:40', '2021-10-25 20:50:59', '2021-10-25 21:15:08', '2021-10-25 18:23:41', '2021-10-26 18:49:38']

df = pd.DataFrame(data)
df['time'] = pd.to_datetime(df['time'])
df.sort_values('time', inplace=True)

df

user    action  time
8   5200    step 1  2021-10-25 18:23:41
0   3249    step 1  2021-10-25 19:45:43
1   2160    step 1  2021-10-25 19:48:46
2   2160    step 2  2021-10-25 19:50:21
3   3249    step 2  2021-10-25 19:57:34
4   5120    step 1  2021-10-25 20:30:56
5   3900    step 1  2021-10-25 20:35:40
6   3900    step 1  2021-10-25 20:50:59
7   3900    step 2  2021-10-25 21:15:08
9   5200    step 2  2021-10-26 18:49:38

我希望能够计算出用户从第 1 步到第 2 步所需的平均时间,然后按天分组,最终得到如下所示的结果:

Date Avg Duration
2021-10-25 752 seconds
2021-10-26 87957 seconds

从this 开始,我尝试了以下操作,但当我引入用户未在同一天完成第 1 步和第 2 步的实例时,它不起作用。我希望如果用户在 2021 年 10 月 25 日开始第 1 步,并在 2021 年 10 月 26 日完成第 2 步,则记录的持续时间为 2021 年 10 月 26 日。

out = df.pivot_table(index=['user', df['time'].dt.date], columns='action',
                     values='time', aggfunc='last').reset_index()

out['daily_avg'] = out.groupby(['user', 'time'], as_index=False) \
                      .apply(lambda x: x['step 2'] - x['step 1']).values

out.groupby('time')['daily_avg'].mean(numeric_only=False).reset_index()

    time    daily_avg
0   2021-10-25  -42701 days +05:00:36.258089984
1   2021-10-26  NaT

【问题讨论】:

用户39002021-10-25 上有2 个step 1。您以哪一个作为参考来计算时差?有没有用户一天有多个step 1和多个step 2的情况? 将使用后面的步骤 1,因为这意味着用户重新启动了该过程。如果用户多次完成该过程,则用户可能在一天内有多个步骤 1 和 2。如果用户没有先进入第 1 步,则他们无法进入第 2 步,但可以根据需要在第 1 步重新开始 【参考方案1】:

我认为在使用 pandas 的简单方法之前,您可能需要一个逻辑密集型步骤来清理数据。就像 Hoang 指出的那样,用户 3900 有 2 个 step-1,然后是 1 个 step-2。在聚合之前必须处理对它的解释。如果您假设一对一的关系并且最后一步 1 是有效的(假设用户终止了前一步或崩溃等),您应该删除这些重复项。如果用户多次成功运行第 1 步到第 2 步,但最后一次第 2 步未启动,则问题会进一步复杂化。因此,您不能只选择每个用户步骤的最后一次。

我的偏好通常是假设存在最丑陋的数据,并进行一对一匹配,从而在使用 pandas 聚合和数据透视函数之前删除已停止的 step-1。

【讨论】:

以上是关于计算两步过程的每日平均持续时间的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE中如果计算每日的平均值

使用 Azure Monitor Metrics 获取平均每日计算分钟数

BigQuery:计算每日分区表中的平均值

如何计算熊猫每列的每日平均值?

如何根据他们的名字计算每日平均值的差异?

如何计算会话持续时间和平均值。 Google Analytics 原始数据中的会话持续时间?