【问题标题】:(effeciently) Iterating recursively over multiple dataframes in pandas(有效)在熊猫中的多个数据帧上递归迭代
【发布时间】: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 中删除行的速度有多快。

注意事项:

  1. 时间戳在浮点格式中的精度为纳秒,但 多个订单可能具有相同的时间戳。
  2. 可能有几个订单 看起来完全一样,但时间戳不同
  3. 几个订单可能看起来完全相同,并且出现 相同的时间戳,两个订单都需要找到单独的匹配项

那你们觉得呢?我将使用哪些函数在 pandas 中重新实现此算法?而且因为我正在转向熊猫,我应该重新调整算法本身吗?我一直在玩 iterrows,但这似乎很慢,我想知道是否有某种方法可以在这里应用矢量化运算符。

感谢您的帮助,如果您有任何问题,请告诉我。

【问题讨论】:

  • 两个来源之间的时间戳系统性不同吗?例如,如果订单在一个来源中同时发生,但在另一个来源中可能在不同时间发生(或者它们的顺序可以在来源之间颠倒),我认为您有一个非常复杂的问题。
  • 时间戳应该在一定范围内。如果订单出现在位置 A,然后在 2 秒内无法与位置 B 的订单匹配,我们可以肯定地说该订单未找到。

标签: python pandas dataframe recursion optimization


【解决方案1】:

Pandas 默认递归执行 Series 和 DataFrame 操作。您可以将所有必要的数据聚集到一个 DataFrame 中,然后使用布尔索引和所需的过滤器来留下您想要的数据。这应该会稍微简化您的操作,因为您不必处理循环来遍历您的市场数据。另一方面,当你使用 pandas 时,不要使用 'Timestamp' 列作为索引;您会发现某些数据集可能会出现错误。如果您还有任何问题,请随时提出,我会尽我所能提供帮助。

【讨论】:

    猜你喜欢
    • 2018-12-25
    • 2018-01-16
    • 2017-05-08
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多