0Pricing
Pandas & NumPy Academy · Ders

pipe() ile Yöntem Zincirleme

Yerel Pandas yöntemlerinin yanında özel işlevleri zincirlemek için pipe() kullanarak okunabilir veri dönüşüm işlem hatları yazın.

pipe() ile Yöntem Zincirleme, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 4. 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.

Ara Değişkenlerle Çalışmanın Sorunu

pipe() içermeyen bir veri temizleme işlem hattında genellikle çok sayıda ara değişken birikir: df1 = clean(df), df2 = transform(df1), df3 = enrich(df2). Bu değişkenler ad alanını karmaşıklaştırır, hata ayıklamayı zorlaştırır ve geliştiricileri bunları yanlış biçimde yeniden kullanmaya yöneltir. Bunun sonucunda, dönüşümlerin sırası olarak yukarıdan aşağıya okunması zor bir kod ortaya çıkar.

import pandas as pd

df = pd.read_csv('orders.csv')

# Without pipe — intermediate variables everywhere
df1 = df.dropna(subset=['revenue'])
df2 = df1[df1['quantity'] > 0]
df3 = df2.assign(revenue_per_unit=df2['revenue'] / df2['quantity'])
print(df3.shape)

pipe() ile Tanışma

DataFrame.pipe(func), func(df) işlevini çağırır ve sonucu döndürür; böylece özel işlevleri, .dropna().query() gibi yerleşik Pandas yöntemlerini zincirlediğiniz biçimde zincirleyebilirsiniz. Temel yararı, her dönüşüm adımının soldan sağa (veya parantezlerle biçimlendirildiğinde yukarıdan aşağıya) açık ve okunabilir olması, yani işlem hattının mantıksal sırasını yansıtmasıdır.

def drop_nulls(df):
    return df.dropna(subset=['revenue'])

def filter_positive_qty(df):
    return df[df['quantity'] > 0]

def add_revenue_per_unit(df):
    return df.assign(revenue_per_unit=df['revenue'] / df['quantity'])

# With pipe — clean chain
df_clean = (df
    .pipe(drop_nulls)
    .pipe(filter_positive_qty)
    .pipe(add_revenue_per_unit)
)
print(df_clean.shape)

pipe() Üzerinden Bağımsız Değişken Geçirme

İşlev adından sonra anahtar kelime bağımsız değişkenleri kullanarak işlem hattındaki işleve ek bağımsız değişkenler geçirin: df.pipe(func, arg1=val1). İşlev imzası, ilk parametre olarak df'yi kabul etmelidir. Parametreli işlevler işlem hattını yapılandırılabilir kılar: İşlev gövdesini değiştirmeden yalnızca pipe çağrısının bağımsız değişkenlerini değiştirerek eşikleri, sütun adlarını veya davranışı değiştirebilirsiniz.

def filter_by_region(df, regions):
    return df[df['region'].isin(regions)]

def cap_revenue(df, upper):
    df = df.copy()
    df['revenue'] = df['revenue'].clip(upper=upper)
    return df

df_result = (df
    .pipe(filter_by_region, regions=['North', 'East'])
    .pipe(cap_revenue, upper=1000)
)
print(df_result.shape)

pipe() ile Yerleşik Yöntemleri Birlikte Kullanma

pipe()'ın gücü, aynı zincirde yerleşik Pandas yöntemleriyle sorunsuz biçimde bütünleşmesidir. .dropna(), .query(), .rename() ve .pipe(custom_func) işlemlerini istediğiniz sırayla bir arada kullanabilirsiniz. Bu, zinciri hem kısa (mümkün olduğunda yerleşik yöntemleri kullanır) hem de esnek (yerleşik yöntemlerin yetersiz kaldığı durumlarda özel işlevleri kullanır) kılar.

df_result = (
    df
    .dropna(subset=['revenue', 'order_date'])
    .query('quantity > 0')
    .rename(columns={'unit_price': 'price'})
    .pipe(add_revenue_per_unit)
    .reset_index(drop=True)
)
print(df_result.head())

pipe() Zincirinde Hata Ayıklama

Uzun bir zincirde hata ayıklamak zor olabilir; çünkü ortasına bir yazdırma ifadesi ekleyerek ara durumları inceleyemezsiniz. Çözümlerden biri, biçim ve sütun bilgilerini yazdırdıktan sonra DataFrame'i değiştirmeden döndüren bir iletici hata ayıklama işlevi yazmaktır. Zinciri bozmadan o adımdaki durumu incelemek için bu işlevi zincirin herhangi bir noktasına ekleyin.

def debug(df, label=''):
    print(f'[{label}] shape: {df.shape}')
    print(f'[{label}] columns: {df.columns.tolist()}')
    return df

df_result = (
    df
    .pipe(drop_nulls)
    .pipe(debug, label='after drop_nulls')
    .pipe(filter_positive_qty)
    .pipe(debug, label='after filter')
)
print('Done')

Tam Bir Temizleme İşlem Hattısı Oluşturma

Tüm temizleme adımlarını pipe() kullanarak tek bir işlem hattı işlevinde birleştirin. Zinciri clean_pipeline(df) adlı bir işlevin içine almak, işlem hattının bir bütün olarak test edilebilmesini sağlar. Bu işlevi ham bir DataFrame ile çağırıp temiz bir tane elde edebilirsiniz. Bu yaklaşım, üretim veri mühendisliğinde kullanılan ETL (Çıkar, Dönüştür, Yükle) paradigmasıyla uyumludur.

def clean_pipeline(df):
    return (
        df
        .dropna(subset=['order_id', 'revenue'])
        .drop_duplicates(subset=['order_id'])
        .query('quantity > 0 and revenue >= 0')
        .pipe(add_revenue_per_unit)
        .reset_index(drop=True)
    )

df_clean = clean_pipeline(df)
print('Clean rows:', len(df_clean))

pipe() ve apply(): Temel Farklar

pipe(func), DataFrame'in tamamını func'a geçirir ve karşılığında bir DataFrame (veya dönüştürülmüş bir nesne) bekler. apply(func, axis=1) ise her seferinde bir satır geçirir. Biçimi koruyan (veya biçimi bilinçli olarak değiştiren) tüm DataFrame dönüşümleri için pipe(), satır ya da sütun düzeyindeki hesaplamalar için apply() kullanın. Bunlar birbirinin rakibi değil, birbirini tamamlayan araçlardır.

# pipe: receives the whole DataFrame
def scale_revenue(df, factor=1.0):
    df = df.copy()
    df['revenue'] = df['revenue'] * factor
    return df

# apply: receives one row at a time
df['revenue_x2'] = df.apply(lambda row: row['revenue'] * 2, axis=1)

df_scaled = df.pipe(scale_revenue, factor=1.1)
print('pipe scales all rows at once; apply does row-by-row')

Yeniden Kullanılabilir İşlem Hattı Bileşenleri

Her işlem hattı adımını salt bir işlev olarak yazın — genel durum kullanmamalı, bir DataFrame almalı ve bir DataFrame döndürmelidir. Salt işlevlerin birim testleri kolaydır: küçük bir test DataFrame'i ile çağırıp çıktı biçimini ve sütun değerlerini doğrulayabilirsiniz. Test edilmiş, yeniden kullanılabilir işlem hattı işlevlerinden oluşan bir kütüphane, benzer temizleme gereksinimlerini paylaşan yeni veri kümelerinin analizini büyük ölçüde hızlandırır.

def normalise_strings(df, cols):
    df = df.copy()
    for col in cols:
        df[col] = df[col].str.strip().str.lower()
    return df

def parse_dates(df, cols):
    df = df.copy()
    for col in cols:
        df[col] = pd.to_datetime(df[col])
    return df

df_result = (
    df
    .pipe(normalise_strings, cols=['region', 'category'])
    .pipe(parse_dates, cols=['order_date'])
)
print(df_result.dtypes)

pipe() ile İşlem Hattı Adımlarını Günlüğe Kaydetme

Üretimdeki her dönüşümü denetleyebilmek için her işlem hattı işlevinin içine yapılandırılmış günlük kaydı ekleyin. Girdi satırı sayısını, çıktı satırı sayısını ve ilgili istatistikleri (ör. bir filtre tarafından elenen satırları) dahil edin. Bu, temel denetim kayıtları için harici bir iş akışı düzenleyicisine ihtiyaç duymadan her işlem hattı çalıştırmasının eksiksiz izini sağlar.

import logging
logging.basicConfig(level=logging.INFO)

def logged_dropna(df, subset):
    before = len(df)
    df = df.dropna(subset=subset)
    after = len(df)
    logging.info(f'dropna: {before - after} rows removed, {after} remaining')
    return df

df_clean = df.pipe(logged_dropna, subset=['revenue'])
print('Logged pipeline complete.')

İşlem Hattında Koşullu Adımlar

Bazen bir temizleme adımı yalnızca bir bayrağa veya verilerin içeriğine bağlı olarak çalışmalıdır. Bir özdeşlik ya da dönüşüm işlevi ekleyerek pipe zincirine koşullu adımlar ekleyebilirsiniz: Bu işlev bir koşulu denetler ve ya dönüşümü uygular ya da DataFrame'i değiştirmeden döndürür. Böylece isteğe bağlı adımları desteklerken zincirin yapısını korursunuz.

def maybe_cap_revenue(df, cap=None):
    if cap is None:
        return df
    df = df.copy()
    df['revenue'] = df['revenue'].clip(upper=cap)
    return df

CAPPING_ENABLED = True
CAP_VALUE = 1000 if CAPPING_ENABLED else None

df_result = df.pipe(maybe_cap_revenue, cap=CAP_VALUE)
print('Conditional step applied:', CAPPING_ENABLED)

İşlem Hattı Sonucunu Dışa Aktarma

Bir pipe() zincirindeki son adım çoğunlukla dışa aktarmadır. pipe() kullanarak özel bir dışa aktarma işlevini zincire ekleyebilir veya zincirin ardından Pandas'ın yerel dışa aktarma yöntemini doğrudan çağırabilirsiniz. Bir pipe(save_to_parquet) adımı kullanmak, dışa aktarma bölümünü zincirin belgelenmiş bir parçası olarak tutar ve bunun her zaman ara sürüm yerine son temizlenmiş DataFrame üzerinde çalışmasını sağlar.

def save_parquet(df, path):
    df.to_parquet(path, index=False)
    print(f'Saved {len(df)} rows to {path}')
    return df  # return df so the chain can continue if needed

df_final = (
    df
    .pipe(clean_pipeline)
    .pipe(save_parquet, path='orders_final.parquet')
)
print('Pipeline complete.')

Kısa Kontrol

Bu dersteki Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.

Ders Özeti

Bu derste şunları öğrendiniz: özel işlevleri yerel Pandas yöntemleriyle zincirlemek için pipe() kullanmayı, yeniden kullanılabilir, parametreleştirilebilir ve test edilebilir zincir adımlarını saf işlevler olarak oluşturmayı ve bir pipe zincirine hata ayıklama günlükleri ile koşullu adımlar eklemeyi. Sırada, dönüşüm adımlarını üretim ETL işlem hattı için işlevler olarak yapılandırmayı ele alacağız.

Sıkça Sorulan Sorular

“pipe() ile Yöntem Zincirleme” dersi ücretsiz mi?

Evet — “pipe() ile Yöntem Zincirleme” 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.

“pipe() ile Yöntem Zincirleme” dersinde ne öğreneceğim?

Yerel Pandas yöntemlerinin yanında özel işlevleri zincirlemek için pipe() kullanarak okunabilir veri dönüşüm işlem hatları yazın. 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 4. dersidir.

“pipe() ile Yöntem Zincirleme” 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

  1. Sütunlar ve Satırlarda apply()
  2. GroupBy ile apply()
  3. Öğe Bazlı İşlemler için map() ve applymap()
  4. pipe() ile Yöntem Zincirleme
← Pandas & NumPy Academy Sayfasına Dön