Datasets documentation

Polars ile Kullanım

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Polars ile Kullanım

Bu belge, datasets kütüphanesinin Polars ile kullanımına hızlı bir giriş niteliğindedir; odak noktası, veri kümelerini Polars işlevleri ile işleme ve bir veri kümesini Polars'a dönüştürme veya Polars'tan alma konusudur.

Bu özellikle faydalıdır, çünkü hem datasets hem de Polars altta Arrow kullandığı için hızlı sıfır kopyalama işlemlerine olanak tanır.

Veri seti biçimi

Varsayılan olarak veri kümeleri, tamsayılar, ondalık sayılar, dizeler, listeler gibi standart Python nesneleri döndürür.

Bunun yerine Polars DataFrames veya Series almak için, veri setinin biçimini Dataset.with_format() kullanarak polars olarak ayarlayabilirsiniz:

>>> 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"
]

Bu, örneğin load_dataset(..., streaming=True) kullanılarak elde edilen IterableDataset nesneleri için de geçerlidir:

>>> 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   │
└───────┴───────┘

Verileri işleyin

Polars işlevleri genel olarak elle yazılmış standart python işlevlerinden daha hızlıdır ve bu nedenle veri işleme süreçlerini optimize etmek için iyi bir seçenektir. Bir veri setini Dataset.map() veya Dataset.filter() içinde işlemek için Polars işlevlerini kullanabilirsiniz:

>>> 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   │
└───────┴───────┴───────┘

Polars'ta veri satır satır işlemek yerine toplu (batch) işlemek daha hızlı olduğu için batched=True kullanıyoruz. Ayrıca map() içinde batch_size= parametresini kullanarak her bir df'in boyutunu ayarlamak da mümkündür.

Bu, IterableDataset.map() ve IterableDataset.filter() için de geçerlidir.

Örnek: veri çıkarımı

Polars'ta her veri tipi için birçok işlev mevcuttur: string, float, tamsayı vb. Tam listeyi burada bulabilirsiniz. Bu işlevler Rust ile yazılmıştır ve veri toplulukları üzerinde çalışarak hızlı veri işleme imkânı sağlar.

Aşağıdaki örnek, bir LLM akıl yürütme veri setinden çözümleri çıkarmak için standart bir python fonksiyonu yerine Polars kullanıldığında elde edilen 5 kat hızlanmayı göstermektedir:

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'tan İçe Aktarma veya Dışa Aktarma

Polars'tan veri içe aktarmak için Dataset.from_polars() kullanabilirsiniz:

ds = Dataset.from_polars(df)

Ve bir Dataset'i Polars DataFrame olarak dışa aktarmak için Dataset.to_polars() kullanabilirsiniz:

df = Dataset.to_polars(ds)
Update on GitHub