Datasets documentation
Polars ile Kullanım
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: 2sPolars'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)