【发布时间】:2018-08-30 13:59:18
【问题描述】:
所以基本上我正在处理大型市场数据集(100,000 行)。数据集列的简化版本如下所示:
[时间戳] [价格] [份额] [订单] [方]
111.239 $23.28 200 2 B
111.240 $23.59 200 1 秒
等等等等。这些数据是我们的市场分析软件在输入一个 pcap 文件后得到的。现在,我需要比较来自两个不同来源的相同市场数据的输出,以确保我们的市场数据解析器正常工作并且不会丢失订单或行为不一致。唯一的问题是时间戳略有不同,因为数据来自两个不同的来源。
所以我目前的方法是将这些数据集实现为字典列表,每个字典代表这些订单之一。我有字典 A 和字典 B,每个代表两个来源之一,每个都按时间戳排序。然后我选择时间的“模糊因子”,在这个例子中我将使用 2 秒。以下是我在伪代码中进行比较的方法:
for item1 in dictionaryA:
for item 2 in dictionaryB
if the item2[timestamp] is over 2 seconds before item1[timestamp]:
remove item from dictionaryB
elif item2[timestamp] is over 2 seconds after item1[timestamp]:
mark item1 as not matched
break
else: # We are in 2 second fuzz factor:
compare the items, if a match is found:
Mark item 1 in dictionaryA as matched
Remove item2 from dictionary
break
如您所见,当我循环浏览字典 A 时,我通过不断地从字典 B 中删除项目来加快处理速度。由于大多数项目都匹配,这大大加快了处理速度。但是我不确定如何在熊猫中做这样的事情。 apply() 函数似乎是迭代数据集的最快方法,但它迭代整个数据集,直到满足某个条件,就像我上面做的时间戳模糊测试一样。此外,我不确定在 pandas 中删除行的速度有多快。
注意事项:
- 时间戳在浮点格式中的精度为纳秒,但 多个订单可能具有相同的时间戳。
- 可能有几个订单 看起来完全一样,但时间戳不同
- 几个订单可能看起来完全相同,并且出现 相同的时间戳,两个订单都需要找到单独的匹配项
那你们觉得呢?我将使用哪些函数在 pandas 中重新实现此算法?而且因为我正在转向熊猫,我应该重新调整算法本身吗?我一直在玩 iterrows,但这似乎很慢,我想知道是否有某种方法可以在这里应用矢量化运算符。
感谢您的帮助,如果您有任何问题,请告诉我。
【问题讨论】:
-
两个来源之间的时间戳系统性不同吗?例如,如果订单在一个来源中同时发生,但在另一个来源中可能在不同时间发生(或者它们的顺序可以在来源之间颠倒),我认为您有一个非常复杂的问题。
-
时间戳应该在一定范围内。如果订单出现在位置 A,然后在 2 秒内无法与位置 B 的订单匹配,我们可以肯定地说该订单未找到。
标签: python pandas dataframe recursion optimization