Parçalar Arası Artımlı Toplulaştırma
Dosyanın tamamını bellekte saklamadan parçalar arasındaki çalışan sayımları, toplamları ve minimum/maksimum değerleri biriktirin.
Parçalar Arası Artımlı Toplulaştırma, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Pandas & NumPy Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
Neden Artımlı Toplama?
Artımlı toplama, hesaplamayı birden çok makineye dağıtmadan RAM'den büyük veri kümelerini analiz etmenin anahtarıdır. Son istatistiği hesaplamak için tüm verileri yüklemek yerine çalışan biriktiricileri (kısmi toplamlar, sayımlar, minimum/maksimum değerler) korur ve bunları her parçayla güncellersiniz. Dosyanın tamamı tarandıktan sonra son sonuç, bu hafif biriktiricilerden oluşturulur. Bu kalıp, tek bir dizüstü bilgisayarda terabaytlarca büyüklükteki dosyalara ölçeklenebilir.
Satırları Sayma ve Ortalamayı Hesaplama
Parçalar genelindeki ortalama değeri hesaplamak için çalışan toplamı ve sayımı ayrı ayrı takip etmek gerekir. Parçaların boyutları farklı olabileceğinden, parça başına ortalamaların ortalamasını doğrudan alamazsınız. Doğru formül total_sum / total_count şeklindedir. Bu kalıp, bileşenlerine ayrılabilen her niceliğe uygulanabilir: varyans, korelasyon ve histogramların tümünün artımlı formülleri vardır.
import pandas as pd
total_sum = 0.0
total_count = 0
for chunk in pd.read_csv('transactions.csv', chunksize=100000):
total_sum += chunk['amount'].sum()
total_count += chunk['amount'].notna().sum()
grand_mean = total_sum / total_count
print(f'Rows processed: {total_count:,}')
print(f'Grand mean: {grand_mean:.4f}')Artımlı Minimum ve Maksimum
Parçalar genelindeki küresel minimum ve maksimum değerleri takip etmek basittir: Python'daki float('inf') ve float('-inf') değerleriyle başlatın, ardından her parçanın min/max değerleriyle güncelleyin. Bu yöntem, ara verilerin saklanmasını önler. Grup tanımlayıcısına göre anahtarlanmış bir sözlük tutarak aynı kalıp grup başına min/max değerlerine de genellenebilir.
import pandas as pd
global_min = float('inf')
global_max = float('-inf')
for chunk in pd.read_csv('prices.csv', chunksize=50000):
chunk_min = chunk['price'].min()
chunk_max = chunk['price'].max()
if chunk_min < global_min:
global_min = chunk_min
if chunk_max > global_max:
global_max = chunk_max
print(f'Price range: {global_min} to {global_max}')Artımlı Sıklık Sayımları
Kategorik sütunlar için, her parçanın value_counts() sonucunu bir Pandas Series biriktiricisine ekleyerek çalışan bir sıklık sözlüğü tutun. Pandas Series toplaması dizin etiketlerini hizaladığından, sonraki parçalarda görülen bilinmeyen kategoriler otomatik olarak dahil edilir. Tüm parçalardan sonra, veri kümesinin tamamındaki en sık kategorileri görmek için sayıya göre sıralayın.
import pandas as pd
freq = pd.Series(dtype='int64')
for chunk in pd.read_csv('orders.csv',
chunksize=100000,
usecols=['category']):
chunk_counts = chunk['category'].value_counts()
freq = freq.add(chunk_counts, fill_value=0)
# Final sorted frequency table
print(freq.sort_values(ascending=False).head(10))Artımlı GroupBy Toplaması
Parçalar genelinde groupby toplamı veya sayımı hesaplamak için her parça içinde groupby().agg() uygulayın ve ortaya çıkan Series veya DataFrame'i saklayın. Döngüden sonra tüm kısmi sonuçları birleştirin ve bunları bir araya getirmek için ikinci bir groupby uygulayın. Veriler gruplara göre değil tarihe göre sıralandığında sıkça görüldüğü gibi, birden çok parçada yer alan gruplar bu iki aşamalı yaklaşımla doğru biçimde işlenir.
import pandas as pd
partials = []
for chunk in pd.read_csv('sales.csv',
chunksize=100000,
usecols=['region', 'product', 'revenue']):
p = chunk.groupby(['region', 'product'])['revenue'].sum()
partials.append(p)
final = (
pd.concat(partials)
.groupby(level=['region', 'product'])
.sum()
.sort_values(ascending=False)
)
print(final.head(10))Varyansı Artımlı Olarak Hesaplama (Welford Yöntemi)
Parçalar genelinde varyansı hesaplamak, ortalamayı hesaplamaktan daha zordur. Basit E[X²] - E[X]² formülü, büyük ortalamalarda yıkıcı yuvarlama hatasına uğrar. Welford'un çevrimiçi algoritması, çalışan bir ortalamayı ve kareli sapmalar toplamını korur; her yeni değer geldiğinde bunları sayısal olarak kararlı bir biçimde günceller. SciPy bunu uygular; ancak bu kalıbı anlamak, yöntemi ağırlıklı varyans ve kovaryansa genişletmenizi sağlar.
import pandas as pd
import numpy as np
# Simple two-pass approach using stored chunk stats
chunk_stats = []
for chunk in pd.read_csv('data.csv',
chunksize=100000,
usecols=['value']):
n = chunk['value'].count()
mean = chunk['value'].mean()
var = chunk['value'].var(ddof=1)
chunk_stats.append((n, mean, var))
# Combine: use pooled variance formula
total_n = sum(s[0] for s in chunk_stats)
total_mean = sum(s[0]*s[1] for s in chunk_stats) / total_n
pooled_var = sum((s[0]-1)*s[2] + s[0]*(s[1]-total_mean)**2
for s in chunk_stats) / (total_n - 1)
print(f'Grand variance: {pooled_var:.4f}')Artımlı Histogram Oluşturma
RAM'e sığmayacak kadar büyük bir dosyada bir sütunun dağılımını hesaplamak için artımlı histogram gerekir. Bölme sınırlarını önceden belirleyin (küçük bir örneğe veya alan bilginize göre), ardından her parça içinde np.histogram(chunk_values, bins=edges) kullanarak sayımları biriktirin. Sonunda birleştirilmiş sayımları çubuk grafik olarak çizin. Kafka Streams ve Flink gibi akış sistemleri yaklaşık histogramları bu şekilde hesaplar.
import pandas as pd
import numpy as np
# Decide bin edges from a sample
sample = pd.read_csv('amounts.csv', nrows=5000)
bins = np.linspace(sample['amount'].min(),
sample['amount'].max(), 21)
counts = np.zeros(len(bins) - 1, dtype='int64')
for chunk in pd.read_csv('amounts.csv',
chunksize=100000,
usecols=['amount']):
chunk_counts, _ = np.histogram(
chunk['amount'].dropna(), bins=bins
)
counts += chunk_counts
print('Histogram counts:', counts[:5], '...')Benzersiz Değerleri Yaklaşık Olarak Takip Etme
Parçalar genelindeki tam farklı değer sayısını hesaplamak, tüm benzersiz değerlerin (potansiyel olarak milyonlarcasının) saklanmasını gerektirir. Büyük ölçekte yaklaşık sayımlar için Python'da hyperloglog kütüphanesi aracılığıyla kullanılabilen bir HyperLogLog özetini kullanın. Alternatif olarak, her parçadaki benzersiz değerleri bir kümeyle takip edip birleşimlerini alabilirsiniz; ancak bu yapı sınırsız biçimde büyür. Ucuz bir yaklaşık değer için her parçada pd.Series.nunique() kullanıp ortalamayı bildirin; bu kesin değildir, ancak veri profilleme için çoğu zaman yeterlidir.
import pandas as pd
unique_ids = set()
for chunk in pd.read_csv('events.csv',
chunksize=100000,
usecols=['user_id']):
unique_ids.update(chunk['user_id'].dropna().unique())
print(f'Distinct user IDs: {len(unique_ids):,}')
# Warning: the set may grow large for high-cardinality columnsUzun Çalıştırmalar Sırasında İlerleme Bildirimi
Birden çok gigabaytlık dosyayı işlemek dakikalar sürebilir. Veri işleme akışının çalıştığını bilmek ve kalan süreyi tahmin edebilmek için ilerleme bildirimi ekleyin. İşlenen baytları veya satırları sayın ve bunları dosya boyutuyla karşılaştırın. tqdm kütüphanesi, tqdm(reader) sarmalayıcısıyla bunu kolaylaştırır. tqdm olmadan bile her 10 parçada bir durum satırı yazdırmak, uzun toplu işlerde değerli geri bildirim sağlar.
import pandas as pd
import time
chunksize = 100000
start = time.time()
rows_processed = 0
for i, chunk in enumerate(pd.read_csv('big.csv',
chunksize=chunksize)):
rows_processed += len(chunk)
# Report every 10 chunks
if (i + 1) % 10 == 0:
elapsed = time.time() - start
rate = rows_processed / elapsed
print(f'Chunk {i+1}: {rows_processed:,} rows '
f'@ {rate/1000:.0f}k rows/sec')
print(f'Total: {rows_processed:,} rows in {time.time()-start:.1f}s')Toplama Öncesinde Filtreleme
İstenmeyen verilerin birikmesini önlemek için toplama işleminden önce filtreleri her parçanın içinde uygulayın. Örneğin yalnızca 2024 siparişleriyle ilgileniyorsanız, groupby işleminden önce parçanın tarih sütununu filtreleyin. Bu, kısmi sonuçlar için gereken belleği azaltır ve son birleştirme adımını hızlandırır. Filtreleri veri işleme akışında mümkün olduğunca erken uygulayın; bu, verimli veri işlemenin temel ilkelerinden biridir.
import pandas as pd
partials = []
for chunk in pd.read_csv('orders.csv',
chunksize=100000,
parse_dates=['order_date']):
# Filter early: only 2024 orders
mask = chunk['order_date'].dt.year == 2024
filtered = chunk.loc[mask, ['category', 'revenue']]
if len(filtered) > 0:
p = filtered.groupby('category')['revenue'].sum()
partials.append(p)
if partials:
result = pd.concat(partials).groupby(level=0).sum()
print(result)Ara Sonuçları Kaydetme
Çok uzun süren işler için, işlem kesintiye uğrarsa bir kontrol noktasından devam edebilmek üzere ara sonuçları düzenli aralıklarla kaydedin. Her N parçadan sonra parça başına toplama sonuçlarını bir Parquet veya CSV dosyasına yazın. İş 1000 parçanın 800. parçasında başarısız olursa, dosyanın tamamını yeniden işlemek yerine kaydedilmiş toplamaları yükleyip kaldığınız yerden devam edebilirsiniz. Bu dayanıklılık kalıbı, üretim veri işleme akışlarında vazgeçilmezdir.
import pandas as pd
import os
CHECKPOINT = 'checkpoint.csv'
running_total = 0.0
running_count = 0
# Resume from checkpoint if it exists
if os.path.exists(CHECKPOINT):
ckpt = pd.read_csv(CHECKPOINT)
running_total = ckpt['total'].iloc[0]
running_count = int(ckpt['count'].iloc[0])
print(f'Resuming from checkpoint: {running_count:,} rows')
for chunk in pd.read_csv('huge.csv', chunksize=100000):
running_total += chunk['value'].sum()
running_count += len(chunk)
# Save checkpoint
pd.DataFrame({'total': [running_total],
'count': [running_count]}).to_csv(CHECKPOINT, index=False)
print(f'Final mean: {running_total / running_count:.4f}')Hızlı Kontrol
Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: çalışan biriktiriciler (sum, count, min/max, sıklık Series'i) büyük dosyalarda sabit bellek kullanarak toplama yapmayı sağlar; iki aşamalı groupby (her parçada kısmi groupby, ardından concat ve yeniden gruplama) parçalar arasında bulunan grupları doğru biçimde işler; her parçada erken filtreleme biriktirme adımının maliyetini azaltır. Sırada, büyük veri kümelerinde Pandas'ın doğrudan kullanılabilen paralel alternatifi olarak Dask DataFrame'lerini inceleyeceğiz.
Sıkça Sorulan Sorular
“Parçalar Arası Artımlı Toplulaştırma” dersi ücretsiz mi?
Evet — “Parçalar Arası Artımlı Toplulaştırma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Pandas & NumPy Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Pandas & NumPy Academy kursu toplamda 4 dersten oluşur.
“Parçalar Arası Artımlı Toplulaştırma” dersinde ne öğreneceğim?
Dosyanın tamamını bellekte saklamadan parçalar arasındaki çalışan sayımları, toplamları ve minimum/maksimum değerleri biriktirin. Pandas & NumPy Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Pandas & NumPy Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Pandas & NumPy Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Parçalar Arası Artımlı Toplulaştırma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Pandas & NumPy Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Pandas & NumPy Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- chunksize ile CSV Akışı
- Parçalar Arası Artımlı Toplulaştırma
- Dask DataFrame'lerine Giriş
- Parquet: Hızlı Sütunlu Depolama