Polars
Polars 是一个用 Rust 编写的快速 DataFrame 库,以 Arrow 为基础。
💡 了解有关如何在 列出 Parquet 文件 指南中获取数据集 URL 的更多信息。
让我们从获取 barilan/blog_authorship_corpus
数据集的 train
拆分到数据集查看器 API 的 URL 开始
r = requests.get("https://datasets-server.huggingface.co/parquet?dataset=barilan/blog_authorship_corpus")
j = r.json()
urls = [f['url'] for f in j['parquet_files'] if f['split'] == 'train']
urls
['https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0000.parquet',
'https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0001.parquet']
要从单个 Parquet 文件读取,请使用 read_parquet
函数将其读取到 DataFrame 中,然后执行您的查询
import polars as pl
df = (
pl.read_parquet("https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0000.parquet")
.groupby("horoscope")
.agg(
[
pl.count(),
pl.col("text").str.n_chars().mean().alias("avg_blog_length")
]
)
.sort("avg_blog_length", descending=True)
.limit(5)
)
print(df)
shape: (5, 3)
┌───────────┬───────┬─────────────────┐
│ horoscope ┆ count ┆ avg_blog_length │
│ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ f64 │
╞═══════════╪═══════╪═════════════════╡
│ Aquarius ┆ 34062 ┆ 1129.218836 │
│ Cancer ┆ 41509 ┆ 1098.366812 │
│ Capricorn ┆ 33961 ┆ 1073.2002 │
│ Libra ┆ 40302 ┆ 1072.071833 │
│ Leo ┆ 40587 ┆ 1064.053687 │
└───────────┴───────┴─────────────────┘
要读取多个 Parquet 文件 - 例如,如果数据集已分片 - 您需要使用 concat
函数将文件连接成单个 DataFrame
import polars as pl
df = (
pl.concat([pl.read_parquet(url) for url in urls])
.groupby("horoscope")
.agg(
[
pl.count(),
pl.col("text").str.n_chars().mean().alias("avg_blog_length")
]
)
.sort("avg_blog_length", descending=True)
.limit(5)
)
print(df)
shape: (5, 3)
┌─────────────┬───────┬─────────────────┐
│ horoscope ┆ count ┆ avg_blog_length │
│ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ f64 │
╞═════════════╪═══════╪═════════════════╡
│ Aquarius ┆ 49568 ┆ 1125.830677 │
│ Cancer ┆ 63512 ┆ 1097.956087 │
│ Libra ┆ 60304 ┆ 1060.611054 │
│ Capricorn ┆ 49402 ┆ 1059.555261 │
│ Sagittarius ┆ 50431 ┆ 1057.458984 │
└─────────────┴───────┴─────────────────┘
惰性 API
Polars 提供了一个 惰性 API,它对于大型 Parquet 文件而言性能更高且内存效率更高。LazyFrame API 会跟踪您想做什么,并且只在您准备好时才执行整个查询。这样,惰性 API 不会预先将所有内容加载到 RAM 中,并且允许您处理大于可用 RAM 的数据集。
要惰性读取 Parquet 文件,请使用 scan_parquet
函数。然后,使用 collect
函数执行整个查询
import polars as pl
q = (
pl.scan_parquet("https://huggingface.co/datasets/barilan/blog_authorship_corpus/resolve/refs%2Fconvert%2Fparquet/blog_authorship_corpus/train/0000.parquet")
.groupby("horoscope")
.agg(
[
pl.count(),
pl.col("text").str.n_chars().mean().alias("avg_blog_length")
]
)
.sort("avg_blog_length", descending=True)
.limit(5)
)
df = q.collect()