Polars简明基础教程四:懒惰模式 2:评估查询

到本讲座结束时,您将能够:

  1. - 触发LazyFrame的评估
  2. - 在流式模式下评估LazyFrame
  3. - 将DataFrame转换为LazyFrame

我们还可以评估LazyFrame并分析查询的每个部分所需的时间。我们将在第6节的LazyGroupby讲座中涵盖这部分内容。

import polars as pl
csv_file = "../data/titanic.csv"

使用 pl.scan_csv 创建一个 LazyFrame

df = pl.scan_csv(csv_file)
df

触发 LazyFrame 的评估

当我们触发评估时,我们将 LazyFrame 转换为 DataFrame。

完全评估

为了触发完整输出的评估,我们调用 .collect

(
    df
    .collect()
    .head()
)
  • 在构建查询计划的过程中,每一步都不会立即执行,而是等待 .collect() 被调用时才会执行整个查询计划。

部分评估

为了触发对有限行数的评估,我们调用 .fetch。我们可以指定 Polars 应该尝试获取的行数作为参数

(
    df
    .fetch(3)
)

你何时使用 fetch 而不是 collect?

在开发和调试期间,fetch 方法很有用,因为它可以避免在大数据集上运行查询。

在流式模式下评估大于内存的查询

默认情况下,当我们评估一个 “LazyFrame ”时,Polars 会将整个 “DataFrame ”加载到内存中。如果查询所需的内存超过了我们可用的内存,我们可能能够以 流式 模式评估查询。

在流式模式下,Polars 将查询 分批 处理,而不是一次性处理所有内容。这允许 Polars 处理大于内存的数据集。

我们通过向 collect 或 fetch 的 streaming 参数传递值来指示 Polars 使用流式模式。

(
    pl.scan_csv(csv_file)
    .collect(streaming=True)
    .head(3)
)

并非所有操作都支持流式处理。但是,许多关键操作(如 filter、groupby 和 join)都支持流式处理。如果无法进行流式处理,则 Polars 将以非流式方式运行查询。

> 当我们在“输入/输出”部分中查看 CSV 和 Parquet 文件的输入时,我们会再次回到流式处理。但是,如果您想减少查询中的内存消耗,请继续尝试在自己的数据上使用 streaming=True。在这篇博客文章中,我建议对于许多用例,打开流式模式可能是一个好的默认设置(这就是我在我的机器学习管道中所做的)

 将 DataFrame 转换为 LazyFrame

在某些情况下,我们有一个 DataFrame 并希望将其转换为 LazyFrame。

我们可能希望保存查询中的中间值。因此,我们在转换回惰性模式之前触发评估以创建一个可以保存的 DataFrame。

我们的查询可能包含只能在急切模式下进行的转换,如 pivot。因此,我们可以触发评估来执行透视,然后再转换回惰性模式。

我们使用 lazy 将 DataFrame 转换为 LazyFrame

df_eager = pl.read_csv(csv_file)
df_eager = df_eager.lazy()
df_eager

惰性模式的限制

有些操作不能在惰性模式下进行(无论是在 Polars 还是其他惰性框架中,如 SQL 数据库)。一个限制是 Polars 必须知道查询计划的每一步中的列名和 dtype。

例如,我们不能在惰性模式下进行 pivot 操作,因为 pivot 操作后的列名是数据依赖的

(
    pl.read_csv(csv_file)
    .pivot(index="Pclass",columns="Sex",values="Age",aggregate_function="mean")
)

在这些情况下,我建议:

  1. - 尽可能以惰性模式开始查询
  2. - 当需要非惰性方法时,使用 collect 进行评估
  3. - 调用非惰性方法
  4. - 在输出上调用 lazy 以继续在惰性模式下进行
(
    pl.scan_csv(csv_file)
    .collect()
    .pivot(index="Pclass",columns="Sex",values="Age",aggregate_function="mean")
    .lazy()
)

练习

在练习中,您将加深对以下内容的理解:

  1. - 触发查询的完全评估
  2. - 触发查询的部分评估
  3. - 触发流式评估
  4. - 从急切模式转换为惰性模式

练习 1

通过对 Titanic CSV 文件进行扫描来创建一个 LazyFrame

(
    pl.<blank>
)

继续你在本练习第一部分中的代码。

在 LazyFrame 上使用 fetch 语句,并计算 fetch 默认返回多少行

检查你可以从LazyFrame中获取以下哪些元数据:

- 行数

- 列名

练习2:在急切模式和惰性模式之间转换

通过扫描泰坦尼克号CSV文件来创建一个LazyFrame

(

    <blank>

)

将LazyFrame转换为DataFrame

将DataFrame转换为LazyFrame

解决方案

 练习1的解决方案

通过扫描泰坦尼克号CSV文件来创建一个LazyFrame

(
    pl.scan_csv(csv_file)
)

在LazyFrame上使用fetch语句,并计算fetch默认返回多少行

(
    pl.scan_csv(csv_file)
    .fetch()
    .shape
)

我们在关于流式CSV的讲座中讨论了关于常见子计划消除的通知

LazyFrame不知道CSV中的行数

(
     pl.scan_csv(csv_file)
     .shape
 )

LazyFrame确实知道列名。Polars会扫描CSV文件的第一行以获取pl.scan_csv中的列名

(
    pl.scan_csv(csv_file)
    .columns
)

练习2的解决方案

通过对泰坦尼克号CSV文件进行扫描来创建一个LazyFrame

(
    pl.scan_csv(csv_file)
)

将LazyFrame转换为DataFrame

(
    pl.scan_csv(csv_file)
    .collect()
    .head(3)
)

将DataFrame转换为LazyFrame

(
    pl.scan_csv(csv_file)
    .collect()
    .lazy()
    .head(3)
)

Polars简明基础教程系列

Polars简明基础教程十四:可视化(四)

Polars简明基础教程十三:可视化(三)

Polars简明基础教程十二:可视化(二)

Polars简明基础教程十一:可视化(一)

Polars简明基础教程十:Numpy和Pandas的相互转换(2)

Polars简明基础教程九:Numpy和Pandas的相互转换(1)

Polars简明基础教程八:Series 和 DataFrame 以及它们之间的转换_B

Polars简明基础教程七:Series 和 DataFrame 以及它们之间的转换_A

Polars简明基础教程六:什么是Polars的“DataFrame(数据框)_下”

Polars简明基础教程五:什么是Polars的“DataFrame(数据框)_上”

Polars简明基础教程四:懒惰模式 2:评估查询

Polars简明基础教程三:懒惰模式 1:引入懒惰模式(续)

Polars简明基础教程二:懒惰模式 1:引入懒惰模式

Polars简明基础教程一:Polars快速入门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值