Python Polars快速入门指南:LazyFrames

news2025/1/1 15:19:55

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions,本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一,使用惰性API可以设定一系列操作,而无需立即运行它们。相反,这些操作被保存为计算图,只在必要时运行。这允许Polars在执行前优化查询,在处理数据之前捕获模式错误,并在超出内存限制的数据集上执行内存高效查询。

在这里插入图片描述

创建LazyFrames

惰性API中的核心对象是LazyFrame,你可以通过几种不同的方式创建LazyFrame。要开始学习LazyFrames和lazy API,请看下面的例子:

import numpy as np
import polars as pl

num_rows = 5000
rng = np.random.default_rng(seed=7)

buildings = {
    "sqft": rng.exponential(scale=1000, size=num_rows),
    "price": rng.exponential(scale=100_000, size=num_rows),
    "year": rng.integers(low=1995, high=2023, size=num_rows),
    "building_type": rng.choice(["A", "B", "C"], size=num_rows),
}

lydf = pl.LazyFrame(buildings)
# lydf = df.lazy()
lydf

还是使用前文的数据集,增加了price字段;这里调用pl.LazyFrame()从buildings中创建LazyFrame。我们也可以使用.lazy()将现有的DataFrame转换为LazyFrame。下面通过示例说明lazy API是如何工作的,查询代码如下:

lazy_query = (
    lydf
    .with_columns(
        (pl.col("price") / pl.col("sqft")).alias("price_per_sqft")
    )
    .filter(pl.col("price_per_sqft") > 100)
    .filter(pl.col("year") < 2010)
)
lazy_query.show_graph()

可能已经注意到,惰性查询返回另一个LazyFrame,而不是实际执行查询。这就是惰性API背后的思想。它只在显式调用查询时执行查询。在执行查询之前,可以检查所谓的查询计划。查询计划查询将触发的步骤顺序,lazy_query.show_graph()显示可视化步骤流程:

在这里插入图片描述

vscode 环境中不能显示,可能需要安装 sudo apt install graphviz 。在polar中从下到上阅读查询计划图,每个方框对应于查询计划中的一个阶段。σ (σ)和π (π)是关系代数中的符号,它们告诉你对数据执行的操作。

了解了延迟查询要做什么之后,就可以实际执行它了。为此,在惰性查询上调用.collect(),根据查询计划对其求值。下面是它的实际效果:

(
    lazy_query
    .collect()
    .select(pl.col(["price_per_sqft", "year"]))
)

显示结果:

shape: (1_338, 2)
price_per_sqft	year
f64	i64
552.294274	2006
465.851448	1998
147.77145	2000
147.608287	2009
850.446036	2000
…	…
220.480873	2005
612.279463	2003
1407.598853	2006
955.962262	1996
124.381572	1997

使用.collect()运行延迟查询时,将获得带有结果的常规polar DataFrame。由于过滤条件,仅仅获得到原始1338行。显示的所有price_per_sqft和year值分别大于124而小于154895。为了进一步验证查询是否正确过滤了数据,我们可以查看摘要统计信息:

(
    lazy_query
    .collect()
    .select(pl.col(["price_per_sqft", "year"]))
    .describe()
)

返回结果:

shape: (9, 3)
statistic	price_per_sqft	year
str	f64	f64
"count"	1338.0	1338.0
"null_count"	0.0	0.0
"mean"	1197.977747	2001.893124
"std"	5821.706266	4.32589
"min"	100.357816	1995.0
"25%"	174.913631	1998.0
"50%"	299.238917	2002.0
"75%"	703.415704	2006.0
"max"	154895.785598	2009.0

使用.describe()查看汇总统计信息时,可以看到最小的price_per_sqft大约是100,最大的年份是2009。现在我们对惰性API有了一定的了解,但是惰性API的优势是什么。如果整个数据集已经存储在内存中,为什么需要惰性查询来进行分析?继续阅读,看看lazy API真正的亮点在哪里。

scan LazyFrame

在实际应用程序中,在使用Python进行任何处理之前,您很可能将数据存储在外部的静态文件或数据库中。lazy API的主要超级功能之一是,支持处理存储在文件中的大型数据集,而无需将所有数据读入内存。

在处理csv之类的文件时,通常会在分析数据之前将所有数据读入内存。使用Polars的lazy API,可以通过只处理必要的数据来最小化读入内存的数据量。这使得Polars可以优化内存占用和减少计算时间。

下面示例中,使用来自data .gov的电动汽车统计数据。此数据集包含在华盛顿州注册的电动和混合动力汽车的信息。数据中的每一行表示一辆车,每一列包含有关该车的信息。我们可以手动下载该数据进行测试,通过lazy API高效处理文件的关键是使用polar的scan功能。当你扫描文件时,而不是把整个文件读入内存,Polars创建LazyFrame引用文件的数据。与前面一样,在显式执行查询之前不会对数据进行处理。使用以下代码scan electric_cars.csv:

lazy_car_data = pl.scan_csv(local_file_path)
lazy_car_data


lazy_car_data.schema
{'VIN (1-10)': Utf8, 'County': Utf8, 'City': Utf8, 'State': Utf8,
'Postal Code': Int64, 'Model Year': Int64, 'Make': Utf8, 'Model': Utf8,
'Electric Vehicle Type': Utf8, 'Clean Alternative Fuel Vehicle (CAFV) Eligibility': Utf8,
'Electric Range': Int64, 'Base MSRP': Int64, 'Legislative District': Int64,
'DOL Vehicle ID': Int64, 'Vehicle Location': Utf8, 'Electric Utility': Utf8,
'2020 Census Tract': Int64}

通过使用scan_csv()创建lazy_car_data。至关重要的是,CSV文件中的数据没有存储在内存中。相反,lazy_car_data从electric_cars.csv中存储的唯一东西是lazy_car_data.schema中的模式。

这样可以查看文件的列名和它们各自的数据类型,它还可以帮助Polars优化在这些数据上运行的查询。实际上,polar必须在执行查询计划的任何步骤之前了解模式。

现在可以使用惰性API对electric_cars.csv中包含的数据运行查询。查询可以包括任意的复杂性表达式,Polars将只存储和处理必要的数据。例如运行以下查询:

lazy_car_query = (
	lazy_car_data
		.filter((pl.col("Model Year") >= 2018))
		.filter(
			 pl.col("Electric Vehicle Type") == "Battery Electric Vehicle (BEV)"
		).groupby(["State", "Make"])
		.agg(
			pl.mean("Electric Range").alias("Average Electric Range"),
			pl.min("Model Year").alias("Oldest Model Year"),
			pl.count().alias("Number of Cars"),
		)
		.filter(pl.col("Average Electric Range") > 0)
		.filter(pl.col("Number of Cars") > 5)
		.sort(pl.col("Number of Cars"), descending=True)
	)

lazy_car_query.collect()
shape: (20, 5)
┌───────┬───────────┬────────────────────────┬───────────────────┬────────────────┐
│ State ┆ Make      ┆ Average Electric Range ┆ Oldest Model Year ┆ Number of Cars │
│ ---------------            │
│ strstr       ┆ f64                    ┆ i64               ┆ u32            │
╞═══════╪═══════════╪════════════════════════╪═══════════════════╪════════════════╡
│ WA    ┆ TESLA     ┆ 89.114509201855690          │
│ WA    ┆ NISSAN    ┆ 93.11505620185267           │
│ WA    ┆ CHEVROLET ┆ 111.74665120185001           │
│ WA    ┆ KIA       ┆ 65.38042820183178           │
│ …     ┆ …         ┆ …                      ┆ …                 ┆ …              │
│ VA    ┆ TESLA     ┆ 139.133333201815             │
│ MD    ┆ TESLA     ┆ 50.6201810             │
│ TX    ┆ TESLA     ┆ 94.62520188              │
│ NC    ┆ TESLA     ┆ 61.42857120187              │
└───────┴───────────┴────────────────────────┴───────────────────┴────────────────┘

因为这是延迟查询,所以在调用lazy_car_query.collect()之前不会执行任何计算。在执行查询之后,只存储和返回所请求的数据——仅此而已。

从lazy_car_query.collect()返回的DataFrame中的每一行都包括平均续航里程、最旧的车型年份以及每个州和制造商的汽车数量。例如,第一行告诉你,华盛顿州2018年或之后有55690辆特斯拉,它们的平均续航里程约为89.11英里。

通过这个例子可以看到Polars如何使用lazy API以高性能和内存高效的方式从文件中查询数据。这个强大的API使polar比其他DataFrame库有了巨大的优势,你应该尽可能选择使用lazy API。在下一节中,您将了解polar如何与外部数据源和更广泛的Python生态系统集成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2267602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见CMS漏洞(wordpress,DedeCms,ASPCMS,PHPMyAdmin)

练习一:wordpress漏洞测试 1.上传包含木马的主题 安装网站 登陆网站 上传主题处测试漏洞注入 在上传主题模板压缩包中写入一句话木马 网站上传含有木马的zip压缩包 上传成功 wordpress主题目录 wp-content/themes 访问上传木马测试 2.修改主题的配置文件为含有木马的文件 练习…

【Java数据结构】LinkedList与链表

认识LinkedList LinkedList就是一个链表&#xff0c;它也是实现List接口的一个类。LinkedList就是通过next引用将所有的结点链接起来&#xff0c;所以不需要数组。LinkedList也是以泛型的方法实现的&#xff0c;所以使用这个类都需要实例化对象。 链表分为很多种&#xff0c;比…

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具&#xff0c;可用于构建知识库&#xff0c;实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库&#xff0c;包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…

【我的 PWN 学习手札】IO_FILE 之 stdout任意地址读

上一篇文章学会了stdin任意地址写【我的 PWN 学习手札】IO_FILE 之 stdin任意地址写-CSDN博客 本篇关注stdout利用手法&#xff0c;和上篇提及的手法有着异曲同工之妙 文章目录 前言 一、_IO_2_1_stdout_输出链&#xff0c;及利用思路 &#xff08;一&#xff09;_IO_2_1_std…

一网多平面

“一网多平面”是一种网络架构概念&#xff0c;具体指的是在一张物理网络之上&#xff0c;逻辑划分出“1N”个平面。以下是对“一网多平面”的详细解释&#xff1a; 定义与构成 01一网多平面 指的是在统一的物理网络基础设施上&#xff0c;通过逻辑划分形成多个独立的网络平面…

设计模式之状态模式:自动售货机的喜怒哀乐

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 一、状态模式概述 \quad 在我们的日常生活中&#xff0c;很多事物都具有不同的状态。比如我们经常使用的自动售货机&#xff0c;它就具有多种状态…

信息系统管理工程第8章思维导图

软考信管第8章的思维导图也实在是太长了&#xff0c;制作的耗时远超过之前的预计。给你看看思维导图的全貌如下&#xff0c;看看你能够在手机上滚动多少个屏幕 当你看到这段文字的时候&#xff0c;证明你把思维导图从上到下看完了&#xff0c;的确很长吧&#xff0c;第8章的教程…

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时&#xff0c;有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的&#xff0c;比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案&#xff0c;帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…

深度学习笔记(12)——深度学习概论

深度学习概论 深度学习关系&#xff1a; 为什么机器人有一部分不在人工智能里面&#xff1a;机器人技术是一个跨学科的领域&#xff0c;它结合了机械工程、电子工程、计算机科学以及人工智能&#xff08;AI&#xff09;等多个领域的知识。 并不是所有的机器人都依赖于人工智能…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

flask后端开发(11):User模型创建+注册页面模板渲染

目录 一、数据库创建和配置信息1.新建数据库2.数据库配置信息3.User表4.ORM迁移 二、注册页面模板渲染1.导入静态文件2.蓝图注册路由 一、数据库创建和配置信息 1.新建数据库 终端中 CREATE DATABASE zhiliaooa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;2…

【Next.js】001-项目初始化

【Next.js】001-项目初始化 文章目录 【Next.js】001-项目初始化一、前言二、自动创建项目1、环境要求2、创建项目创建命令创建演示生成的项目目录如果你不使用 npx 命令 3、运行项目脚本说明在开发环境运行项目查看页面 4、示例代码说明创建项目查看示例项目创建项目命令创建过…

系统安全——可信计算

可信计算 可信计算的起源 上世纪八十年代&#xff0c;TCSEC标准将系统中所有安全机制的总和定义为可信计算基 &#xff08;Trusted Computing Base TCB) TCB的要求是&#xff1a; 独立的&#xff08;independent&#xff09; 具有抗篡改性 tempering proof 不可旁路(无法窃…

Python学生管理系统(MySQL)

上篇文章介绍的Python学生管理系统GUI有不少同学觉得不错来找博主要源码&#xff0c;也有同学提到老师要增加数据库管理数据的功能&#xff0c;本篇文章就来介绍下python操作数据库&#xff0c;同时也对上次分享的学生管理系统进行了改进了&#xff0c;增加了数据库&#xff0c…

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中&#xff0c;还有一个流控效果选项&#xff1a; 流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&…

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS技术理念

1.2 技术理念 在万物智联时代重要机遇期&#xff0c;HarmonyOS结合移动生态发展的趋势&#xff0c;提出了三大技术理念&#xff08;如下图3-1所示&#xff09;&#xff1a;一次开发&#xff0c;多端部署&#xff1b;可分可合&#xff0c;自由流转&#xff1b;统一生态&#xf…

计算机组成——Cache

目录 为什么引入高速缓存&#xff1f; 数据查找方案&#xff1a; 命中率与缺失率 Cache和主存的映射方式 1.全相联映射 经典考法 覆盖问题 访存 2.组相联映射 3.直接映射&#xff08;和组相联类似&#xff09; 覆盖问题 替换算法 1.随机算法&#xff08;RAND&…

OpenCV和PyQt的应用

1.创建一个 PyQt 应用程序&#xff0c;该应用程序能够&#xff1a; 使用 OpenCV 加载一张图像。在 PyQt 的窗口中显示这张图像。提供四个按钮&#xff08;QPushButton&#xff09;&#xff1a; 一个用于将图像转换为灰度图一个用于将图像恢复为原始彩色图一个用于将图像进行翻…

基于Spring Boot的宠物领养系统的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于宠物领…

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"