我想通过一个大的二维数组(15100米)来进行一些功能扩展。在
对一个有10万条记录的样本集的研究表明我需要更快地得到这个结果。在
编辑(数据模型信息)
为了简化,我们假设只有两个相关的列:
我想添加第三列,计算这个IP在过去12小时内出现了多少次。在
结束编辑
我的第一次尝试是使用pandas,因为在命名维度上工作很舒服,但速度太慢:
for index,row in tqdm_notebook(myData.iterrows(),desc='iterrows'):
# how many times was the IP address (and specific device) around in the prior 5h?
hours = 12
seen = myData[(myData['ip']==row['ip'])
&(myData['device']==row['device'])
&(myData['os']==row['os'])
&(myData['unix']<row['unix'])
&(myData['unix']>(row['unix']-(60*60*hours)))].shape[0]
ip_seen = myData[(myData['ip']==row['ip'])
&(myData['unix']<row['unix'])
&(myData['unix']>(row['unix']-(60*60*hours)))].shape[0]
myData.loc[index,'seen'] = seen
myData.loc[index,'ip_seen'] = ip_seen
然后我切换到numpy数组并希望得到更好的结果,但是对于完整的数据集运行它仍然太慢:
^{pr2}$我的下一个想法是只迭代一次,并维护一个不断增长的当前计数字典,而不是每次迭代都向后看。在
但这也有一些其他的缺点(例如,如何跟踪何时减少12小时窗口外的观测值)。在
你将如何处理这个问题?在
它甚至可以选择使用低级别的Tensorflow函数来涉及GPU吗?在
谢谢
加速的唯一方法是循环。在您的例子中,您可以尝试将^{} 与所需时间范围的窗口一起使用,使用Unix时间戳作为日期时间索引(假设记录是按时间戳排序的,否则您需要先排序)。这对于
ip_seen
应该可以正常工作:但是,当聚合涉及多个列时,比如
^{pr2}$seen
列,它会变得更加复杂。目前(参见Pandas issue #15095)滚动函数不支持跨越两个维度的聚合。解决方法可以是将感兴趣的列合并到一个新的序列中,例如元组(如果值是数字,这可能会更好)或字符串(如果值已经是字符串,则可能更好)。例如:编辑
显然^{} 只适用于数字类型,这就留下了两个选项:
滚动
myData
的索引(现在应该是而不是datetime,因为rolling
也不能使用它),然后使用index窗口获取必要的数据并进行操作:但是,这并不是
rolling
的使用方式,我不确定这是否比仅仅循环提供了更好的性能。正如在对@jdehesa的评论中提到的,我采用了另一种方法,它允许我只迭代一次整个数据集,并从索引中提取(衰减的)权重。在
这样一来,结果就不是最初要求的固定时间窗口,而是先前的观察随着时间的推移“淡出”,给最近频繁的观测增加了权重。在
与最初计划的简化方法(结果证明成本更高)相比,此功能包含更多信息。在
感谢您的意见!在
编辑
同时,我切换到numpy数组来执行相同的操作,现在只需要一小部分时间(在<;2h内进行200m更新的循环)。在
以防万一有人找个起点:
^{pr2}$相关问题 更多 >
编程相关推荐