İşlem Hattı Adımlarını Assertion'larla Test Etme
Hataların hemen ortaya çıkması için her aşamaya satır sayısı denetimleri, boş değer assertion'ları ve beklenen sütun korumaları ekleyin.
İşlem Hattı Adımlarını Assertion'larla Test Etme, CoddyKit'te ücretsiz bir Pandas & NumPy Academy dersidir. Bu, 4 dersinin 3. 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.
İşlem Hattı Adımları Neden Test Edilir?
Hatasız çalışan bir veri işlem hattı yine de fark edilmeden yanlış çıktı üretebilir: yanlış filtre nedeniyle elenen satırlar, yanlış katsayıyla çarpılan bir sütun veya birleştirme anahtarı benzersiz olmadığı için satırları çoğaltan bir birleştirme. Bu sessiz hataları yakalamanın tek yolu, işlem hattının her aşamasında verinin beklenen özelliklerini doğrulayan doğrulamalar yerleştirmektir. Doğrulamalar, mantıksal hataları yüksek sesle bildirilen ve hemen görünür olan hatalara dönüştürür.
import pandas as pd
import numpy as np
# A transform that looks correct but has a bug:
def compute_revenue_buggy(df):
# BUG: unit_price should be multiplied, not added
df['revenue'] = df['quantity'] + df['unit_price']
return df
# Without assertions, this runs silently with wrong numbers.Satır Sayısı Denetimleri
Her filtreleme adımından sonra, elde edilen satır sayısının beklenen aralıkta olduğunu doğrulayın. Çok az satır, filtrenin gereğinden fazla kısıtlayıcı olduğu; çok fazla satır ise birleştirmenin kayıtları çoğalttığı anlamına gelir. Beklenen aralığı girdinin bir oranı olarak ifade edin: Örneğin, geçerli verilerde null değerleri kaldıran bir adım satırların %30'undan fazlasını hiçbir zaman silmemelidir. Bu koruma, üst kaynaklardaki beklenmeyen veri kalitesi değişikliklerini yakalar.
def drop_nulls_guarded(df, required_cols, max_drop_fraction=0.3):
before = len(df)
result = df.dropna(subset=required_cols)
after = len(result)
drop_fraction = (before - after) / before
assert drop_fraction <= max_drop_fraction, \
f'dropna removed {drop_fraction:.1%} of rows (limit {max_drop_fraction:.1%})'
return resultSütun Varlığı Denetimleri
Her dönüştürme işlevinden sonra beklenen tüm çıktı sütunlarının mevcut olduğunu doğrulayın. Yeniden adlandırma adımında yanlışlıkla yanlış anahtar kullanılırsa ortaya çıkan sütun eksik olur ve hata, başka bir adım bu sütunu kullanmaya çalıştığında çok daha sonra ortaya çıkar. Dönüştürmeden hemen sonra yapılan bir doğrulama, sorunu üç adım sonra kafa karıştırıcı bir KeyError ile karşılaşmak yerine kaynağında yakalar.
def compute_revenue(df):
df = df.assign(revenue=lambda d: d['quantity'] * d['unit_price'])
# Guard: check that the new column exists and is non-null
assert 'revenue' in df.columns, 'revenue column not created'
assert df['revenue'].notna().all(), 'revenue has unexpected NaNs'
return dfDeğer Aralığı Doğrulamaları
Bir gelir sütunu hesapladıktan sonra, değerlerin negatif olmadığını doğrulayın. Tarihleri ayrıştırdıktan sonra, beklenen yıl aralığına düştüklerini doğrulayın. Kategorileri kodladıktan sonra beklenmeyen kodların bulunmadığını doğrulayın. Her doğrulama, beklenen davranışı belgeleyen ve ihlalleri erkenden yakalayan bir veri sözleşmesidir. Bunları print ifadeleri yerine doğrulama ifadeleri olarak yazın; böylece otomatik pipeline çalıştırmalarında hataları yükseltirler.
def validate_computed_columns(df):
assert (df['revenue'] >= 0).all(), \
f'Negative revenue: {df[df["revenue"] < 0]["revenue"].head().tolist()}'
assert (df['quantity'] > 0).all(), \
'Non-positive quantity found'
assert df['revenue'].between(0, 1_000_000).all(), \
'Revenue out of plausible range'
print('Value range checks passed.')Birleştirmelerden Sonra Yinelemeyi Önleme Koruması
Yaygın bir veri hatası, satırları yanlışlıkla çoğaltan çoktan çoğa birleştirmedir. Her pd.merge() işleminden sonra satır sayısının beklenen düzeyde olduğunu, genellikle sol birleştirmede sol DataFrame'in satır sayısını aşmadığını doğrulayın. Ayrıca anahtar sütunun benzersiz olması gerekiyorsa benzersiz olduğunu da doğrulayın; böylece yanlışlıkla yapılan çapraz birleştirmeleri hemen yakalayabilirsiniz.
def safe_merge(left, right, on, how='left'):
before = len(left)
result = left.merge(right, on=on, how=how)
after = len(result)
if how == 'left':
assert after == before, \
f'Left join increased rows from {before} to {after} — check key uniqueness in right df'
return resultKritik Adımlardan Sonra Null Doğrulaması
Bazı sütunlar pipeline'ın hiçbir noktasında null olmamalıdır. Null değerleri yanlışlıkla oluşturabilecek her adımdan sonra df['key_col'].notna().all() ifadesini doğrulayın. Buna bazı satırlarla eşleşemeyen ve birleştirilen sütunlarda NaN üreten bir birleştirme ya da eşleşmeyen değerler için NaN döndüren bir map() çağrısı örnek verilebilir. Bu sütunlara dokunan her dönüştürme işlevinin son iki satırını bu doğrulamalar olacak şekilde yazın.
NOT_NULL_AFTER_TRANSFORM = ['order_id', 'revenue', 'category']
def post_transform_checks(df):
for col in NOT_NULL_AFTER_TRANSFORM:
null_count = df[col].isna().sum()
assert null_count == 0, \
f'{col}: {null_count} unexpected NaN values after transform'
print('Null checks passed.')
return dfPipeline Adımları İçin Bir Test Paketi Oluşturma
Test edilen mantığı yalıtan, elle hazırlanmış küçük DataFrames kullanarak her pipeline işlevi için birim testleri yazın. Her test şunları yapmalıdır: en küçük girdiyi hazırlamak, işlevi çağırmak ve çıktı özelliklerini doğrulamak. Basit pipeline'lar için Python'un yerleşik assert ifadesini kullanmak yeterlidir; daha büyük projelerde dağıtımdan önce tüm testleri otomatik olarak çalıştırmak için pytest kullanın.
def test_compute_revenue():
test_df = pd.DataFrame({
'quantity': [2, 3],
'unit_price': [10.0, 5.0]
})
result = compute_revenue(test_df)
assert 'revenue' in result.columns
assert result['revenue'].tolist() == [20.0, 15.0]
assert result['revenue'].dtype == float
print('test_compute_revenue PASSED')
test_compute_revenue()Uç Durumları Test Etme
İyi testler yalnızca beklenen akışı değil, uç durumları da kapsar: tamamen null girdiyi, boş DataFrame'i, tek satırlı DataFrame'i ve aşırı değerlere sahip sütunları. Boş bir DataFrame hata vermek yerine boş bir DataFrame döndürmelidir. Tek satırlı bir DataFrame doğru sonucu hesaplamalıdır. Üretimde olağandışı veriler geldiğinde pipeline'ın bunları sorunsuz biçimde işlediğinden emin olmak için bu durumları açıkça test edin.
def test_empty_df():
empty = pd.DataFrame({'quantity': [], 'unit_price': []})
result = compute_revenue(empty)
assert len(result) == 0, 'Empty input should produce empty output'
assert 'revenue' in result.columns, 'Revenue column should still be created'
print('test_empty_df PASSED')
def test_single_row():
single = pd.DataFrame({'quantity': [1], 'unit_price': [99.0]})
result = compute_revenue(single)
assert result['revenue'].iloc[0] == 99.0
print('test_single_row PASSED')
test_empty_df()
test_single_row()Entegrasyon Testi: Örnek Verilerle Tam Pipeline
Ayrı işlevler üzerindeki birim testlerinin yanı sıra, gerçek verilerin küçük ve temsili bir örneği üzerinde eksiksiz pipeline'ı çalıştıran bir entegrasyon testi yazın. Çıktının beklenen sayıda sütuna sahip olduğunu, anahtar sütunun benzersiz olduğunu ve toplam gelirin makul bir aralıkta bulunduğunu doğrulayın. Bu uçtan uca denetim, birim testlerinin ortaya çıkaramadığı, adımlar arasındaki etkileşimden kaynaklanan hataları yakalar.
def integration_test(config):
raw = extract(config)
clean = transform(raw, config)
assert set(config['required_cols']).issubset(set(clean.columns))
assert clean['order_id'].is_unique
assert (clean['revenue'] >= 0).all()
assert len(clean) > 0
print(f'Integration test PASSED. Output: {clean.shape}')
integration_test(CONFIG)pytest ile Sürekli Test
Pipeline büyüdükçe tüm testleri tests/ dizininde toplayın ve komut satırından pytest ile çalıştırın. Bir conftest.py dosyası, örnek DataFrames gibi paylaşılan test düzeneklerini oluşturabilir. pytest'i CI/CD pipeline'ınıza entegre edin; böylece her kod değişikliğinde dağıtımdan önce tüm testler otomatik olarak çalışır. Başarısız bir test dağıtımı engelleyerek bozuk kodun üretime ulaşmasını önler.
# tests/test_transform.py — example structure
# import pytest, pandas as pd
# from pipeline.transform import compute_revenue, drop_nulls
# @pytest.fixture
# def sample_df():
# return pd.DataFrame({'quantity': [2, 3], 'unit_price': [10.0, 5.0]})
# def test_revenue(sample_df):
# result = compute_revenue(sample_df)
# assert result['revenue'].tolist() == [20.0, 15.0]
print('Run: pytest tests/ -v to execute all pipeline tests')Yaşayan Belgeleme Olarak Doğrulamalar
Pipeline'daki her doğrulama hem bir koruma hem de bir belgeleme parçasıdır: verilerin o noktada nasıl görünmesi gerektiğini makine tarafından okunabilir biçimde belirtir. Yeni bir analist projeye katılıp pipeline kodunu okuduğunda, doğrulamalar ayrı bir belirtim belgesine ihtiyaç duymadan veri sözleşmelerini açıklar. Her doğrulamayı bir yorum gibi ele alın; uyguladığı iş kuralını anlayabilmek için mesajı yeterince açıklayıcı yazın.
# These assertions document business rules as code:
assert (df['order_date'] >= pd.Timestamp('2020-01-01')).all(), \
'Company was founded 2020-01-01; no orders can predate this'
assert df['region'].isin({'North', 'South', 'East', 'West', 'Central'}).all(), \
'Only 5 sales regions are valid; new regions require config update'
print('Business rules verified as assertions.')Hızlı Kontrol
Bu derste ele alınan Veri Analizi kavramlarını anlayıp anlamadığınızı test edin.
Ders Özeti
Bu derste şunları öğrendiniz: satır sayısı, sütun varlığı, değer aralığı ve null denetimlerini pipeline içi doğrulamalar olarak yerleştirmeyi, uç durumları kapsayacak şekilde ayrı dönüştürme işlevleri için birim testleri yazmayı ve entegrasyon testleri çalıştırarak doğrulamaları yaşayan veri sözleşmesi belgeleri olarak ele almayı. Sırada, pipeline çalıştırmalarını günlük otomatik yürütme için zamanlamayı ve günlük kaydını inceleyeceğiz.
Sıkça Sorulan Sorular
“İşlem Hattı Adımlarını Assertion'larla Test Etme” dersi ücretsiz mi?
Evet — “İşlem Hattı Adımlarını Assertion'larla Test Etme” 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.
“İşlem Hattı Adımlarını Assertion'larla Test Etme” dersinde ne öğreneceğim?
Hataların hemen ortaya çıkması için her aşamaya satır sayısı denetimleri, boş değer assertion'ları ve beklenen sütun korumaları ekleyin. 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 3. dersidir.
“İşlem Hattı Adımlarını Assertion'larla Test Etme” 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
- Dönüşüm Adımlarını İşlevler Olarak Yapılandırma
- İşlem Hatlarını Yapılandırma Sözlükleriyle Parametreleştirme
- İşlem Hattı Adımlarını Assertion'larla Test Etme
- İşlem Hattı Çalıştırmalarını Zamanlama ve Günlüğe Kaydetme