【问题标题】:How to reduce time to loop over an 1 million sets of data using Pandas?如何减少使用 Pandas 循环超过 100 万组数据的时间?
【发布时间】:2017-12-01 23:59:44
【问题描述】:

我在 csv 文件的 1 列中有近 100 万行数据。如果我绘制这 100 万组数据,它将是一个包含 5 个峰值的波形函数。所以我做的第一件事就是将这个 csv 文件导入 pandas 数据框。我想要做的是检测每个波的开始时间和结束时间,我已经完成了一个算法,它确实生成了我想要的输出。

但是,现在的主要问题是需要将近 2 个小时才能获得我想要的最终输出,我认为它不应该这么长。我能想到的就是我使用了太多的 for 循环,因此迭代数据需要太多时间。下面是一个示例代码。 (请注意,虽然这只是一个示例代码,但它应该足够清楚地展示我使用哪种 for 循环结构的想法。

    for i in range(len(data)-(athreshold)):
        if all(data[i+k] < bthreshold for k in range(0,athreshold)):
            n[i] = 5                
            n[i+(athreshold)] = 5
        else:
            for i in range(len(data)-(athreshold), len(data)):
                if data[i] < bthreshold:
                    n[i] = 5

正如您在上面看到的,我使用 for 循环来迭代这 100 万组数据,毫不奇怪它需要很长时间来处理。所以我想知道有没有更有效的方法来处理这种大数据集?

Edit

数据集非常复杂,因为峰值中的值在一个很大的范围内上下波动。所以我需要至少遍历一次数据集来整理出我认为的那些峰值的域时间。现在我的算法是首先迭代这些数据以进行某种函数转换。然后再次遍历数据以获取我想要的开始时间和结束时间并将它们附加到一个新的空列表中。在我得到开始时间和结束时间后,它会变得容易得多,因为它们的数量很少,而且其余的步骤肯定不会花很长时间。所以最耗时的部分是我迭代数据集的那两次。

【问题讨论】:

  • 添加示例数据?
  • 数据只是一大组值(例如,以瓦特为单位的功率)。您可以使用任何值,只要它像波形函数即可。
  • 如果要检测最高的5个值,不能只对数据进行排序吗?
  • 实际上要复杂得多,因为峰值中的值在很大范围内上下波动。所以我需要至少检查一次数据集来整理出我认为的那些峰值的域时间..
  • 你在做这个测试data[i+k] &lt; power_threshold 很多次:当你在data 上滑动窗口时重复测试相同的数据。您是否尝试过创建一个与data 长度相同的thresholded_data 布尔数组,填充一次然后使用它?

标签: python pandas csv large-data


【解决方案1】:

一种方法是沿另一个轴移动数据。例如,假设data 是形状为numpy.array(len(data),) 并且

shifted_data = []
for shift in range(time_threshold):
    shifted_data.append(data[shift:len(data) - time_threshold + shift])
shifted_data = np.concat(shifted_data, axis=1)

现在,每个切片 shifted_data[time, :] 对应于您的数据切片,所以像这样的操作

(shifted_data < power_threshold).prod(axis=1)

返回一个由01 组成的数组,其中每一行都相当于语句

all(data[i+k] < power_threshold for k in range(0,time_threshold))

而且执行起来应该更快。

【讨论】:

  • 但我下一步的代码是检测 1 何时开始以及 0 何时按索引开始,之后检测到的索引应附加到我创建的另外两个空列表中。如果我想这样做,这种方式也可以吗? (请看我上面编辑的代码)
  • 我没有深入探讨您的问题,对我来说您的代码不是很清楚(例如,在语句的 else 部分中,您再次在外部的同一个变量上循环循环,我不清楚这可能产生的影响)。但是如果你需要在固定长度的窗口中分析时间序列,这个 hack 可以为你节省很多时间(例如,在上面的代码中你摆脱了第二个循环,并且应该加快速度)
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2016-07-04
  • 2013-10-21
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多