Datasets documentation

Использование с Polars

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Использование с Polars

Этот документ представляет собой краткое введение к использованию datasets с Polars, с особым акцентом на то, как обрабатывать наборы данных с помощью функций Polars, а также как конвертировать набор данных в Polars или из Polars.

Это особенно полезно, так как позволяет выполнять быстрые операции без копирования данных, поскольку и datasets, и Polars используют Arrow в качестве базового формата.

Формат набора данных

По умолчанию наборы данных возвращают обычные объекты Python: целые числа, числа с плавающей точкой, строки, списки и т. д.

To get Polars DataFrames or Series instead, you can set the format of the dataset to polars using Dataset.with_format():

>>> from datasets import Dataset
>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]}
>>> ds = Dataset.from_dict(data)
>>> ds = ds.with_format("polars")
>>> ds[0]       # pl.DataFrame
shape: (1, 2)
┌───────┬───────┐
│ col_0 ┆ col_1 │
│ ---   ┆ ---   │
│ str   ┆ f64   │
╞═══════╪═══════╡
│ a     ┆ 0.0   │
└───────┴───────┘
>>> ds[:2]      # pl.DataFrame
shape: (2, 2)
┌───────┬───────┐
│ col_0 ┆ col_1 │
│ ---   ┆ ---   │
│ str   ┆ f64   │
╞═══════╪═══════╡
│ a     ┆ 0.0   │
│ b     ┆ 0.0   │
└───────┴───────┘
>>> ds["data"]  # pl.Series
shape: (4,)
Series: 'col_0' [str]
[
        "a"
        "b"
        "c"
        "d"
]

Это также работает для объектов IterableDataset, полученных, например, с помощью load_dataset(..., streaming=True):

>>> ds = ds.with_format("polars")
>>> for df in ds.iter(batch_size=2):
...     print(df)
...     break
shape: (2, 2)
┌───────┬───────┐
│ col_0 ┆ col_1 │
│ ---   ┆ ---   │
│ str   ┆ f64   │
╞═══════╪═══════╡
│ a     ┆ 0.0   │
│ b     ┆ 0.0   │
└───────┴───────┘

Обработка данных

Функции Polars, как правило, работают быстрее обычных функций, написанных вручную на Python, и поэтому являются хорошим вариантом для оптимизации обработки данных. Вы можете использовать функции Polars для обработки набора данных в Dataset.map() или Dataset.filter():

>>> import polars as pl
>>> from datasets import Dataset
>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]}
>>> ds = Dataset.from_dict(data)
>>> ds = ds.with_format("polars")
>>> ds = ds.map(lambda df: df.with_columns(pl.col("col_1").add(1).alias("col_2")), batched=True)
>>> ds[:2]
shape: (2, 3)
┌───────┬───────┬───────┐
│ col_0 ┆ col_1 ┆ col_2 │
│ ---   ┆ ---   ┆ ---   │
│ str   ┆ f64   ┆ f64   │
╞═══════╪═══════╪═══════╡
│ a     ┆ 0.0   ┆ 1.0   │
│ b     ┆ 0.0   ┆ 1.0   │
└───────┴───────┴───────┘
>>> ds = ds.filter(lambda df: df["col_0"] == "b", batched=True)
>>> ds[0]
shape: (1, 3)
┌───────┬───────┬───────┐
│ col_0 ┆ col_1 ┆ col_2 │
│ ---   ┆ ---   ┆ ---   │
│ str   ┆ f64   ┆ f64   │
╞═══════╪═══════╪═══════╡
│ b     ┆ 0.0   ┆ 1.0   │
└───────┴───────┴───────┘

Мы используем batched=True, так как обработка данных пакетами в Polars быстрее, чем построчная. Также можно использовать batch_size= в map(), чтобы задать размер каждого df.

Это также работает для IterableDataset.map() и IterableDataset.filter().

Пример: извлечение данных

В Polars доступно множество функций для любых типов данных: строки, числа с плавающей точкой, целые числа и т. д. Полный список можно найти здесь. Эти функции написаны на Rust и работают с батчами данных, что обеспечивает быструю обработку данных.

Вот пример, демонстрирующий ускорение в 5 раз при использовании Polars вместо обычной функции Python для извлечения решений из набора данных рассуждений LLM:

from datasets import load_dataset

ds = load_dataset("ServiceNow-AI/R1-Distill-SFT", "v0", split="train")

# Using a regular python function
pattern = re.compile("boxed\\{(.*)\\}")
result_ds = ds.map(lambda x: {"value_solution": m.group(1) if (m:=pattern.search(x["solution"])) else None})
# Time: 10s

# Using a Polars function
expr = pl.col("solution").str.extract("boxed\\{(.*)\\}").alias("value_solution")
result_ds = ds.with_format("polars").map(lambda df: df.with_columns(expr), batched=True)
# Time: 2s

Импорт или экспорт из Polars

Чтобы импортировать данные из Polars, можно использовать Dataset.from_polars():

ds = Dataset.from_polars(df)

А также можно использовать Dataset.to_polars() для экспорта Dataset в DataFrame Polars:

df = Dataset.to_polars(ds)
Update on GitHub