快速了解Rust 的数据分析库Polars

news2024/9/28 3:23:11

【图书介绍】《Rust编程与项目实战》-CSDN博客

《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

17.1.1  什么是Polars

Polars是一个基于 Rust 的数据分析库,它的目标是提供一个高性能的数据分析工具,同时也提供了Python和JavaScript的接口,也就是说这款工具还可以供Python使用。Polars是一个用纯Rust开发的速度极快的DataFrame库,底层使用Apache Arrow内存模型。

数据科学家和数据分析师都对Pandas非常熟悉。对于数据科学领域的从业者来说,几乎无一例外地都会花费大量时间学习用Pandas处理数据。然而Pandas被诟病最多的是其运行速度和大数据集的处理效率。幸运的是,Polars的出现弥补了Pandas的不足。

Polars最核心的概念是表达式(Expressions),也是其拥有快速性能的核心。Polars提供了一个强大的表达式API。表达式API允许你创建和组合多种操作,例如过滤、排序、聚合、窗口函数等。表达式API也可以优化查询性能和内存使用。

17.1.2  Polars和Pandas对比

Polars与Pandas在许多方面具有截然不同的设计与实现。不像Pandas中每个DataFrame都有一个索引列(Pandas的很多操作也是基于索引的,例如join两个DataFrame进行联合查询),Polars并没有索引(Index)概念。主要区别如下:

(1)Polars使用Apache Arrow作为内部数据格式,而Pandas使用NumPy数组。

(2)Polars提供比Pandas更多的并发支持。

(3)Polars支持惰性查询并提供查询优化。

(4)Polars提供了与Pandas相似的API,以便于用户更快地上手。

简单地说,Polars相当于Rust的Pandas,且性能比Pandas要好很多。总体感觉,Polars就是奔着取代Pandas而生的。

17.1.3  为什么需要Polars

跟Pandas比,Polars有如下优势:

(1)Polars取消了DataFrame中的索引。消除索引让Polars更容易操作数据(Pandas中的DataFrame的索引很鸡肋)。

(2)Polars数据底层用Apache Arrow数组表示,而Pandas数据背后用NumPy数组表示。Apache Arrow在加载速度、内存占用和计算效率上都更加高效。

(3)Polars比Pandas支持更多并行操作。因为Polars是用Rust写的,所以可以无畏并发。

(4)Polars支持延迟计算(Lazy Evaluation),Polars会根据请求检验、优化数据以找到加速方法或降低内存占用。另一方面,Pandas仅支持立即计算(Eager Evaluation),即收到请求立即      求值。

Polars就是为了解决Pandas的性能而生的。在很多测试中,Polars比Pandas快2~3倍。Pandas与Polars的对比如表17-1所示。

17.1.4  安装Polars

由于Polars提供Python和JavaScript绑定,因此Polars支持多种语言环境安装。下面阐述针对各种语言的Polars安装。

(1)对于Rust,传统的Rust程序有Cargo进行包管理,只需要在cargo.toml的[dependencies]中加入:

polars = "0.25.1"

或者用cargo add命令即可:

$ cargo add polars

(2)对于Python环境,可以安装Polars的Python语言绑定PyPolars:

$ pip install polars

(3)对于Node环境,可以安装Polars的JavaScript语言绑定:

$ yarn add nodejs-polars

(4)数据科学家和算法工程师更喜欢用Jupyter,在Jupyter环境下需要用evcxr的:dep命令来引入包。在Jupyter中输入代码如下:

:dep polars = {version = "0.25.1"}

17.1.5   创建DataFrame

我们先来看一下如何手动创建DataFrame(数据帧)。

【例17.1】  手动创建DataFrame

打开VS Code,单击菜单Terminal→New Termanal,执行命令cargo new myrust来新建一个Rust工程,工程名是myrust。打开cargo.toml文件准备添加依赖软件包,在[dependencies]下添加如下内容:

polars = { version = "0.25.1", features = ["json"] }

准备添加代码。打开main.rs,添加代码如下:

use polars::prelude::*;  //引用Polars

fn main() {
    let df = df! [    //定义数据
        "Model" => ["iPhone XS", "iPhone 12", "iPhone 13", "iPhone 14", "Samsung S11", "Samsung S12", "Mi A1", "Mi A2"],
        "Company" => ["Apple", "Apple", "Apple", "Apple", "Samsung", "Samsung", "Xiao Mi", "Xiao Mi"],
        "Sales" => [80, 170, 130, 205, 400, 30, 14, 8],
        "Comment" => [None, None, Some("Sold Out"), Some("New Arrival"), None, Some("Sold Out"), None, None],
    ];

    println!("{:?}", &df);   //输出数据
}

Polars提供了df!宏来创建DataFrame。df!按列接受数据,每列含有列名和数据,数据以数组形式提供。这里需要注意,如果数据中存在空数据,则需要用None来表示,而Rust是强类型语言,需要列数据类型一致,因此,如果数据中有None存在,则其他非None数据需要用Some()包裹,达到类型一致。

DataFrame实现了std::fmt::Display方法,因此创建的对象可以直接利用println!宏输出。跟Pandas一样,在Jupyter Notebook中Polars DataFrame会以整齐美观的格式输出,并且还很贴心地将每列的数据类型展示出来,非常方便。

在TERMINAL窗口的命令行中输入运行命令cargo run,运行结果如图17-1所示。

图17‑1

这里需要注意,Polars DataFrame跟Pandas DataFrame有一点不同,Polars DataFrame的列名必须是字符串类型。如果列名不是字符串类型,运行时会报错。请看下面的代码:

let df2 = df! [
    0 => [Some(0), Some(1), Some(2)],
    1 => [Some("x"), Some("y"), Some("z")],
];
println!("{}", &df2);

上面的代码运行会报个错:mismatched types,如图17-2所示。

图17‑2

这是因为列名是i32类型,而不是str字符串类型。除显示列名外,Polars DataFrame还会在列名下面显示该列的数据类型。我们也可以调用dtypes()方法获取各列的数据类型:

df.dtypes()

运行上面的代码会看到下面的输出:

[Utf8, Utf8, Int32, Utf8]

也可以用get_column_names()方法获取所有列名:

df.get_column_names()

输出:

["Model", "Company", "Sales", "Comment"]

也可以通过get_row()方法传入行下标来获取一行数据:

df.get_row(0)

上面的代码会将第一行数据显示出来:

Row([Utf8("iPhone XS"), Utf8("Apple"), Int32(80), Null])

值得注意的是,与Pandas不同,Polars中没有行索引的概念。Polar的设计哲学认为DataFrame不需要行索引。

下面再看一个实例,读取JSON(JavaScript Object Notation,JS对象简谱)数据。JSON是一种轻量级的数据交换格式,它基于 ECMAScript(European Computer Manufacturers Association,欧洲计算机协会制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言,易于阅读和编写,同时也易于机器解析和生成,并有效地提升了网络传输效率。JSON是Douglas Crockford在2001年开始推广使用的数据格式,在2005~2006年正式成为主流的数据格式,雅虎和谷歌就在那个时候开始广泛地使用JSON格式。

任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等,但是对象和数组是比较特殊且常用的两种类型。

  • 对象:对象在JS中是使用花括号“{}”包裹起来的内容,数据结构为{key1:value1, key2:value2, …}的键-值对结构。在面向对象的语言中,key为对象的属性,value 为对应的值。键名可以使用整数和字符串来表示。值可以是任意类型。
  • 数组:数组在JS中是方括号“[]”包裹起来的内容,数据结构为 ["java", "javascript", "vb", …] 的索引结构。在JS中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键-值对,但还是索引使用得多。同样,值可以是任意类型。

【例17.2】  定义并加载JSON数据

打开VS Code,单击菜单Terminal→New Termanal,执行命令cargo new myrust来新建一个Rust工程,工程名是myrust。打开cargo.toml文件准备添加依赖软件包,在[dependencies]下添加如下内容:

polars = { version = "0.25.1", features = ["json"] }

准备添加代码。打开main.rs,添加代码如下:

use std::io::Cursor;
use polars::prelude::*;

fn main() {
    let data = r#"[					//定义JSON数据
        {"date": "1996-12-16T00:00:00.000", "open": 16.86, "close": 16.86, "high": 16.86, "low": 16.86, "volume": 62442.0, "turnover": 105277000.0},
        {"date": "1996-12-17T00:00:00.000", "open": 15.17, "close": 15.17, "high": 16.79, "low": 15.17, "volume": 463675.0, "turnover": 718902016.0},
        {"date": "1996-12-18T00:00:00.000", "open": 15.28, "close": 16.69, "high": 16.69, "low": 15.18, "volume": 445380.0, "turnover": 719400000.0},
        {"date": "1996-12-19T00:00:00.000", "open": 17.01, "close": 16.4, "high": 17.9, "low": 15.99, "volume": 572946.0, "turnover": 970124992.0}
    ]"#;

    let res = JsonReader::new(Cursor::new(data)).finish();
    println!("{:?}", res);  
    assert!(res.is_ok());
    let df = res.unwrap();
    println!("{:?}", df);				//输出结果
}

在TERMINAL窗口的命令行中输入运行命令cargo run,运行结果如图17-3所示。

图17‑3

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

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

相关文章

自定义审批字段

一. 新增特性 1.路径:SPRO->物料管理->采购->采购订单->采购订单的下达过程->编辑特性 2.输入特征名Z_USRC2_PO点新建 二. 将特性分配给类 1.路径:SPRO->物料管理->采购->采购订单->采购订单的下达过程->编辑类 2.输入…

Windows上MSYS2的安装和使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载二、安装三、使用1.打开命令行2.搜索软件3.安装软件4.卸载软件5.更新环境6.其他四、MSYS2和Cygwin的差别总结前言 MSYS2这个工具我是越用越喜欢,很多东西放在Linux上如鱼得水但是放在…

ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析

本文将介绍,ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析 1。 客户遇到的问题 ClkLog的用户访问基础统计分析功能是基于神策SDK的全埋点来实现的。 我们遇到有些客户是使用C、C#等语言来开发的客户端,然而神策此类SDK(如C, C…

什么是代理IP_如何建立代理IP池?

什么是代理IP_如何建立代理IP池? 1. 概述1.1 什么是代理IP?1.2 代理IP的工作原理1.3 爬虫的应用场景1.3.1 搜索引擎,最大的爬虫1.3.2 数据采集,市场分析利器1.3.3 舆情监控,品牌营销手段1.3.4 价格监测,全网…

jetsonNano烧录Ubuntu20.04镜像使用ROS2

本来想要参考Jetson nano升级Ubuntu20.04来进行升级。 但是此过程也有大坑,我的目的是,除了升级Ubuntu20.04,在上面使用ROS2,我还希望我写的代码可以使用上Pytorch。 方式一(未成功) 按照上面的教程可以正…

Spring Bean加载耗时采集工具

功能介绍 Target:针对启动慢的 Spring 应用,找出 IOC 容器启动过程中,加载耗时较长的 Bean 对象进行治理。  实现原理 主要用到Spring本身提供的两个扩展接口:BeanPostProcessor ApplicationListener 这两个接口…

202408830测试RK3588的rockit/VI的编译

202408830测试RK3588的rockit/VI的编译 2024/8/30 14:58 前言 环境介绍: 1.编译环境 Ubuntu 20.04.6 LTS rootrootrootroot-desktop:~$ rootrootrootroot-desktop:~$ cat /etc/issue Ubuntu 20.04.6 LTS \n \l rootrootrootroot-desktop:~$ 2.SDK版本&#xff1a…

8,sql查询条件查询语句

查询员工表结构,并分析 DESC 表名;DESC t_employee; 查询出生日期在 1990-01-01 和 1995-01-01 之间的员工信息。between 区间比较这句话的意思就是查看所有员工的生日在1990-01-01和1995-01-01之间的SELECT * FROM 表名 WHERE 生日 between 1990-01-01 AND 1995-0…

共绘国际智图:Elvy与图为科技携手探索边缘计算新境界

近日,巴西知名企业Elvy到访深圳图为科技,共议“合作开发边缘计算机及联合开拓海外市场”事宜。 在全球化日益加深的今天,技术的跨界合作正成为推动行业进步的重要力量。8月23日,一场旨在深化国际合作、共推边缘计算技术发展的会议…

云 VS 边缘计算,关系与区别是什么?

云计算和边缘计算的区别是什么? 云是一种 IT 环境,可以抽象、汇集和共享整个网络中的 IT 资源。边缘是网络边缘的计算位置,以及这些物理位置上的硬件和软件。是在云中运行工作负载,而边缘计算是在边缘设备上运行工作负载。 边缘…

马丁格尔交易策略Anzo Capital指出问题核心,那就是保证金

使用马丁格尔交易策略进行外汇交易时,Anzo Capital 强调了保证金管理的重要性。通过精准计算和策略规划,Anzo Capital 帮助交易者在波动的市场中保持资金安全,并最大化投资回报。 Anzo Capital 提醒交易者,了解波动回弹至关重要&…

渗透测试中最常见的安全漏洞有哪些

目录 常见的安全漏洞 拓展 渗透测试中如何检测SQL注入漏洞? 如何防范跨站脚本攻击(XSS)? 文件上传漏洞通常是如何被利用的? 思维导图 常见的安全漏洞 在渗透测试中,以下是一些最常见的安全漏洞: SQL注入&#x…

计算机毕设推荐-基于python的超市数据处理可视化分析

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的超市数据处理可…

AI编码公司Magic获得近5亿美元巨额投资

Magic,一家专注于生成式人工智能AI编码的初创公司,最近在AI领域取得了显著的成就。该公司通过创建模型来生成代码并自动执行软件开发任务,成功吸引了包括前谷歌CEO埃里克施密特在内的一系列知名投资者的关注,并完成了一轮3.2亿美元…

【MySQL 12】事务管理 (带思维导图)

文章目录 🌈 一、事务的基本概念⭐ 1. 事务是什么⭐ 2. 事务的特性 🌈 二、事务的版本支持🌈 三、事务的提交方式⭐ 1. 查看事务的提交方式⭐ 2. 设置事务的提交方式 🌈 四、事务的特性证明⭐ 1. 事务的常规操作⭐ 2. 证明事务的原…

mapbox-gl 常用Expressions表达式

文章目录 一、前言1.1 概念1.2 Mapbox gl提供的表达式计算器 二、所有支持的运算符2.1 颜色运算符2.1.1 rgb2.1.2 rgba2.1.3 hsl2.1.4 hsla2.1.5 to-rgba 2.2 Math 数学计算运算符2.2.1 , -, *, /, %, ^2.2.2 abs, ceil, floor, round2.2.3 sin, cos, tan, asin, acos, atan2.2…

Hbuilder创建的项目(uniApp + Vue3)中引入UnoCSS原子css引擎

这里是UnoCSS的官网介绍 UnoCS通过简化和优化CSS的编写过程来提高Web开发的效率和可维护性。好处是: 提升开发效率提升开发效率提高一致性增强灵活性易于维护方便的集成与配置 同时还支持预设变量和规则。这些可参看官网进行配置。Unocss通过其原子化方法、高度的…

STL-常用算法

概述&#xff1a; 算法主要由头文件<algorithm><functional><numeric>组成<algorithm>是所有STL头文件最大的一个&#xff0c;范围涉及到比较&#xff0c;交换&#xff0c;遍历操作&#xff0c;复制&#xff0c;修改等<numeric>体积很小&#x…

华硕天选Air:开学季的性价比之巅

正值开学季&#xff0c;华硕天选Air全能本以8999元的首发价回归&#xff0c;为学生和需求高性能笔记本的用户带来了超值的选择。 这款笔记本以其轻薄设计和强悍性能&#xff0c;成为市场上的热点。 轻薄设计&#xff0c;潮流先锋 华硕天选Air 2024采用了全新模具设计&#xf…

如何选择生信云服务器

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 生物信息学&#xff08;生信&#xff09;分析的需求日益增加&#xff0c;选择一款合适的生信云服务器变得尤为重要。一个优秀的生信云服务器不仅能够提供强大的计算能力和灵活的存储空间&…