Python 如何减少使用Pandas循环100万组数据的时间?

Python 如何减少使用Pandas循环100万组数据的时间?,python,pandas,csv,large-data,Python,Pandas,Csv,Large Data,我在一个csv文件的一列中有近100万行数据。如果我画出这100万组数据,它将是一种包含5个峰值的波形函数。所以我做的第一件事就是将这个csv文件导入到熊猫数据框中。我想做的是检测每个波的开始时间和结束时间,我已经做了一个算法,它确实生成了我想要的输出 然而,现在的主要问题是,要获得我想要的最终输出几乎需要2个小时,我认为不应该这么长。我所能想到的是,我使用了太多for循环,因此迭代数据需要太多时间。下面是一个示例代码。(请注意,虽然这只是一个示例代码,但它应该足够清晰,以显示我使用的for循环

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

然而,现在的主要问题是,要获得我想要的最终输出几乎需要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

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

一种方法可能是改变你r沿另一个轴的数据。例如,假设
数据
是一个
numpy.数组
,其形状为
(len(data),
)和

现在,每个片段
shift_data[time,:]
对应于数据的一个片段,因此

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

而且执行起来应该快得多。

添加示例数据?数据只是一大组值(例如,功率单位为瓦特)。你可以使用任何值,只要它像一个波形函数。如果你想检测5个最高值,你就不能对数据进行排序吗?事实上要复杂得多,因为峰值中的值在一个很大的范围内上下波动。因此,我需要至少检查一次数据集,以对那些峰值的域时间进行排序hink..你在做那个测试
data[i+k]
多次:在将窗口滑动到
data
上时重复测试相同的数据。您是否尝试过制作一个长度与
data
相同的
threshold\u data
布尔数组,将其填充一次,然后使用该数组?但我下一步的代码是检测1何时启动以及0何时启动按索引排序,然后将检测到的索引附加到我创建的另外两个空列表中。如果我想这样做,这种方法也可以吗?(请参见上面我编辑的代码)我没有深入了解您的问题,对我来说,您的代码不是很清楚(例如,在语句的
else
部分,您正在外循环的同一个变量上再次循环,我不清楚这可能会产生什么影响)。但是,如果您需要在固定长度的窗口中分析时间序列,这种方法可以为您节省大量时间(例如,在上面的代码中,您去掉了第二个循环,应该可以大大加快速度)
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 < power_threshold).prod(axis=1)
all(data[i+k] < power_threshold for k in range(0,time_threshold))