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:
| Pandas | Polars |
|---|---|
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
- Yukarıdaki kodu kendi CSV dosyanda çalıştır (ya da 5 satırlık bir örnek dosya oluştur).
group_by("icecek")yerinegroup_by("tarih")dene. Tarihe göre nasıl değişiyor satışlar?- 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 →