Rust机器学习之Polars

丰富的线上&线下活动,深入探索云世界

做任务,得社区积分和周边

最真实的开发者用云体验

让每位学生受益于普惠算力

让创作激发创新

资深技术专家手把手带教

遇见技术追梦人

技术交流,直击现场

海量开发者使用工具、手册,免费下载

极速、全面、稳定、安全的开源镜像

开发手册、白皮书、案例集等实战精华

为开发者定制的Chrome浏览器插件

本文将带领大家学习Polars的基础用法,通过数据加载->数据探索->数据清洗->数据操作一整个完整数据处理闭环,让大家学会如何用Polars代替Pandas进行数据处理。

简单地说Polars相当于Rust的Pandas,且性能比Pandas要好很多。

跟Pandas比,Polars有如下优势:

正如开篇所讲,Polars就是为了解决Pandas的性能而生的。在很多测试中,Polars比Pandas快2-3倍。

由于Polars提供Python和JavaScript绑定,所以Polars支持多种语言环境安装

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

polars="0.25.1"或者用cargoadd

$cargoaddpolars对于Python环境,我们可以安装Polars的Python语言绑定PyPolars

$pipinstallpolars对于node环境,我们可以安装Polars的JavaScript语言绑定

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

:deppolars={version="0.25.1"}创建DataFrame手动创建我们先来看一下如何创建DataFrame:

usepolars::prelude::*;letdf=df!["Model"=>["iPhoneXS","iPhone12","iPhone13","iPhone14","SamsungS11","SamsungS12","MiA1","MiA2"],"Company"=>["Apple","Apple","Apple","Apple","Samsung","Samsung","XiaoMi","XiaoMi"],"Sales"=>[80,170,130,205,400,30,14,8],"Comment"=>[None,None,Some("SoldOut"),Some("NewArrival"),None,Some("SoldOut"),None,None],];println!("{}",&df);Polars提供了df!宏来创建DataFrame。df!按列接受数据,每列含有列名和数据,数据以数组形式提供。这里需要注意的是,如果数据中存在空数据,我们需要用None来表示,而Rust是强类型语言,需要列数据类型一致,所以如果数据中有None存在,其他非None的数据需要用Some()包裹,达到类型一致。

DataFrame实现了std::fmt::Display方法,因此创建的对象可以直接利用println!宏输出。

跟Pandas一样,在JupyterNotebook中PolarsDataFrame会以整齐美观的格式输出,并且还很贴心地将每列的数据类型展示出来,非常方便。

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

letdf2=df![0=>[Some(0),Some(1),Some(2)],1=>[Some("x"),Some("y"),Some("z")],];println!("{}",&df2);上面的代码运行会报错mismatchedtypes错误,因为列名是i32类型不是str字符串类型。

除了显示列名,PolarsDataFrame还会在列名下面显示该列的数据类型。我们也可以调用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("iPhoneXS"),Utf8("Apple"),Int32(80),Null])注意:与Pandas不同,Polars中没有行索引的概念。Polar的设计哲学认为DataFrame不需要行索引。

除了手动创建DataFrame外,我们更多时候都是从外部将数据集加载到DataFrame中。Polars支持多种格式的数据加载,包括csv、json、parquet等常见的数据格式。

我们以csv数据载入为例演示一下Polars如何加载外部数据:

iris_data=CsvReader::from_path("iris.csv").has_header(true).finish();println!("{}",&iris_data);上面的代码会将iris.csv文件中的数据加载到DataFrame中。其中has_header(true)的意思是csv文件有表头。输出结果如下:

其他格式的数据都有对应的Reader,用法类似。

有了数据之后,通常第一步我们需要对数据进行一些探索。常用的数据探索功能Polars都已经内置。

当我们的数据集比较大时,我们一般只会选择开头或结尾的几行来浏览数据。

我们可以通过shape()来查看数据集的大小

iris_data.shape()输出

(150,5)对数据集更详细的描述可以使用类似Pandas的describe()方法。describe()方法在describefeature中,所以要使用describe()我们需要在引入Polars时带上feature。

iris_data.describe(None)输出如下:

从输出可以看到,Polars的describe方法的输出跟Pandas的几乎一致。

describe()方法接受一个参数,用于指定分位数。如果传None,则默认显示25%,50%,75%分位数。我们可以传入f64数组引用来自定义分位数,比如:

iris_data.describe(Some(&[0.3,0.6,0.9]))上面的代码会输出30%,60%,90%分位数。(注意,describe()方法的参数是Option类型,所以我们需要用Some将浮点数数组包裹起来)

describe()中已经包含了常用的聚合统计,这些数据都有对应的函数可以单独统计。除此之外,Polars还提供了众多聚合统计函数:

这里给大家详细说一下quantile(),其他的跟Pandas非常类似。

quantile()接受2个参数,第一个参数分位数,第二个参数是求值策略,它是个QuantileInterpolOptions枚举值,有如下选项:

下面代码演示了如何用线性策略求33%分位数:

Polars有drop_nulls()删除缺失值。请看下面的代码:

letdf2=df.drop_nulls(Some(&["Comment".to_string()]));println!("{}",&df2);上面代码移除Comment列数据为空的记录。输出结果为:

如果参数传None则是对所有列移除数据为空的记录。

除了直接将缺失值所在行删除掉,很多时候我们希望用某个值来填充缺失值。Polars中有fill_null()可以实现这个功能。

letdf3=df.fill_null(FillNullStrategy::Forward(None));println!("{}",&df3);上面的代码会用遇到的第一个非空值填充后面的空值。输出结果如下:

fill_null提供多种填充策略:

在数据清洗时我们往往还要去除数据中的重复记录,Polars提供了drop_duplicates()。请看下面的代码:

letdf4=df.drop_duplicates(true,Some(&["Company".to_string()]));println!("{}",&df4);drop_duplicates()接收2个参数,第一个参数是个bool值,表示是否保持数据的顺序;第二个参数是要处理的列名列表,如果传None表示所有列。上面代码执行后,Company列中重复的数据只会保留第一条。输出结果如下:

Polars中选择列非常的直接,只需要给出列名即可:

df.select(["Model"])上面的代码会返回仅包含Model列的DataFrame。

如果你想获取多列,只需要将多个列名放在数组里即可:

除了用列名获取列,我们还可以用下标来获取,

df.select_by_range(0..1)df.select_by_range(0..=1)上面两行代码的输出跟之前用列名选择列的输出是一样的。

从数据集中按条件筛选(过滤)数据是最常用的操作之一。Polars用filter()进行数据筛选。filter()接收一个bool数组为参数,根据数组中的bool值来留下(为true时)或过滤掉(为false时)数据。因此数据筛选(过滤)的核心是产生此bool数组。比如,我们想筛选出苹果公司的手机,可以这样写:

letmask=df.column("Company").equal("Apple");df.filter(&mask)上面代码df.column("Company")获取Company列数据,然后用equal()判断值相等,得到bool数组,再由filter()函数过滤出数据。输出结果为:

我们当然也可以通过逻辑运算(与&,或|,非!)组合多个筛选条件。比如我想筛选出苹果公司销售量大于100的数据,可以这样组合:

letmask=df.column("Company").equal("Apple")&df.column("Sales").gt(100);df.filter(&mask)这里用与运算&组合两个判断条件,形成新的bool数组。结果如下:

对数排序是数据分析中最常用的另一个操作。Polars提供sort()方法可以单列排序或多列组合排序。

单列排序很简单,只需要传入2个参数--列名和是否降序排列,请看下面的代码:

df.sort(["Sales"],true)上面的代码对Sales列降序排序,输出结果为:

多列组合排序需要传入多个列名组成的数组和对应的排序方式数组,请看下面的代码:

df.sort(["Model","Sales"],vec![false,true])排在前面的列为主排序列,后面的列为辅助排序列。排序时会先按主列排序,然后再按辅列排序。上面的代码实现的是先按Model升序排序,然后在此基础上再按Sales降序排序,所以输出结果为:

有时我们需要将两个DataFrame按主键合并成一个DataFrame,此时就需要用得到join()。join()接收5个参数,分别是要合并的DataFrame,左键,右键,合并方式,及前缀。请看下面的代码:

letdf_price=df!["Model"=>["iPhoneXS","iPhone12","iPhone13","iPhone14","SamsungS11","SamsungS12","MiA1","MiA2"],"Price"=>[2430,3550,5700,8750,2315,3560,980,1420],"Discount"=>[Some(0.85),Some(0.85),Some(0.8),None,Some(0.87),None,Some(0.66),Some(0.8)],];letmutdf_join=df.join(&df_price,["Model"],["Model"],JoinType::Inner,None);println!("{}",&df_join);上面的代码将新建的df_price按照Model为主键合并到df中,合并后的结果为:

数据分析时往往需要分组来分析,我们可以用groupby()对数据进行分组。groupby()接受一个参数,指定以哪个属性(列名)来分组。比如我们想按公司品牌来统计销量,可以这样写:

df.groupby(["Company"]).select(["Sales"]).sum()上面的代码很好理解,先按Company分组,然后对Salse进行加总,结果如下:

最后,我们可以将前面学到的内容结合在一起使用,按公司品牌统计销售额并降序排序。$\text{销售额}=\text{销量}\times\text{售价}\times\text{折扣}$,其中折扣为空表示不打折。代码如下:

//计算销售额letmutamount=(df_join.column("Sales"))*(df_join.column("Price"))*(df_join.column("Discount").fill_null(FillNullStrategy::One));amount.rename("Amount");//将销售额加入DataFramedf_join.with_column(amount);//分组统计销售额df_join.groupby(["Company"]).select(["Amount"]).sum().sort(["Amount_sum"],true)输出为:

本章我们学习了Polars的基本用法,并带大家实操了从数据生成/加载,到数据探索,数据清洗,再到数据操作一整个数据处理流程。Pandas能实现的功能,Polars都能实现且性能更好。

Polars的功能还有很多,能处理的问题十分丰富。并且Polars并行计算和延迟计算等高级特性本文还为涉及,后面会为大家专门介绍Polars的延迟计算和并行计算,让大家可以最大程序挖掘Polars的性能极限。

THE END
1.轻松删除Excel重复项,3种方法助你提升工作效率选择要删除重复项的数据范围。 点击“数据”选项卡。 在“数据工具”组中,点击“删除重复项”按钮。 在弹出的“删除重复项”对话框中,确保选中了正确的数据范围。 点击“确定”按钮。 Excel会自动删除重复项,并保留唯一值。 方法二:使用条件格式标记重复项 ...https://www.kdocs.cn/article/A2C23C7CA0.html
2.excel重复值标红以及excel重复值标红怎么去掉的技巧讲解Excel重复值标红主要通过“开始——条件格式——突出显示单元格规则——重复值”,进行操作。 当我们查看完重复值之后,想取消标识的颜色,应该怎么操作呢?这也是后台留言比较多的问题:excel重复值标红怎么去掉。 重复值查看如何取消颜色,可以参考下面的操作步骤:执行“开始——条件格式——清除规则——清除整个工作表的...http://www.ittribalwo.com/article/4853.html
3.Excel基础操作小技巧删除重复值 直接选中区域,然后选中数据-删除重复值即可。 对齐名字 首先选中区域,点击开始下的对齐下拉框,之后在相应的对话框中选择分散对齐即可。 快速输入男女 Ctrl+1打开设置单元格格式,直接在自定义格式中输入“[=1]男;[=2]女”。 快速判断条件 https://www.meipian.cn/2f0gnkph
1.如何删除所有重复项,但在Excel中仅保留一个?在Excel中,“删除重复项”功能可以帮助您删除所有重复项,但保留一个重复值。 1.选择所需的数据列表,然后单击时间>删除重复。 看截图: 2.然后在删除重复对话框中,检查要从中删除重复项的列名,如果数据中包含标题,请检查我的数据有标题选项。 看截图: https://zh-cn.extendoffice.com/documents/excel/3328-excel-keep-only-one-duplicate.html
2.实用Excel技巧分享:删除重复值的4个小妙招!(如何删除excel中的...以下是员工信息统计表,其中包含一些重复项。如何发现和删除重复是表格数据处理的基础。 本文介绍了不使用公式处理数据重复值的四种方法:①用条件格式标记重复值;②通过高级过滤删除重复项;③通过“删除重复值”功能直接删除重复项;④通过数据透视表删除重复项。 https://zhujicankao.com/98169.html
3.如何处理重复值,这些方法你要早点知道那么,如何处理重复呢? 接下来我用招聘网站的数据表格,来演示处理重复值的妙招。(公众号回复“资料”下载案例数据) 需求1:如何删除“城市”列中的重复值 步骤: 1)鼠标位于“城市”列下的任意单元格,单击“数据”选项卡下方的“删除重复项” 2)在弹出的对话框中单击“取消全选”,选择“城市”标签后单击“确定”...https://blog.csdn.net/zhongyangzhong/article/details/142432170
4.WPS如何取消重复值的颜色WPS取消重复值颜色方法金山WPS很多人不知道wps怎样取消重复值的颜色?今日为你们带来的文章是关于wps取消重复值的颜色的操作内容,一起来了解一下吧 很多人不知道wps怎样取消重复值的颜色?今日为你们带来的文章是关于wps取消重复值的颜色的操作内容,还有不清楚小伙伴和小编一起去学习一下吧。 https://www.jb51.net/office/wps/746784.html
5.设置了重复值怎么关闭重复值重复提示问:怎么把EXCEL中高亮显示重复值取消 答:EXCEL工作表中高亮显示重复值取消的操作方法如下: 一、首先打开EXCEL工作表,并全选工作表(CTRL+A); 二、然后依次点击:数据——重复项——高亮显示重复项——清除,如下图所示: 答:WPS没有宏的功能,您可以用office ...https://www.igaichong.com/article/83272ab136127a9e4798b745.html
6.腾讯文档中如何取消数据验证的高亮重复值?腾讯云开发者社区在Vi里面如果要搜索某个关键字,只要在命令状态下键入/xxx就可以了,比如,我要搜索port的位置,我就...https://cloud.tencent.com/developer/ask/1373367
7.如何取消合併单元格并在Excel中填充重复值?如果您有一个包括大量合併单元格的工作表,现在您需要取消合併它们并自动填写合併单元格中的原始值,以下面的屏幕截图所示。 您如何快捷处理此任务? 使用“转到特殊位置”命令取消合併单元格并填充重复数据 取消合併单元格并使用VBA代码填充重复数据 一键消除单元格并填充重复数据 ...https://www.yingxiongyun.com/news/post/15799.html
8.条件格式重复值不显示颜色6、这样就完成了取消重复值的颜色,如下图所示。 问:excel里面重复值怎么标记颜色? 答:excel里面给重复值标记颜色,可使用条件格式重复值完成标记。 方法步骤如下: 1、打开需要标记重复值的EXCEL表格,选中需要标记的单元格,在开始选项卡找到并点击“条件格式”。 https://www.lw33.cn/article/9e18ba3293e5d179b64e0865.html
9.excel列如何去重复数据4、选中删除重复项的列,点击数据的删除重复项。 5、删除重复项对话框,选择需要处理的列,点击确定。 6、同一列重复的内容即可删除。 20位数字太长显示重复值怎么取消 首先选中表格数据,点击菜单栏上开始-条件格式,然后下拉选择清除规则-清除所选单元格规则,最后查看结果表格中标记重复值的填充色被清除即可。Microsoft...https://www.51dongshi.com/eedfrrvrassbb.html
10.Excel输入值非法如何取消限定Excel表格如何提取重复值? 共1条回答 > MaYuan.: Excel表格中经常会遇到一些重复值的问题,今天阿钟老师和大家分享几个关于重复值提取、标注的几种方法。以下表中名称列为例,标注或提取不重复的产品。01.标注重复值鼠标点击【开始】-【条件格式】-【突出显示单元格规则】-【重复值】重复内容标注颜色突出显示了。https://www.3d66.com/answers_relation/relation_835138_15.html
11.如何删除重复值?介绍4种方法!全文810字,预计3分钟读完以下是员工信息统计表,里面有一些重复项,如何查找并删除重复项,是表格数据处理的基础。 这里介绍四种不使用公式处理数据重复值的方法: ① 条件格式;② 高级筛选;③ “删除重复值;④ 数据透视表。 1 通过条件格式标记重复项 选中要判断是否具有重复值的单元格区域,在“开始”选项卡中单击“...http://www.360doc.com/content/23/0609/17/28524985_1084110457.shtml
12.如何利用Excel生成指定范围内的随机数?在生成大量随机数时,可能会出现重复值的情况。为了避免这种情况,可以借助Excel的筛选功能或自定义VBA宏来去除重复值,确保数据的唯一性。 6. 导出数据 生成随机数后,可以将数据导出为CSV文件或其他格式,以便在其他程序中使用。通过“另存为”功能选择合适的格式,并设置导出选项,即可轻松实现数据导出。 https://www.6erp.cn/article_28221.html
13.子表介绍HAP选择不允许重复的字段,点击为开启状态即可。效果:仅在当前记录的子表字段中校验是否已有重复值,有则不能保存。其他记录的子表中如果录入了相同手机号不受影响,正常录入保存。全局不允许重复? 配置全局不允许重复,需要进入子表的实体工作表,将目标字段设置为不允许重复,然后本表会显示哪些字段标记了不允许重复。效果...https://help.mingdao.com/worksheet/control-subform
14.如何在两张纸的两列中查找重复或唯一值?也许比较同一个工作表中的两个范围对于大多数人来说很容易发现重复或唯一值,但是如果两个范围在两个不同的工作表中,您如何快速找出这两个范围中的重复和唯一值? 本教程将为您介绍一些快速入门。 将两个电子表格中的两个相同的标题列与Excel中的公式进行比较 ...https://www.huoban.com/news/post/147422.html
15.excel里如何去掉重复数据?excel表格如何筛选并删除重复数据首先仍然是进入到删除重复值的设置界面,然后在设置框中点击“取消全选”,并选择需要查询的重复列,作者在这里以商品为例,删除商品列下重复的数据行。 然后点击确定,可以看到下图中的数据行都是唯一的,不再存在重复的商品行。 我们也可以在删除重复值的设置框勾选需要的列,系统会按照勾选的列进行查询,并删除勾选列...https://www.customsnews.cn/diannao/88isakt6.html