Python 计算日志文件的最大并发唯一用户数

Python 计算日志文件的最大并发唯一用户数,python,pandas,dataframe,csv,Python,Pandas,Dataframe,Csv,这个问题建立在这里已经回答过的一个问题之上- 为了扩展这个问题,我希望找到并发唯一用户的最大数量,因此我需要忽略(或不计算)在所述期间(行)同一用户连接不止一次的任何实例 我已经使用了上面提到的问题的答案来计算每一行当时的最大并发用户数,但它没有考虑用户 这里要指出的另一个问题是,用户日志本身可能存在重叠。我的意思是,对于单个用户,以下是可能的: START_TIME END_TIME USER_NAME 29.03.2012 20:18:00

这个问题建立在这里已经回答过的一个问题之上-

为了扩展这个问题,我希望找到并发唯一用户的最大数量,因此我需要忽略(或不计算)在所述期间(行)同一用户连接不止一次的任何实例

我已经使用了上面提到的问题的答案来计算每一行当时的最大并发用户数,但它没有考虑用户

这里要指出的另一个问题是,用户日志本身可能存在重叠。我的意思是,对于单个用户,以下是可能的:

START_TIME           END_TIME               USER_NAME
29.03.2012 20:18:00  29.03.2012 20:54:13    abc
29.03.2012 20:19:42  29.03.2012 20:40:24    abc
29.03.2012 20:23:03  29.03.2012 20:40:24    abc

我创建了以下代码以获得最大并发用户数:

import pandas as pd
import sys

filename = sys.argv[1]

# Read the csv into the pandas dataframe
df = pd.read_csv(filename)

# Convert start time and end time columns to datetime format
df["START_TIME"] = pd.to_datetime(df["START_TIME"])
df["END_TIME"] = pd.to_datetime(df["END_TIME"])

active_events= {}
# Count instances where the start time was less than or equal to reference start and end time is greater than reference start time
for i in df.index:
    active_events[i] = len(df[(df["START_TIME"]<=df.loc[i,"START_TIME"]) & (df["END_TIME"]> df.loc[i,"START_TIME"])])
last_columns = pd.DataFrame({'CONCURRENT_EVENTS' : pd.Series(active_events)})

# Add the newly created column to the original file
total = df.join(last_columns)

# Save the output to a new csv file using part of the original filename
total.to_csv("Output" + " - " + filename)
代码当前返回以下输出csv:

    SESSION_ID  START_TIME          END_TIME            USER_NAME   CONCURRENT_EVENTS
0   45030       29.03.2020 14:37    29.03.2020 19:01    jkk         1
1   45033       29.03.2020 14:46    29.03.2020 16:23    ady         2
2   45035       29.03.2020 14:54    29.03.2020 18:27    ady         3
3   45036       29.03.2020 15:51    29.03.2020 17:34    drm         4
4   45040       29.03.2020 17:38    29.03.2020 22:07    ady         3
5   45042       29.03.2020 18:58    29.03.2020 20:25    djx         3

我想返回的是,调整并发计数如果用户已经为相关行计数,则此输出显示用户ady仅为每个并发事件计算计数一次:

    SESSION_ID  START_TIME          END_TIME            USER_NAME   CONCURRENT_EVENTS
0   45030       29.03.2020 14:37    29.03.2020 19:01    jkk         1
1   45033       29.03.2020 14:46    29.03.2020 16:23    ady         2
2   45035       29.03.2020 14:54    29.03.2020 18:27    ady         2
3   45036       29.03.2020 15:51    29.03.2020 17:34    drm         3
4   45040       29.03.2020 17:38    29.03.2020 22:07    ady         2
5   45042       29.03.2020 18:58    29.03.2020 20:25    djx         3


非常感谢您提供的任何帮助或想法,请提前感谢。

在将
len
分配给
活动\u事件[i]
之前,您可以按
用户名进行分组,以获得不同的用户数

df.index中的i的
:
活动事件[i]=len(df[(df[“开始时间”]df.loc[i,“开始时间”]))].groupby('USER\u NAME'))
last_columns=pd.DataFrame({'CONCURRENT_EVENTS':pd.Series(active_EVENTS)})
产出:

   SESSION_ID          START_TIME            END_TIME USER_NAME  CONCURRENT_EVENTS
0       45030 2020-03-29 14:37:00 2020-03-29 19:01:00       jkk                  1
1       45033 2020-03-29 14:46:00 2020-03-29 16:23:00       ady                  2
2       45035 2020-03-29 14:54:00 2020-03-29 18:27:00       ady                  2
3       45036 2020-03-29 15:51:00 2020-03-29 17:34:00       drm                  3
4       45040 2020-03-29 17:38:00 2020-03-29 22:07:00       ady                  2
5       45042 2020-03-29 18:58:00 2020-03-29 20:25:00       djx                  3

我还回答了您之前的问题,总的来说,我认为使用apply比使用for循环更具python风格。但是,如果我理解正确的话,对您的问题的简单回答是简单地更改for循环中的一行:

active_events[i] = df[
(df["START_TIME"]<=df.loc[i,"START_TIME"]) &
(df["END_TIME"]> df.loc[i,"START_TIME"]) 
]["USER_NAME"].nunique()
active_事件[i]=df[
(df[“开始时间”]df.loc[i,“开始时间”])
][“用户名”].nunique()

为什么
并发事件
3个用于
drm
和3个用于
djx
?对于索引5
djx
来说,看起来应该是4。只有索引0
jkk
和索引4
ady
同时被访问,所以输出是3。顺便说一句,感谢大家的回答,这使我能够解决问题,我已经坚持了一段时间!
active_events[i] = df[
(df["START_TIME"]<=df.loc[i,"START_TIME"]) &
(df["END_TIME"]> df.loc[i,"START_TIME"]) 
]["USER_NAME"].nunique()