Как найти одновременные сессии под одной учетной записи?
Необходимо найти количество зафиксированных случаев одновременных сессий из-под одной УЗ. Допустим пользователь superuser до завершения первой сессии в другом браузере начал новую сессию. Я понимаю что нужно сравнивать промежутки времени и если они совпадают то записывать их. Может знаете библиотеки с которыми можно решить эту задачу быстро.
Данные в таком виде:

Результат должен быть таким:
Написал такой код, но не могу завершить:
for user in set(df.user_name):
print(user)
for session in zip(df[df.user_name == user].login, df[df.user_name == user].logout):
print(session)
print(df[df.user_name == user].login)
Нужно проверить входит ли print(df[df.user_name == user].login) в сессию. и наоборот. Не знаю насколько мой подход правильный
Ответы (1 шт):
Ну вы почти решили. На будущее приводите код, чтобы легче было ответить на вопрос. Ну как я примерно сделал. Тогда желающих ответить будет больше. Просто я был выходной сегодня, а то тоже прошел бы мимо вопроса.
Посмотрите это:
"""
Created on Wed Dec 30 11:41:51 2020.
@author: Vasil
"""
import pandas as pd
import numpy as np
sessions_in = {"user_name": [
"superuser", "superuser", "superuser", "webgv", "omni_admin", "server", "server", "superuser",
],
"login": [
"2020-12-10 10:08:54",
"2020-12-10 10:45:45",
"2020-12-10 10:10:15",
"2020-12-10 11:46:21",
"2020-12-10 11:46:34",
"2020-12-12 22:54:12",
"2020-12-13 22:54:15",
"2020-12-14 10:15:09",
],
"logout": [
"2020-12-10 10:10:17",
"2020-12-10 10:45:47",
"2020-12-10 11:34:27",
"2020-12-10 11:46:22",
"2020-12-10 12:00:52",
"2020-12-12 22:54:15",
"2020-12-13 22:54:19",
"2020-12-14 10:55:50",
]}
df_sessions = pd.DataFrame(sessions_in).assign(overlaping=np.NaN)
def time_overlaping(g):
"""
Заполнение по группе признака перекрытия по времени.
Parameters
----------
g : pandas groupe
Выборка сессий одного пользователя.
Returns
-------
g : pandas groupe
Группа с заполненным столбцом признака перекрытия.
"""
for datas in g.itertuples():
print(datas.Index, datas.overlaping, datas.user_name)
print("sum=", g.login.between(datas.login, datas.logout).sum())
g.at[datas.Index, "overlaping"] = g.loc[datas.Index:].login.between(datas.login,
datas.logout).sum() - 1
return g
df_sessions = df_sessions.groupby("user_name").apply(time_overlaping)
print(df_sessions)
rez = df_sessions.groupby("user_name").sum()
print(rez)
Выведет это
user_name
omni_admin 0.0
server 0.0
superuser 1.0
webgv 0.0
Я немного перемудрил, однако все "приемы" думаю будут вам полезными ;-)
Тут используется то обстоятельство, что True при суммировании ведет себя как единица.
Ненужные принты выбросите потом ))
Если вам нужна разметка всех "пересечений", то строка
g.at[datas.Index, "overlaping"] = g.loc[datas.Index:].login.between(datas.login, datas.logout).sum() - 1
должна быть переписана как
g.at[datas.Index, "overlaping"] = g.login.between(datas.login, datas.logout).sum() - 1
чтобы анализ велся не по оставшейся части группы, а по всей группе.
Если что не понятно - спрашивайте )
