计算两步过程的每日平均持续时间
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
【问题讨论】:
用户3900
在2021-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。
【讨论】:
以上是关于计算两步过程的每日平均持续时间的主要内容,如果未能解决你的问题,请参考以下文章