【发布时间】: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] < power_threshold很多次:当你在data上滑动窗口时重复测试相同的数据。您是否尝试过创建一个与data长度相同的thresholded_data布尔数组,填充一次然后使用它?
标签: python pandas csv large-data