Как я могу получить первую половину и вторую половину в зависимости от времени эпохи (столбец «try_updated_at») - PullRequest
3 голосов
/ 04 июля 2019

Итак, я хочу узнать «Ср.Уровень сложности в первой и второй половине каждой сессии », я не могу найти правильный способ решить эту проблему.Я делю сессию на две половины, используя время эпохи, а затем нахожу средний уровень сложности.

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 (Jupter Notebook).

Код мудрый Iне знаю с чего начать(Noobie Alert)

Я ожидаю, что результат будет выглядеть следующим образом:

session_id первая половина сложности вторая половина сложности

1 Ответ

5 голосов
/ 04 июля 2019

IIUC, вы можете использовать pandas.qcut, чтобы разрезать эпохи на 2 бункера одинакового размера (первая половина / вторая половина). Затем используйте 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; запустить вышеуказанный метод для каждой группы; наконец, 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)
...