正在使用pandas DataFrames验证用户访问日志



我对熊猫不是很精通,但在过去一年左右的时间里,我一直在各种项目中使用它——到目前为止,我很喜欢它,但我还没有真正掌握它,所以我希望得到一些帮助。我试着在谷歌上搜索了好几天,但我已经接近了只想用panda作为迭代器的地步,这似乎是一种浪费。我觉得我可能只是缺少了一些基本的术语,不知道该搜索什么,但我已经受够了阅读和搜索。

我现在正在做的工作要求我通过将ID和访问日期与用户注册表之类的东西进行比较,来检查一些日志的有效访问。我使用python和panda是因为它们是我觉得最舒服的工具,但我对其他方法的建议持开放态度。注册表是从其他人管理的一些Excel表中解析的,日志是有序的csv。

将这些加载到两个DataFrames中,我想检查每个日志条目的有效性。一个数据帧充当注册表,提供用户ID、创建日期和结束日期,另一个包含作为行的日志,带有用户ID和时间戳:

注册表

created                 end  ID
1            2018-09-04                 NaT  66f56efc5cc6353ba
2            2018-10-09          2018-11-09  167a2c65133d9f4a3
3            2018-10-09          2018-11-09  f0efc501e52e7b1e1

日志

Timestamp  ID
0       2019-08-01 00:01:48.027  4459eeab695a2
1       2019-08-01 00:06:03.981  e500df5f2c2ed
2       2019-08-01 00:06:36.100  e500df5f2c2ed

我想对照我的注册表检查每个日志条目,看看它发生时是否允许访问。我已经编写了一个函数来根据我的注册表检查ID和日期,但我需要弄清楚如何将我的检查应用于整个日志数据帧:

def validate(userid, date): #eg. 'wayf-1234', datetime.date(2019,11,23)
df_target=df_registry[df_acl['created'].notnull() & ~(df_registry['end'] < date)]
return (df_target.values==userid).any()

我的第一个倾向是像行选择器一样直接使用该函数(不确定该怎么称呼它(,但它不起作用:

df_logs[validate(df_logs['id'], df_logs['Timestamp']) == True]

我敢肯定,为每一行启动一个数据帧来检查特定日期的效率会非常低,但我只是在黑客攻击,试图让一些事情发挥作用,目前效率很低。但我真的很想知道是否有人对如何做到这一点有任何意见或看法。我应该迭代数据帧的行,并将我的逻辑应用于每一行(这似乎与熊猫的使用方式相反(,还是有更聪明的方法?

谢谢。

merge_asof就是这里的工具。它允许在列列表上精确合并(使用by(,然后在一列中的值紧挨着另一个数据帧中的值找到最高值。

这里你可以使用:

tmp = pd.merge_asof(logs, registry, left_on = ['Timestamp'],
right_on=['created'], by='ID')

对于日志中的每一行,您都可以从注册表中获得具有相同ID和创建日期的行,该行位于时间戳的正下方。如果结束时间为NaT或大于时间戳(添加一天后…(,则访问有效:

tmp['valid'] = tmp.end.isna()|(tmp.end + pd.Timedelta('1D') > tmp.Timestamp)

注意:只有当日期列为true pd.Timestamp(dtype datetime64(时,这才有效。。。

最新更新