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