Polars是一个用于数据处理和分析的DataFrame库,可作为pandas的替代品,特别适用于处理大规模数据集和需要快速执行的任务。根据测试结果,Polars在不同操作中相较于Pandas表现出显著的速度优势。比如,相对于Pandas读取CSV数据的平均时间,Polars的读取速度提高了99%。在选择数据方面,Polars平均速度提高了约40%。对于过滤数据操作,Polars比Pandas快约一半的时间。在分组数据和聚合方面,Polars的速度比Pandas快约85%。
Polars与pandas相比有以下优势:
-
执行速度:Polars利用了并行执行和底层Rust编写的优势,因此在处理大规模数据时通常比pandas更快。 -
多核处理:Polars能够充分利用多个CPU核心,以并行方式处理数据,从而提高了处理速度。而pandas在默认情况下是单线程执行,无法充分利用多核处理器的优势。 -
内存效率:Polars使用了一种称为”lazy evaluation”的技术,它可以延迟执行操作,从而减少内存使用量。这使得Polars能够更有效地处理大型数据集。 -
Rust编写:Polars是用Rust编写的,这使得它能够利用Rust语言的性能优势。Rust是一种系统级编程语言,具有出色的内存安全性和并发性能。 -
Python API:尽管Polars是用Rust编写的,但它提供了一个易于使用且对有Python经验的用户来说很熟悉的Python API。这使得Polars对于广大的数据科学家和研究人员来说是可访问的。
安装
pip install polars
测试对比
将pandas 数据转换为Polars数据:
# 导入所需的库
import pandas as pd
import polars as pl
from openbb_terminal.sdk import openbb
# 加载SP500指数中的500支股票的30年价格数据来运行测试
url = "http://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
table = pd.read_html(url)[0]
tickers = table.Symbol.tolist()
df_pandas = openbb.economy.index(tickers, start_date="1990-01-01")
# 将pandas DataFrame转换为Polars DataFrame
df_polars = pl.from_pandas(df_pandas)
从CSV中读取数据
在下面测试用例中,pandas从CSV中读取数据平均耗费458毫秒,而Polars只需要3.57毫秒。Polars在从CSV文件中读取数据方面比pandas快99%。
# pandas从CSV中读取数据
%timeit pd.read_csv("data.csv")
# 458 ms ± 3.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# polars从CSV中读取数据
%timeit pl.scan_csv("data.csv")
# 3.57 ms ± 4.01 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
选择数据
从列中选择数据也是常见的操作。根据下面代码的速度对比结果,使用Polars的选择操作相对于使用Pandas的选择操作,平均每次循环节省了大约274微秒的时间。Polars相对于Pandas在选择数据方面的速度快了约40%。
selected = tickers[:100]
# pandas
%timeit df_pandas[selected]
# 673 µs ± 22.4 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
# polars
%timeit df_polars.select(pl.col(selected))
# 399 µs ± 1.37 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
过滤数据
对于简单的过滤操作,Polars大约只需要pandas一半的时间。
# pandas
%timeit df_pandas[df_pandas["GE"] > 100]
# 2.55 ms ± 28.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# polars
%timeit df_polars.filter(pl.col("GE") > 100)
# 1.27 ms ± 371 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
分组数据
在分组和聚合方面,Pandas花费了113毫秒,而Polars只需16.5毫秒。
# pandas
%timeit df_pandas.groupby("GE").mean()
# 113 ms ± 4.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# polars
%timeit df_polars.groupby("GE").mean()
# 16.5 ms ± 3.68 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
添加新列
在添加新列方面,Polars快了98%。
# pandas
%timeit df_pandas.assign(GE_Return=df_pandas["GE"].pct_change())
# 3.67 ms ± 23.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# polars
%timeit df_polars.with_columns((pl.col("GE").pct_change()).alias("GE_return"))
# 89 µs ± 3.57 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
填充缺失数据
需要注意的是,在填充null和NaN值方面,Polars比Pandas慢大约3倍。
# Pandas
%timeit df_pandas["GE"].fillna(0)
# 33.2 µs ± 112 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
# Polars
%timeit df_polars.with_columns(pl.col("GE").fill_null(0))
# 81.5 µs ± 169 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
排序数据
在排序方面,Pandas和Polars相差不大,但Polars仍然更快。
# pandas
%timeit df_pandas.sort_values("GE")
# 6.45 ms ± 48.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# polars
%timeit df_polars.sort("GE")
# 4.54 ms ± 162 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
计算滚动统计性能
在简单的滚动均值计算中,Polars相对于Pandas在计算滚动统计量方面的速度提高了约44%。
# pandas
%timeit df_pandas.GE.rolling(window=20).mean()
# 184 µs ± 274 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
# polars
%timeit df_polars.with_columns(pl.col("GE").rolling_mean(20))
# 103 µs ± 323 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
Polars的语法与Pandas不同,因此使用Polars会有一定的学习曲线。同时,选择适合您需求的工具非常重要。如果您处理的是数十或数百GB级别的大型数据集,那么Polars是一个不错的选择。但如果您的数据规模不是很大,那么Pandas也完全可以满足您的需求。简而言之,根据您的具体情况选择合适的工具即可。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/111099
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!