如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列)

Posted

技术标签:

【中文标题】如何根据纪元时间获得前半部分和后半部分(\'attempt updated_at\' 列)【英文标题】:How do I get the first half and second half depending on the epoch time('attempt_updated_at' column)如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列) 【发布时间】:2019-11-15 00:57:03 【问题描述】:

所以,我想找出 'Avg.每个会话的前半部分和后半部分的难度级别”,我找不到解决这个问题的合适方法。 我使用纪元时间将会话分成两半,然后找到平均难度级别。

session_id  question_difficulty     attempt_updated_at
5c822af21c1fba22            2   1557470128000
5c822af21c1fba22            3   1557469685000
5c822af21c1fba22            4   1557470079000
5c822af21c1fba22            5   1557472999000
5c822af21c1fba22            3   1557474145000
5c822af21c1fba22            3   1557474441000
5c822af21c1fba22            4   1557474299000
5c822af21c1fba22            4   1557474738000
5c822af21c1fba22            3   1557475430000
5c822af21c1fba22            4   1557476960000
5c822af21c1fba22            5   1557477458000
5c822af21c1fba22            2   1557478118000
5c822af21c1fba22            5   1557482556000
5c822af21c1fba22            4   1557482809000
5c822af21c1fba22            5   1557482886000
5c822af21c1fba22            5   1557484232000

我正在研究 python pandas(Jupter Notebook)。

代码方面我不知道从哪里开始。 (Noobie 警报)

我希望输出如下:

session_id 前半段难度后半段难度

【问题讨论】:

【参考方案1】:

IIUC,您可以使用 pandas.qcut 将 epoch 切割成 2 个大小相同的 bin(前半部分/后半部分)。然后使用groupby.mean:

df.groupby(['session_id', pd.qcut(df.attempt_updated_at, q=2)])['question_difficulty'].mean()

[出]

session_id        attempt_updated_at                  
5c822af21c1fba22  (1557469684999.999, 1557475084000.0]    3.500
                  (1557475084000.0, 1557484232000.0]      4.125
Name: question_difficulty, dtype: float64

或者,根据您定义“前半部分”/“后半部分”的方式,您可能需要 pandas.cut,使用 bins=2 参数大小与上述qcut 相同):

df.groupby(['session_id', pd.cut(df.attempt_updated_at, bins=2)])['question_difficulty'].mean()

[出]

session_id        attempt_updated_at                
5c822af21c1fba22  (1557469670453.0, 1557476958500.0]    3.444444
                  (1557476958500.0, 1557484232000.0]    4.285714
Name: question_difficulty, dtype: float64

更新

要计算唯一 session_id 的不同时间段,您可能首先必须按 session_id 分组;在每个组上运行上述方法;最后,concat 结果。下面是一个使用列表推导的例子:

groups_session_id = df.groupby('session_id')

pd.concat([g.groupby(['session_id', pd.cut(g['attempt_updated_at'], bins=2).astype(str)])
           ['question_difficulty'].mean() for _, g in groups_session_id])

更新 2

要将这些平均值添加回您的原始DataFrame,您可以使用DataFrame.merge

df_avg_question_difficulty = pd.concat([g.groupby(['session_id', pd.cut(g['attempt_updated_at'], bins=2, labels = [1, 2]).astype(str)])
                                        ['question_difficulty'].mean().unstack(1) for _, g in groups_session_id])

df = df.merge(df_avg_question_difficulty, left_on='session_id', right_index=True)

【讨论】:

谢谢。它确实有效,但是当我尝试使用 10 个不同的 session_id 时,输出是混乱的。 @RedDragon 我更新了我的答案,我相信如果你需要为每个 session_id 计算不同的时间段,你可能需要嵌套groupby 有没有办法像这样打印 session_id, mean1 , mean2 ? 您可以将labels 参数添加到pd.cut 方法,并从您的groupby 对象中添加unstack 1 级索引。所以...pd.concat([g.groupby(['session_id', pd.cut(g['attempt_updated_at'], bins=2, labels = [1, 2]).astype(str)])['question_difficulty'].mean().unstack(1) for _, g in groups_session_id]) 我已经更新了答案,使用 merge... 让我知道您是否是这个意思

以上是关于如何根据纪元时间获得前半部分和后半部分('attempt updated_at' 列)的主要内容,如果未能解决你的问题,请参考以下文章

笔试题集锦(编程题)

排序算法的c++实现——快速排序

如何在一个字节中传播位?

归并排序

将矢量并行保存到文件

Codeforces Round #563 (Div. 2)