当前位置: 首页 > news >正文

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生态系统集成。

相关文章:

Python Polars快速入门指南:LazyFrames

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions&#xff0c;本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一&#xff0c;使用惰性API可以设定一系列操作&#xff0c;而无需立即运行它们。相反&#xff0c;这些操作被保存为计算图&#xff0c;只在必要…...

什么是网络安全(Cybersecurity)?

不同组织机构对网络安全&#xff08;Cybersecurity或Cyber Security&#xff09;的定义不尽相同。从目标上来说&#xff0c;网络安全主要用于保护网络、计算机、移动设备、应用程序及数据等资产免受网络攻击&#xff0c;避免造成数据泄露、业务中断等安全问题。 网络钓鱼、勒索…...

VBA批量插入图片到PPT,一页一图

Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…...

Pandas-DataFrame入门

文章目录 一. Pandas DataFrame简介二. 加载数据集1. 目的2. 步骤① 导包② 加载csv③ 查看数据类型及属性④ Pandas与Python常用数据类型对照 三. 查看部分数据1. 根据列名加载部分列数据① 加载一列数据&#xff0c;通过df[列名]方式获取② 加载多列数据&#xff0c;通过df[[…...

爬虫 - 爬取王者荣耀所有皮肤图片

结果展示 安装 pip install requests logger代码 import json import os import re from concurrent.futures import ThreadPoolExecutorimport requests from loguru import loggerdef parse_url(url, bFalse):try:headers {"User-Agent": "Mozilla/5.0 (Wi…...

【畅购商城】购物车模块之查看购物车

目录 分析 接口 后端实现 前端实现&#xff1a;显示页面 前端实现&#xff1a;显示购物车信息 分析 用户如果没有登录&#xff0c;购物车存放在浏览器端的localStorage处&#xff0c;且以数组的方式进行存储。用户如果登录了&#xff0c;购物车存放在redis中&#xff0c…...

Spring Boot 学习笔记

学习代码第一步&#xff1a;如何写 Hello world &#xff1f; 1、新建项目 新建一个 Maven Java 工程&#xff0c;在 pom.xml 文件中添加 Spring Boot Maven 依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spri…...

快速打造智能应用:从设计到上线的全流程指南

随着人工智能技术的快速发展&#xff0c;如何将大模型技术转化为实际应用成为了各行业关注的焦点。本文将以一个经典的 RAG&#xff08;检索增强生成&#xff09;知识问答系统为例&#xff0c;详细介绍从智能体设计到最终应用部署的全流程。通过结合阿里云的魔笔低代码平台和丰…...

Java-将一个大列表均分成多个小列表,每个小列表包含10个元素

要将一个大列表均分成多个小列表,每个小列表包含10个元素,可以使用多种方法。以下是几种常 见的方法: 方法一:使用 subList 这是你已经提到的方法,通过 subList 来获取子列表。 import java.util.ArrayList; import java.util.List;public class BatchProcessingExamp…...

tcp_rcv_synsent_state_process函数

tcp_rcv_synsent_state_process 是 Linux Kernel 中用于处理 TCP 连接在 SYN-SENT 状态下接收到报文的函数。这个函数在 TCP 三次握手阶段起到了至关重要的作用,处理了在客户端发送 SYN 请求之后收到服务器响应报文的各种情况。 以下是这个函数的解读和剖析: int tcp_rcv_sy…...

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…...

C#编写的金鱼趣味小应用 - 开源研究系列文章

今天逛网&#xff0c;在GitHub中文网上发现一个源码&#xff0c;里面有这个金鱼小应用&#xff0c;于是就下载下来&#xff0c;根据自己的C#架构模板进行了更改&#xff0c;最终形成了这个例子。 1、 项目目录&#xff1b; 2、 源码介绍&#xff1b; 1) 初始化&#xff1b; 将样…...

计算机网络|数据流向剖析与分层模型详解

文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中&#xff0c;数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…...

某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题

一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) }&#xff09;从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…...

gazebo_world 基本围墙。

如何使用&#xff1f; 参考gazebo harmonic的官方教程。 本人使用harmonic的template&#xff0c;在里面进行修改就可以分流畅地使用下去。 以下是world 文件. <?xml version"1.0" ?> <!--Try sending commands:gz topic -t "/model/diff_drive/…...

Ubuntu 上高效实现 Texlive 安装和管理

文章目录 介绍操作步骤1. 下载 Texlive 安装包2. 解压安装包3. 安装基础安装命令通用的 scheme 选项 4. 配置环境变量 使用 tlmgr 管理包总结 介绍 Texlive 是学术和技术文档编写的重要工具, 选择适合的安装方案能帮助您提升效率并减少磁盘空间占用. 本文将为您提供在 Ubuntu …...

LeetCOde914 卡牌分组

扑克牌分组问题&#xff1a;探索最大公约数的应用 在编程的世界里&#xff0c;我们经常会遇到各种有趣的算法问题&#xff0c;今天要和大家分享的是一道关于扑克牌分组的问题&#xff0c;它巧妙地运用了最大公约数的概念来解决。 一、问题描述 给定一副牌&#xff0c;每张牌…...

MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型

介绍 论文地址&#xff1a;https://arxiv.org/abs/2407.15811 现代图像生成模型擅长创建自然、高质量的内容&#xff0c;每年生成的图像超过十亿幅。然而&#xff0c;从头开始训练这些模型极其昂贵和耗时。文本到图像&#xff08;T2I&#xff09;扩散模型降低了部分计算成本&a…...

QWT 之 QwtPlotDirectPainter直接绘制

QwtPlotDirectPainter 是 Qwt 库中用于直接在 QwtPlot 的画布上绘制图形的一个类。它提供了一种高效的方法来实时更新图表&#xff0c;特别适合需要频繁更新的数据可视化应用&#xff0c;例如实时数据流的显示。 使用 QwtPlotDirectPainter 的主要优势在于它可以绕过 QwtPlot 的…...

埃斯顿机器人程序案例多个点位使用变量

多个点位使用变量取放...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...