Python pandas: получение начала и конца сеанса для расчета продолжительности сеанса - PullRequest
0 голосов
/ 15 марта 2019

У меня есть нижеприведенный фрейм данных, который отсортирован по пользователю и метке времени (здесь для облегчения написано целое число).

Я добавил столбец, который показывает разницу во времени от предыдущего действия в минутах, используя pandas diff (). Я определяю действия как принадлежащие одному сеансу, если они происходят в течение 30 минут друг от друга. Найти новые сессии легко, так как я могу просто посмотреть, равен ли временной интервал '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 Ответ

0 голосов
/ 16 марта 2019

Я решил это, используя следующий подход

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)

Это создает уникальные идентификаторы сессии, которые я затем могу сгруппировать, чтобы получить минимальную и максимальную отметки времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...