我有DataFrame
个事件日志:
eventtime, eventname, user, execution_in_s, delta_event_time
事件名称,例如可以是" new_order","登录"或者" update_order"。
我的问题是,我想知道不同用户在eventname == "error"
和login
之间的句点中是否update_order
。我的一段时间有一个开始时间和一个结束时间。
在我今天早上尝试之前,这一切听起来都很容易。
对于24小时日志的时间范围,我可能没有一对,因为登录可能是昨天发生的。我不知道如何处理类似的事情。
delta_event_time
是事件时间的计算列减去executions_in_s。我正在考虑这些真正的时间戳。我计算了它们:
event_frame["delta_event_time"] = event_frame["eventtime"] - pandas.to_timedelta(event_frame["execution_in_s"], unit='s')
我试过这样的事情:
events_keys = numpy.array(["login", "new_order"])
users = numpy.unique(event_frame["user"])
for user in users:
event_name = event_frame[event_frame["eventname"].isin(events_keys) & event_frame["user" == user]]["event_name"]
但这不使用时间段。
我知道Pandas有between_time()
但我不知道如何按用户查询带有句点的DataFrame。
我是否需要使用.iterrows()
迭代DataFrame来计算开始和结束时间图?这需要花费很多时间,仅仅是为了尝试基本的东西。我不知何故认为这会让Pandas无法完成这项任务。
我尝试event_frame.sort(["user", "eventname"])
,效果很好,以便我可以看到相关的行。我对.groupby("user")
没有任何好运,因为它混合了用户,尽管它们是唯一的行值。
也许更好的工作流解决方案是将DataFrame转储到MongoDB中,而不是在这种情况下使用Pandas来执行分析。我不确定,因为我是框架的新手。
答案 0 :(得分:1)
这是我认为可以解决您的问题的伪代码。如果您共享数据样本,我会更新它。
hashCode()
最好的方法可能是创建一个进行比较的函数。因为那样你就可以通过声明grouped = event_frame.groupby('user') # This should work.
# I cannot believe that it didn't work for you! I won't buy it till you show us proof!
for name, group in grouped:
group.set_index('eventtime') # This will make it easier to work with time series.
# I am changing index here because different users may have similar or
# overlapping times, and it is a pain in the neck to resolve indexing conflicts.
login_ind = group[group['eventname'] == 'login'].index
error_ind = group[group['eventname'] == 'error'].index
update_ind = group[group['eventname'] == 'update_order'].index
# Here you can compare the lists login_ind, error_ind and update_ind however you wish.
# Note that the list can even have a length of 0.
# User name is stored in the variable name. So you can get it from there.
来创建一个dict。
然后在error_user = {}
内调用您的函数,如下所示:for name, group in grouped:
。