Modül 8 · Toplu İşleme (Batch) · ⏱ 7 dk

DataFrame ile ilk batch job

First batch job

Bu derste neler öğreneceksin

  • groupBy join agg kullanır
  • Polars (varsayılan) ile sorgu yazar
  • Pandas tan Polars a geçiş yapar

Gece Yarısı Raporu: “Bu Ay En Çok Ne Satıldı?”

Elif’in limonatası artık 3 şubede. Her gece yarısı, patron Elif’ten bir rapor istiyor: “Bu ay en çok hangi içecek satıldı? Hangi şubede? Hangi günler en çok müşteri geldi?”

Elif’in bilgisayarı uyurken bu raporu kendisi hazırlıyor — tüm günün verisini alıyor, grupluyor, topluyor, yazıcıya gönderiyor. Buna batch iş deniyor: “Biriktir, uyku vakti gelince toplu işle”.

Bugün biz de Elif gibi bir batch iş yazacağız. Aracımız: Polars.

Polars: Pandas’ın Hızlı Kuzeni

Python’da tablo işlemek için yıllardır Pandas kullanılıyordu. Pandas yavaş ama herkes biliyor. Yeni nesil arkadaşı Polars çok daha hızlı (genelde 5-30 kat) ve modern bilgisayarların gücünü tam kullanıyor.

Bu kursta Polars varsayılan. Pandas’ı sadece eski kod okumak için bilmen yeterli.

pip install polars

Veriyi Yükle

Elif’in günlük sipariş dosyalarını içeri alalım:

import polars as pl

# Günlük siparişler (CSV)
siparisler = pl.read_csv("siparisler_2026_06.csv")

# Müşteriler tablosu (parquet)
musteriler = pl.read_parquet("musteriler.parquet")

print(siparisler.head())

Çıktı:

shape: (5, 4)
┌────────┬─────────┬───────┬────────────┐
│ musteri┆ icecek  ┆ fiyat ┆ tarih      │
│ ---    ┆ ---     ┆ ---   ┆ ---        │
│ str    ┆ str     ┆ f64   ┆ date       │
╞════════╪═════════╪═══════╪════════════╡
│ Ayşe   ┆ Limonata┆ 25.0  ┆ 2026-06-01 │
│ Mehmet ┆ Nane    ┆ 30.0  ┆ 2026-06-01 │
│ Zeynep ┆ Çilek   ┆ 35.0  ┆ 2026-06-01 │
│ Ali    ┆ Klasik  ┆ 25.0  ┆ 2026-06-02 │
│ Elif   ┆ Buzlu   ┆ 28.0  ┆ 2026-06-02 │
└────────┴─────────┴───────┴────────────┘

100.000 satır olsa bile Polars bunu bir saniyenin altında okur.

groupBy: Hangi İçecek Kaç Kere?

“En çok hangi içecek satıldı?” sorusunun cevabı:

satis_ozet = (
    siparisler
    .group_by("icecek")
    .agg([
        pl.count().alias("adet"),
        pl.col("fiyat").sum().alias("toplam_gelir"),
    ])
    .sort("adet", descending=True)
)
print(satis_ozet)

Çıktı:

shape: (3, 3)
┌─────────────┬──────┬──────────────┐
│ icecek      ┆ adet ┆ toplam_gelir │
│ ---         ┆ ---  ┆ ---          │
│ str         ┆ u32  ┆ f64          │
╞═════════════╪══════╪══════════════╡
│ Limonata    ┆ 412  ┆ 10300.0      │
│ Nane Limon. ┆ 298  ┆ 8940.0       │
│ Çilekli Lim.┆ 187  ┆ 6545.0       │
└─────────────┴──────┴──────────────┘

Elif: “Vay, klasik limonata hâlâ şampiyon!“

join: İki Tabloyu Birleştir

Elif ayrıca her müşterinin şubesini de tutuyor. Hangi şubede en çok ne satılmış görmek için iki tabloyu birleştirmemiz lazım:

sube_dagilim = (
    siparisler
    .join(musteriler, on="musterteri", how="left")  # musteriler tablosundan sube bilgisi
    .group_by(["sube", "icecek"])
    .agg(pl.count().alias("adet"))
    .sort(["sube", "adet"], descending=[False, True])
)
print(sube_dagilim)

join tıpkı iki defteri yan yana koyup aynı isme göre eşleştirmek gibi: “Ayşe sipariş verdi → Ayşe’nin şu bilgisi var → birleştir”.

agg: Birden Fazla Hesap Tek Seferde

agg kısmı süper güçlü: aynı anda ortalama, toplam, sayı, en büyük hepsini isteyebilirsin:

gunluk_ozet = (
    siparisler
    .group_by("tarih")
    .agg([
        pl.count().alias("siparis_sayisi"),
        pl.col("fiyat").sum().alias("gunluk_ciro"),
        pl.col("fiyat").mean().alias("ortalama_siparis"),
        pl.col("fiyat").max().alias("en_pahali"),
    ])
    .sort("tarih")
)
print(gunluk_ozet)

Çıktı:

shape: (3, 5)
┌────────────┬───────────────┬──────────────┬──────────────────┬────────────┐
│ tarih      ┆ siparis_sayisi┆ gunluk_ciro  ┆ ortalama_siparis ┆ en_pahali  │
│ ---        ┆ ---           ┆ ---          ┆ ---              ┆ ---        │
│ date       ┆ u32           ┆ f64          ┆ f64              ┆ f64        │
╞════════════╪═══════════════╪══════════════╪══════════════════╪════════════╡
│ 2026-06-01 ┆ 78            ┆ 2145.0       ┆ 27.5             ┆ 35.0       │
│ 2026-06-02 ┆ 92            ┆ 2580.0       ┆ 28.04            ┆ 35.0       │
│ 2026-06-03 ┆ 81            ┆ 2243.0       ┆ 27.69            ┆ 35.0       │
└────────────┴───────────────┴──────────────┴──────────────────┴────────────┘

Pandas’tan Polars’a Geçiş

Daha önce Pandas öğrendiysen, endişelenme: Polars’a geçiş çok kolay. Sadece bazı kelimeler değişik:

PandasPolars
df.groupby("icecek")df.group_by("icecek") (underscore)
df["fiyat"].sum()pl.col("fiyat").sum()
len(df)pl.count() veya df.height
df.merge(other, on="id")df.join(other, on="id")

Eğer elinde eski Pandas kodun varsa ve Polars’a çevirmek istersen, pyarrow üzerinden taşıyabilirsin:

import polars as pl
pdf = pd.read_csv("eski.csv")           # Pandas okur
df = pl.from_pandas(pdf)                # Polars'a çevir

Ama yeni kod yazıyorsan doğrudan Polars başla!

Batch İşi Kaydet

Sonuçları bir rapor dosyasına yazmak için:

satis_ozet.write_csv("rapor_2026_06.csv")
satis_ozet.write_parquet("rapor_2026_06.parquet")

Parquet formatı küçük ve hızlı, tıpkı bir dosyayı ZIP’lemek gibi. Elif’in patronu bu dosyayı her sabah mail olarak alacak.

Özet

Bugün öğrendik:

  • Batch iş = veriyi topla, uyku saatinde toplu işle.
  • Polars = Pandas’ın modern, hızlı kuzeni.
  • group_by: aynı değere sahip satırları birleştir.
  • join: iki tabloyu ortak sütundan eşleştir.
  • agg: birden çok özet istatistiği tek seferde hesapla.

Küçük Ödev

  1. Yukarıdaki kodu kendi CSV dosyanda çalıştır (ya da 5 satırlık bir örnek dosya oluştur).
  2. group_by("icecek") yerine group_by("tarih") dene. Tarihe göre nasıl değişiyor satışlar?
  3. Bir cümle yaz: “Pandas yerine Polars kullanmanın iki avantajı ne?”

Sıradaki

Batch işi yazdın. Şimdi bunu bulutta nasıl çalıştırırız öğreniyoruz →