Как настроить сессию для пользователя по разнице во времени в пандах - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть фрейм данных с такой структурой (упорядоченный по user_id, время события):

user_idвремя события (в миллисекундах)разница во времени между предыдущими и текущими событиями для каждого user_id (в секундах)

Напримерuser_1 1550844324011 -user_1 1550844504351 180

user_2 1550807681932 -user_2 1550807780002 98user_2 1550809800005 2020user_2 1550819800005 10000

А затем я хочу установить идентификатор сеанса для каждого user_id в новом столбце.Логика следующая: если разница во времени между событиями превышает 900 секунд, тогда я должен установить новый session_id для пользователя.Таким образом, результат должен быть следующим:

user_1 1550844324011 - 1user_1 1550844504351 180 1

user_2 1550807681932 - 1user_2 1550807780002 98 1user_2 1550809800005 2020 2user_2 1550819800005 10000 3

Как я могу сделать это правильно?Помоги мне, пожалуйста.Спасибо

1 Ответ

0 голосов
/ 24 февраля 2019

Это должно работать

# Sorting is needed, otherwise .diff() will output wrong results
df = df.sort_values(['user_id', 'timestamp'])

# Timestamp diff in seconds
diff_timestamp = df.groupby('user_id')['timestamp'].diff() / 1000

# indexes where new session_id will be created
new_session = (diff_timestamp.isnull()) | (diff_timestamp > 900)

# Create unique session_id for every user
df['session_id'] = df.loc[new_session, ['user_id', 'timestamp']] \
    .groupby('user_id').rank(method='first').astype(int)

# Propagate last valid observation forward (replace NaN)
df['session_id'] = df['session_id'].fillna(method='ffill').astype(int)

Unique session ID by timestamp and user ID


После небольшого разговора , если используется .diff(),убедитесь, что столбец числовой!

...