Python Polars快速入门指南:LazyFrames

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

在这里插入图片描述

创建LazyFrames

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

import numpy as np
import polars as plnum_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_datalazy_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.rhkb.cn/news/495737.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读笔记】IC-Light

SCALING IN-THE-WILD TRAINING FOR DIFFUSION-BASED ILLUMINATION HARMONIZATION AND EDITING BY IMPOSING CONSISTENT LIGHT TRANSPORT 通过施加一致的光线传输来扩展基于扩散模型的真实场景光照协调与编辑训练 前言摘要引言相关工作基于学习的基于扩散模型的外观和光照操纵光…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.CircleGeometry 圆形…

AWS Certified AI Practitioner 自学考试心得

学习目标&#xff1a; 考取 AWS Certified AI Practitioner 那什么是 AWS Certified AI Practitioner 认证 是基础级的认证 比较简单 — 学习内容&#xff1a; 1. AWS网站自学网站 极客时间免费课程&#xff1a;http://gk.link/a/12sJL 配合极客时间课程的章节测试检验自…

WebRTC服务质量(07)- 重传机制(04) 接收NACK消息

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count&#xff0c;以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序&#xff08;如Ela…

图神经网络_图嵌入_SDNE

0 提出背景 SDNE&#xff1a;Structural Deep Network Embedding 之前的DeepWalk、LINE、node2vec、struc2vec都使用了浅层结构&#xff0c;浅层模型往往不能捕获高度非线性的网络结构。 SDNE方法使用了多个非线性层来捕获节点的embedding。 1 预备知识 1阶相似度衡量的是…

redis——岁月云实战

单线程序&#xff0c;基于IO多路复用&#xff0c;基于内存和c语言编写&#xff0c;性能高。redis官方命令 1 数据结构 1.1 key的层级 redis的key可以通过冒号&#xff08;:&#xff09;来划分层级&#xff0c;如下图mms:company:order&#xff0c;但系统中可以看到有不少没有…

参数名在不同的SpringBoot版本中,处理方案不同

参数名在不同的SpringBoot版本中&#xff0c;处理方案还不同&#xff1a; 在springBoot的2.x版本&#xff08;保证参数名一致&#xff09; springBoot的父工程对compiler编译插件进行了默认的参数parameters配置&#xff0c;使得在编译时&#xff0c;会在生成的字节码文件中…

五、Swagger 介绍(Flask+Flasgger的应用)

Swagger 介绍 0. 引言1. Swagger 介绍2. Flasgger 介绍3. Flasgger效果3.1 原始flask代码3.2 转化成Flasgger形式3.3 使用Try it out调试3.4 多个url接口自动生成和调试 4. 使用教程4.1 使用 docstrings 作为规范4.2 使用外部 YAML 文件4.3 使用 Python 字典作为原始规范 5. 和…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

【MySQL】十三,关于MySQL的全文索引

MySQL的全文索引用于搜索文本中的关键字&#xff0c;类似于like查询。 演示 建表 CREATE TABLE demo (id INT(11) NOT NULL,name CHAR(30) NOT NULL,age INT(11) NOT NULL,info VARCHAR(255),primary key(id),fulltext index futxt_idx_info(info) );此表的默认存储引擎为In…

数据可视化echarts学习笔记

目录&#xff0c;介绍 知识储备 一端操作&#xff0c;多端联动的效果&#xff08;开启了多个网页&#xff0c;操作一端&#xff0c;多个网页的效果会跟着改变&#xff09; cmd命令控制面板返回上一级或上上级 在当前目录打开文件&#xff1a; cd 文件名 在Windows命令提示符&am…

NS3学习——tcpVegas算法代码详解(2)

NS3学习——tcpVegas算法代码详解&#xff08;1&#xff09;-CSDN博客 目录 4.TcpVegas类中成员函数 (5) CongestionStateSet函数 (6) IncreaseWindow函数 1.检查是否启用 Vgas 2.判断是否完成了一个“Vegas 周期” 2.1--if&#xff1a;判断RTT样本数量是否足够 2.2--e…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发&#xff0c;需要频繁将编写的前端系统打包更新到公司的linux服务器&#xff0c;觉得这种工作纯体力活&#xff0c;有时候太浪费时间&#xff0c;以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…

Mac上Stable Diffusion的环境搭建(还算比较简单)

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon AI兴起的速度是真的快&#xff0c;感觉不了解点相关的东西都要与时代脱节了&#xff0c;吓得我赶紧找个AIGC看看能不能实现我艺术家的人梦想&#xff08;绷不住了&#xff09; 我…

瑞吉外卖项目学习笔记(九)套餐列表分页查询、新增套餐、图片上传和下载

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

VMware Workstation虚拟机网络模式

做虚拟机和宿主机互ping实验时&#xff0c;除了要提前配置好网段、ip等信息&#xff0c;还要把宿主机、虚拟机的防火墙关闭&#xff01; 首先说一下VMware的几种虚拟交换机。 VMnet0&#xff1a;用于虚拟桥接网络下的虚拟交换机。 VMnet1&#xff1a;用于虚拟Host-Only网络下…

UDP传输层通信协议详解

引言 在计算机网络通信的广阔天地中&#xff0c;传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;以其独特的特性和应…

Node.js 工具:在 Windows 11 中配置 Node.js 的详细步骤

一、概述 记录时间 [2024-12-25] 本文讲述如何在 Windows 11 中进行 Node.js 工具的安装和配置。 以下是详细的步骤和说明。 二、安装 Node.js 1. 官网下载 通过官网&#xff0c;下载 Node.js&#xff0c;上面有好几种下载方式&#xff0c;文中下载的是 zip 压缩包。 如图&…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来&#xff1f; 查看是否被360主页锁定&#xff0c;地址栏输入chrome://version&#xff0c;看命令行end后面&#xff08;蓝色部分&#xff09;&#xff0c;是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…