Python Programming

Python'da Pandas ve NumPy ile Veri Analizini Ustalaşma: Kapsamlı Bir Rehber

Moderen veri dünyasında Python, veri biliminin evrensel dili (lingua franca) olarak yerini sağlamlaştırmıştır. Bu ekosistemin kalbinde iki güçlü kütüphane yer alır: NumPy ve Pandas. Başlangıç seviyesinde sıklıkla birbirinin yerine kullanılsa da, bu kütüphaneler farklı ama birbirini tamamlayan amaçlar için tasarlanmıştır. NumPy, temel düşük seviye dizi işlemlerini sağlar; Pandas ise bunun üzerine inşa edilerek yapılandırılmış veri manipülasyonu için yüksek seviyeli, sezgisel veri yapıları sunar. Bu yazı, orta ve ileri düzey geliştiriciler için bu araçları etkili bir şekilde kullanmaya odaklanmaktadır.

Temel Mimarının Anlaşılması

Analiz kodunun tek bir satırını bile yazmadan önce, arka planda neler olduğunu anlamak kritik öneme sahiptir. NumPy (Numerical Python), büyük, çok boyutlu diziler ve matrisler üzerinde hızlı ve verimli hesaplamalar yapmaya odaklanır. Aynı türden öğeleri bellekte bitişik bir blokta saklayan ndarray nesnesini tanıtır; bu da standart Python döngülerine kıyasla önemli ölçüde daha hızlı olan vektörleştirilmiş işlemlere olanak tanır.

Pandas ise tam tersine, veri temizleme ve düzenleme (data wrangling) için tasarlanmıştır. İki temel veri yapısı sunar: Series (1 boyutlu) ve DataFrame (2 boyutlu). Bir DataFrame, temelde sütunların farklı veri tiplerini içerebildiği bir elektronik tablo benzeri yapıdır. Pandas, NumPy'nin üzerine inşa edilmiştir; yani arka planda birçok Pandas işlemi, optimize edilmiş NumPy çağrılarından başka bir şey değildir. Bu ilişkiyi anlamak, geliştiricilerin NumPy'nin ham hızı ile Pandas'ın kolaylığı arasında ne zaman hangisini kullanmaları gerektiğini bilerek daha performanslı kod yazmalarını sağlar.

Temel Veri Manipülasyon Teknikleri

Orta düzey geliştiriciler için değer, veriyi sadece yüklemek değil, onu verimli bir şekilde dönüştürmekte yatar. Yaygın görevler arasında filtreleme, gruplama ve eksik veri yönetimi yer alır. Simüle edilmiş bir satış veriseti içeren pratik bir örneğe bakalım.

İlk olarak, sayısal yoğunluk için NumPy ve ardından yapılandırma için Pandas kullanarak bir veri seti oluşturuyoruz:

import pandas as pd
import numpy as np

# Rastgele satış figürleri içeren bir veri seti simülasyonu
np.random.seed(42)
data = {
    'product': ['A', 'B', 'C', 'A', 'B', 'C'],
    'region': ['North', 'South', 'North', 'South', 'North', 'South'],
    'sales': np.random.randint(100, 1000, size=6),
    'date': pd.date_range('2023-01-01', periods=6, freq='D')
}

df = pd.DataFrame(data)
print("Orijinal DataFrame:")
print(df)

Veri yüklendikten sonra filtreleme basit hale gelir. 'Kuzey' bölgesindeki 500 birimi aşan tüm satışları bulmak için boolean indeksleme kullanabiliriz:

# Veri filtreleme
filtered_df = df[(df['region'] == 'North') & (df['sales'] > 500)]
print("\nFiltrelenmiş Veri:")
print(filtered_df)

Gruplama işlemleri, Pandas'ın gerçekten parladığı yerdir. Diyelim ki ürün başına ortalama satışları hesaplamak istiyoruz. groupby metodunu kullanarak bunu tek bir satırda gerçekleştirebiliriz:

# Toplu işlem (Aggregation)
summary = df.groupby('product')['sales'].mean()
print("\nÜrün Başına Ortalama Satışlar:")
print(summary)

Vektörleştirme ile Performans Optimizasyonu

Standart Python'dan geçiş yapan geliştiriciler için yaygın bir hata, veri dönüşümleri için açık döngüler kullanmaktır. Bu yaklaşım yavaştır ve Pythonik değildir. Bunun yerine, NumPy ve Pandas tarafından sağlanan vektörleştirilmiş işlemleri her zaman kullanın.

Karmaşık bir matematiksel fonksiyonu bir sütuna uygulamak durumunda olduğunuz bir senaryoyu düşünün. Mutlaka gerekli olmadıkça, Python döngüsüne geri döndüğü için apply() ile özel bir Python fonksiyonu kullanmaktan kaçının. Bunun yerine, C dilinde implemente edilmiş yerleşik NumPy fonksiyonlarını kullanın:

# Verimsiz: Lambda ile apply kullanımı
# df['sales_normalized'] = df['sales'].apply(lambda x: np.log1p(x))

# Verimli: Vektörleştirilmiş NumPy işlemi
df['sales_normalized'] = np.log1p(df['sales'])

Hesaplamayı C seviyesindeki dizilere indirgeyerek, özellikle milyonlarca satır içeren veri setleriyle çalışırken, yürütme süresinde büyük ölçüde (birim farkında) iyileşmeler görebilirsiniz.

Eksik Veri ve Tür Dönüşümünün Yönetimi

Gerçek dünya verileri nadiren temizdir. Pandas, NaN (Sayı Değil) değerlerini yönetmek için sağlam yöntemler sunar. Geliştiriciler, eksik kayıtları kaldırmak için dropna() ve ortalama, medyan veya ileriye doğru doldurma (forward-fill) yöntemleriyle eksik değerleri tamamlamak için fillna() yöntemlerine aşina olmalıdır.

Ayrıca, doğru veri tiplerinin sağlanması bellek verimliliği açısından kritiktir. df.info() kullanarak bellek kullanımını inceleyebilirsiniz. Kategorik dizeleri category veri tipine dönüştürmek veya standart kayan noktalı sayılar yerine Int64 nullable (boş bırakılabilir) tamsayılar kullanmak, DataFrame'lerinizin bellek kullanımını önemli ölçüde azaltabilir.

Sonuç

Pandas ve NumPy'yi ustalaşmak, temel veri yüklemekten sofistike, optimize edilmiş veri boru hatlarına uzanan bir yolculuktur. NumPy'nin dizi yayılımı (array broadcasting) ve Pandas'ın indeks tabanlı hizalamasının arkasındaki mimariyi anlamak, geliştiricilerin hem okunabilir hem de performanslı kod yazmasını sağlar. Veri bilimi yolculuğunuzda ilerledikçe, kodunuzu her zaman profilleyin, döngüler yerine vektörleştirilmiş işlemleri tercih edin ve bu temel kütüphanelerin üzerine inşa edilen zengin uzantı ekosisteminden yararlanın.

Share: