#python #pandas #session #time
#python #pandas #сеанс #время
Вопрос:
У меня есть приведенный ниже фрейм данных, который отсортирован по пользователю и метке времени (здесь записывается как целое число, чтобы упростить задачу).
Я добавил столбец, который показывает разницу во времени по сравнению с предыдущим действием в минутах, используя pandas diff(). Я определяю действия как принадлежащие одному сеансу, если они происходят с интервалом в 30 минут друг от друга. Тогда легко находить новые сеансы, так как я могу просто посмотреть, равен ли timediff ‘NaT’ или больше 30.
d = {'id': [123, 123, 123, 123, 123, 123, 234, 234],
'activity': ['view','click','click','view','click','view', 'click', 'view'],
'timestamp': [1, 2,3,4,5,6,1,2],
'timediff_min': ['NaT',1,36,2,6,124,'NaT',1],
'new_session': [1,0,1,0,0,1,1,0]}
df = pd.DataFrame(d)
df
В результате получается столбец ‘new_session’. Теперь я могу отфильтровать, чтобы получить фрейм данных с меткой времени начала сеанса, но я хотел бы получить метку времени
о последнем действии, позволяющем рассчитать длину сеанса. Таким образом, в принципе, если выполняется одно действие, время начала и окончания сеанса будет одинаковым, но если в одном сеансе их несколько, началом сеанса будет первое действие, а окончанием сеанса будет последнее действие перед началом следующего сеанса. Таким образом, конечный результат будет примерно таким
d2 = {'id': [123, 123, 123, 234, ],
'activity': ['view','click','view', 'click'] ,
'timestamp': [1, 3,6,1],
'timediff_min': ['NaT',36,124,'NaT'],
'new_session': [1,1,1,1,],
'session_start': [1,3,6,1],
'session_end': [2,5,6,2],}
pd.DataFrame(d2)
Будем признательны за любую помощь. Спасибо!
Комментарии:
1. Зачем спрашивать снова? Предыдущее решение не решает проблему?
2. Это шаг 2, первый шаг — избавиться от дополнительных просмотров, это получение первой и последней временных меток законных действий. Спасибо за вашу помощь на шаге 1, я собираюсь протестировать его завтра и отмечу как решенный, когда сделаю.
Ответ №1:
Я решил это, используя следующий подход
d['time_diff'] = d.groupby('id')['timestamp'].diff()
d['new_sess'] = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'), 'yes', 'no')
new_sessions = np.where((d.time_diff.isnull()) | (d.time_diff > 'P0DT0H30M0S'))
d['sess_count'] = np.NaN
d.iloc[new_sessions[0],9] = new_sessions[0]
d.fillna(method='ffill', inplace = True)
d['sess_id'] = d.id '-' d.sess_count.astype(int).astype(str)
Это создает уникальные идентификаторы сеанса, которые затем я могу сгруппировать, чтобы получить минимальные и максимальные временные метки.