从 Pandas 到 Polars 三:要想做大,就必须懒惰

  有一位需要处理数百Gb CSV文件的客户在首次使用Polars时,他们按照某种模式从CSV文件中读取了数据。如下面所示(展示的是一个简化版):

# 创建一个列表来保存每个CSV的LazyFrame
queries = []
# 使用glob匹配CSV文件
csv_files = glob.glob("data_files/*.csv")
# 遍历CSV文件
for csv_file in csv_files:
    # 将每个CSV文件的LazyFrame添加到列表中
    queries.append(pl.scan_csv(csv_file))
# 评估列表中的所有查询
queries = pl.collect_all(queries)
# 将DataFrames合并成一个单一的DataFrame
polars_df = pl.concat(queries)
# 选择列的子集
polars_df.select(["date","temperature","humdity"])
...

他们的关键操作在于以下几个方面:

  • 使用glob迭代其CSV文件
  • 通过执行pl.scan_csv使用惰性模式
  • 将pl.scan_csv中的每个LazyFrame添加到名为查询的列表中
  • 对查询运行pl.collect_all以评估每个LazyFrame并创建一个DataFrames列表
  • 将数据帧连接成单个数据帧
  • 继续进行进一步的转换,例如选择列的子集

不幸的是,使用这种模式,将失去Polars在流模式下进行查询优化和运行大型数据集的能力。

那么,该如何做才能更好呢?

要惰性模式!!

改进的第一种方法是延迟调用collect(或collect_all)。通常尽可能长时间地保持惰性模式(最好是整个查询),这样Polars就可以应用查询优化。

懒加载的方式在处理大数据集时非常有用,因为它允许用户在不占用过多内存和计算资源的情况下,定义复杂的数据处理流程。只有当用户真正需要结果时,Polars才会根据用户定义的计算图(Computation Graph)来优化和执行这些操作,从而大大提高处理大数据集时的性能和效率。

在这种情况下,我们在最后一行中选择列的子集。然而,我们是在用pl.collect_all评估CSV读取后进行此操作的。这意味着Polars不能利用查询优化只从CSV中读取列的子集。

如果我们在与pl.scan_csv相同的惰性查询中进行选择,那么Polars只从csv中读取我们需要的列的子集——这样就会大大加快速度并节省内存。

通过流处理的方式来实现大规模数据处理

为了使用大于内存的数据集,我们希望在流参数设置为True的情况下评估延迟查询,因此我们在一个LazyFrame上运行

pl.collect(streaming = True)

或者在一系列的LazyFrame上运行

pl.collect_all(streaming = True)

在这种流模式下,Polars将以块的形式处理每个CSV文件中的数据,并允许我们处理比可用内存大得多的数据集。

将其整合在一起

 以下例子显示如何将这些整合在一起

polars_df = (
    pl.scan_csv("data_files/*.csv")
    # 选择列的子集
    .select(["date","temperature","humdity"])
    ...
    .collect(streaming=True)

这样一来,不仅速度更快、可扩展性更强,而且读写也更容易!

让我们来分解一下:

  • 在pl.scan_csv中使用了glob字符串模式来输出单个LazyFrame。即Polars负责扫描所有CSV文件,并将它们连接到一个LazyFrame中
  • 在LazyFrame上调用了select,这使Polars可以通过只读取CSV中的日期、温度和湿度列来优化查询
  • 在调用collect时使用streaming=True参数,告诉Polars 希望它按块评估数据集

这里有一些要注意的事项:

  • 流式处理并不适用于所有操作(但适用于filter、groupby和join等核心操作)。如果流式处理无法用于某些操作,Polars将默认为非流式处理,可能会导致在使用大型数据集时耗尽内存
  • 当在使用polars处理数据时,最终的输出DataFrame的大小必须能够在你的计算机内存中容纳。如果原始数据太大,无法一次性装入内存,可能需要在处理过程中对数据进行某种形式的过滤(选择一部分数据)或聚合(对数据进行总结以减少其大小),以确保最终的输出DataFrame能够装入内存。

最后,总结一下,使用polars的惰性模式好处至少有以下几点:

  1. 提高性能:延迟计算可以显著提高性能,特别是在处理大型数据集时。由于数据没有立即加载到内存中,因此可以构建复杂的计算图,而不必担心内存不足。此外,Polars可以利用这种延迟计算模式来优化计算过程,例如通过并行处理或重新排序操作来减少不必要的中间数据转换。
  2. 构建复杂的数据处理管道:使用lazy API,可以构建包含多个步骤的数据处理管道。每个步骤都是计算图中的一个节点,可以将它们链接在一起以形成复杂的处理流程。这种灵活性使得Polars非常适合用于数据清洗、转换和分析等任务。
  3. 优化物理执行计划:当请求结果时,Polars会分析所构建的计算图,并生成一个优化的物理执行计划。这个执行计划描述了如何在实际硬件上执行计算以获取所需的结果。通过优化执行计划,Polars可以确保数据以最高效的方式被处理。
  4. 支持复杂的查询:由于lazy API允许构建复杂的计算图,因此可以编写复杂的查询来处理和分析数据。这些查询可以包含多个过滤条件、聚合操作、连接操作等,并且可以通过链式调用和函数式编程风格来轻松组合它们。
  5. 与Pandas的对比:与Pandas相比,Polars的lazy API提供了一种更灵活和高效的数据处理方式。Pandas主要基于立即执行模式,即当调用一个函数时,它会立即执行计算并返回结果。虽然Pandas也提供了一些优化和并行处理功能,但Polars的lazy API在处理大型数据集时通常具有更好的性能和扩展性。  
  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值