6.6kstar,比pandas快很多的数据处理库(代码片段)

我爱Python数据挖掘 我爱Python数据挖掘     2022-11-30     190

关键词:

Polars 是一个使用 Apache Arrow 列格式作为内存模型,用Rust实现的,在Rust, Python以及Node.js中均可使用的速度极快的数据帧库。

它有以下几个特点:

  • 懒|立即执行

  • 多线程

  • SIMD

  • 查询优化

  • 强大的表达式API

  • 支持多种语言:Rust、Python 等

了解更多内容可以点击这个用户指南[1]。

Python代码示例

>>> df = pl.DataFrame(
...     
...         "A": [1, 2, 3, 4, 5],
...         "fruits": ["banana", "banana", "apple", "apple", "banana"],
...         "B": [5, 4, 3, 2, 1],
...         "cars": ["beetle", "audi", "beetle", "beetle", "beetle"],
...     
... )

# embarrassingly parallel execution
# very expressive query language
>>> (
...     df
...     .sort("fruits")
...     .select(
...         [
...             "fruits",
...             "cars",
...             pl.lit("fruits").alias("literal_string_fruits"),
...             pl.col("B").filter(pl.col("cars") == "beetle").sum(),
...             pl.col("A").filter(pl.col("B") > 2).sum().over("cars").alias("sum_A_by_cars"),     # groups by "cars"
...             pl.col("A").sum().over("fruits").alias("sum_A_by_fruits"),                         # groups by "fruits"
...             pl.col("A").reverse().over("fruits").alias("rev_A_by_fruits"),                     # groups by "fruits
...             pl.col("A").sort_by("B").over("fruits").alias("sort_A_by_B_by_fruits"),            # groups by "fruits"
...         ]
...     )
... )
shape: (5, 8)
┌──────────┬──────────┬──────────────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐
│ fruits   ┆ cars     ┆ literal_stri ┆ B   ┆ sum_A_by_ca ┆ sum_A_by_fr ┆ rev_A_by_fr ┆ sort_A_by_B │
│ ------      ┆ ng_fruits    ┆ --- ┆ rs          ┆ uits        ┆ uits        ┆ _by_fruits  │
│ strstr---          ┆ i64 ┆ ------------         │
│          ┆          ┆ str          ┆     ┆ i64         ┆ i64         ┆ i64         ┆ i64         │
╞══════════╪══════════╪══════════════╪═════╪═════════════╪═════════════╪═════════════╪═════════════╡
│ "apple""beetle""fruits"114744           │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "apple""beetle""fruits"114733           │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "banana""beetle""fruits"114855           │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "banana""audi""fruits"112822           │
├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ "banana""beetle""fruits"114811           │
└──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘

性能

Polars速度非常快,事实上,它是目前性能最好的解决方案之一。具体可参见h2oai’s db基准测试结果[2]。

此处我们自己用一些示例代码来对比python中pandas和polars处理数据的速度差距。

import pandas as pd
import polars as pl
import timeit

# 读取时间对比
start_df = timeit.default_timer()
df = pd.read_csv("/Users/lenskit/Desktop/aa.csv")
df = df.sort_values("company_name", ascending=False).head()
stop_df = timeit.default_timer()
print('time: ', stop_df - start_df)

start_pl = timeit.default_timer()
data = pl.read_csv("/Users/lenskit/Desktop/aa.csv")
data.sort(by="company_name", reverse=True).head()
stop_pl = timeit.default_timer()
print('time1: ', stop_pl - start_pl)

# 纵向拼接时间对比
start_df1 = timeit.default_timer()
df_1 = pd.read_csv('/Users/lenskit/Desktop/aa.csv')
df_2 = pd.read_csv('/Users/lenskit/Desktop/bb.csv')
df_1.append(df_2, ignore_index=True)
stop_df1 = timeit.default_timer()
print('time2: ', stop_df1 - start_df1)

start_pl1 = timeit.default_timer()
pl_1 = pl.read_csv('/Users/lenskit/Desktop/aa.csv')
pl_2 = pl.read_csv('/Users/lenskit/Desktop/bb.csv')
pl_1.vstack(pl_2)
stop_pl1 = timeit.default_timer()
print('time3: ', stop_pl1 - start_pl1)


time:  5.088931238
time1:  0.8967700230000002
time2:  4.707102063
time3:  0.639797883

可以看到在读取文件上,polars比pandas速度快了5倍多,在数据纵向拼接上,polars比pandas快了有7倍多。

Python安装

用如下语句安装最新的polars版本:

$ pip3 install -U polars[pyarrow]

目前polars的更新频率很高(每周/每隔几天),所以最好定期更新一下polars来获得最新的错误修复/功能。

Rust安装

您可以从crates.io获取最新版本,或者如果你想使用最新的功能/性能改进,可以用如下命令指向版本的master分支。

polars =  git = "https://github.com/pola-rs/polars", rev = "<optional git tag>" 

注意需要Rust version >=1.58

文档

想知道Polars支持的所有功能吗?阅读文档!

Python

  • 安装指南:$ pip3 install polars

  • Python文档[3]

  • 用户指南[4]

Rust

  • Rust文件(主分支)[5]

  • 用户指南[6]

Node

  • 安装指南:yarn install nodejs-polars

  • Node文档[7]

  • 用户指南[8]

[Python]: 从源代码编译polars

如果你想要获取最前沿的版本或最大的性能,你应该从源代码编译Polar。

这可以通过按顺序执行以下步骤来完成:

  • 1、安装最新的Rust编译器[9]

  • 2、安装maturin[10]: $ pip3 install maturin

  • 3、选择以下任一:

  • 最快的二进制文件,非常长的编译时间:

  • $ cd py-polars && maturin develop --rustc-extra-args="-C target-cpu=native" --release

  • 较快的二进制文件,短一些的编译时间:

  • $ cd py-polars && maturin develop --rustc-extra-args="-C codegen-units=16 -C lto=

需要注意的是,Python实现的Rust crate被称为py-polars,以区别于Rust crate包polars本身。然而,Python包和Python模块都被命名为polars,所以你可以pip install polarsimport polars

Arrow2

Polars已经转移到arrow2[11]。Arrow2是Apache Arrow Columnar Format[12]更快、更安全的实现。Arrow2还具有更细粒度的代码库,有助于减少编译器膨胀。

参考资料

[1]用户指南: https://pola-rs.github.io/polars-book/

[2]h2oai’s db基准测试结果: https://h2oai.github.io/db-benchmark/

[3]Python文档: https://pola-rs.github.io/polars/py-polars/html/reference/index.html

[4]用户指南: https://pola-rs.github.io/polars-book/user-guide/index.html

[5]Rust文件(主分支): https://pola-rs.github.io/polars/polars/index.html

[6]用户指南: https://pola-rs.github.io/polars-book/user-guide/index.html

[7]Node文档: https://pola-rs.github.io/polars/nodejs-polars/html/index.html

[8]用户指南: https://pola-rs.github.io/polars-book/user-guide/index.html

[9]Rust编译器: https://www.rust-lang.org/tools/install

[10]maturin: https://maturin.rs/

[11]arrow2: https://crates.io/crates/arrow2

[12]Apache Arrow Columnar Format: https://arrow.apache.org/docs/format/Columnar.html

推荐文章

技术交流

欢迎转载、收藏、有所收获点赞支持一下!数据、代码可以找我获取

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

请问在大数据量查询的时候,sql为啥比excel要快很多呢?谢谢!

我知道这个sql比excel要快很多,但是我想知道原因是什么,谢谢!参考技术Aexcel需要将所有数据加载,然后一条一条筛选,就是用来存放数据的而sql是专门用于统计信息和调用的 查看详情

使用 pandas 解析大量日期 - 可扩展性 - 性能下降速度比线性快

】使用pandas解析大量日期-可扩展性-性能下降速度比线性快【英文标题】:Parsinglargeamountofdateswithpandas-scalability-performancedropsfasterthanlinear【发布时间】:2016-07-2819:55:40【问题描述】:在使用Pandas0.17.1解析大量日期时,我遇到了一... 查看详情

11.5kstar!有了这个python开发利器,bug会减少很多!

【导语】:Python静态类型检查库,可以发现程序中潜在的错误。简介Mypy是Python的静态类型检查库,可以向Python程序添加类型注解,并用mypy对它们进行静态类型检查,无需运行代码即可发现程序中潜在的错误。... 查看详情

递归比循环快吗?

...没有问什么时候应该使用递归而不是迭代,我知道已经有很多问题了。我要问的是,递归永远比循环快吗?在我看来,你总是能够优化循环并让它比递归函数执行得更快,因为循环不存在不断设置新的堆栈帧。我正在寻找在递归... 查看详情

redis比datatable快

...在流行的机器学习应用训练模型动辄需要GB级别的数据,很多时候datatable无法快速读取大数据文件或者进行高效运算,甚至可能存在内存溢出等情况。所以redis是datatable更好的替代品。 查看详情

redis比datatable快

...在流行的机器学习应用训练模型动辄需要GB级别的数据,很多时候datatable无法快速读取大数据文件或者进行高效运算,甚至可能存在内存溢出等情况。所以redis是datatable更好的替代品。 查看详情

redis在linux比windows快很多

参考技术A没这种说法,要看硬件配置和运行的服务的。 查看详情

pandas 比 numpy 慢得多?

】pandas比numpy慢得多?【英文标题】:pandasmuchslowerthannumpy?【发布时间】:2013-11-0710:54:38【问题描述】:下面的代码表明,pandas可能比numpy慢得多,至少在函数clip()的特定情况下是这样。令人惊讶的是,从pandas到numpy再到pandas的往... 查看详情

pandas.dataframe.loc好慢,怎么遍历访问dataframe比较快

...数组遍历和赋值,速度会提高非常多。numpy内置函数处理数据的速度是C语言级别的,写程序时,尽量使用np的内置函数,尤其是涉及循环的问题时。 查看详情

为啥leetcode上很多题java比c++快

c++隐形代码太多,要效率还是c。另外纯计算题,java也很快的。偏计算的代码少,执行次数多,jit会生成机器码,生成之后就跟c语言没啥区别了。参考技术Ac++隐形代码太多,要效率还是c。另外纯计算题,java也很快的。偏计算的... 查看详情

为啥genymotion模拟器比android模拟器快很多? [关闭]

】为啥genymotion模拟器比android模拟器快很多?[关闭]【英文标题】:Whygenymotionemulatorisalotfasterthanandroidemulator?[closed]为什么genymotion模拟器比android模拟器快很多?[关闭]【发布时间】:2014-10-1423:48:05【问题描述】:我一直在Ubuntu14.04... 查看详情

pandas概述(代码片段)

...个类分别是Series和DataFrame。Pandas是numpy的一种扩展,因此很多高级的数据计算方法也是来源numpy。长远目标成为最强大、最灵活、可以支持任何语言的开源数据分析工具。适用的数据类型与SQL或Excel表类似的 查看详情

python的科学计算库都有哪些

1、Numpy库简介在Python中很多高级库都是基本Numpy科学库去做的。之前如果用Python对数据进行操作,需要一行一行或者一个一个数据的去进行操作。而在Numpy中,则是封装了一系列矩阵的操作:首先把数据转换成一系列矩阵的格式... 查看详情

为啥多处理比 Pandas 中的简单计算慢?

】为啥多处理比Pandas中的简单计算慢?【英文标题】:whyismultiprocessingslowerthanasimplecomputationinPandas?为什么多处理比Pandas中的简单计算慢?【发布时间】:2018-09-2500:37:37【问题描述】:这与howtoparallelizemany(fuzzy)stringcomparisonsusingapply... 查看详情

为什么.o(目标文件)链接速度比.lib(静态库)快?

...接。通过链接到.o,链接时间几乎是5-6秒。为什么链接.lib比.o更慢?答案如果你所做的只是编译源代码来创建一个目标文件,那么你根本就不进行任何链接。这意味着对源代码中存在的外部函数和变量的任何引用都将无效,因为... 查看详情

pandas与matplotlib基础(代码片段)

...Python中开源的,高性能的用于数据分析的库。其中包含了很多可用的数据结构及功能,各种结构支持相互转换,并且支持读取、保存数据。结合matplotlib库,可以将数据已图表的形式可视化,反映出数据的各项特征。先借用一张... 查看详情

提高 Pandas 合并性能

...那样,我特别没有PandsMerge的性能问题,但我有一个包含很多方法的类,它对数据集进行了很多合并。该课程有大约10个分组和大约15个合并。虽然groupby非常快,但在1.5秒的总执行时间中,这15次合并调用大约需要0.7秒。我想加快... 查看详情

mongodb为啥比mysql快

...的设计带来的弊端也是有的。例如数据关系的维护会带来很多冗余数据、客户端代码需要大量针对数据库进行的IO操作、数据挖掘难以实现等等。参考技术A首先是内存映射机制,数据不是持久化到存储设备中的,而是暂时存储在... 查看详情