Как найти одновременные сессии под одной учетной записи?

Необходимо найти количество зафиксированных случаев одновременных сессий из-под одной УЗ. Допустим пользователь 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 шт):

Автор решения: Vasyl Kolomiets

Ну вы почти решили. На будущее приводите код, чтобы легче было ответить на вопрос. Ну как я примерно сделал. Тогда желающих ответить будет больше. Просто я был выходной сегодня, а то тоже прошел бы мимо вопроса.
Посмотрите это:

"""
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

чтобы анализ велся не по оставшейся части группы, а по всей группе.
Если что не понятно - спрашивайте )

→ Ссылка