Veri Bilimi icin Python: 2026'da NumPy, Pandas ve Scikit-Learn Rehberi
NumPy dizi islemleri, Pandas veri manipulasyonu ve Scikit-Learn model egitimini kapsayan uygulamali bir rehber. Ham CSV verisinden egitilmis modele uzanan eksiksiz bir veri hatti, uretim ortamina hazir Python kod ornekleriyle adim adim olusturulmaktadir.

2026 yilinda Python veri bilimi ekosistemine hakim uc temel kutuphane, islerin buyuk bolumunu ustlenmektedir: sayisal hesaplamalar icin NumPy, tablo verisi manipulasyonu icin Pandas ve makine ogrenimi icin Scikit-Learn. Bu rehber, her uc kutuphanenin pratik kod ornekleriyle nasil kullanildigini adim adim ele almakta ve ham CSV verisinden egitilmis bir modele uzanan eksiksiz bir veri hatti olusturma surecini kapsamaktadir.
Tum kod ornekleri Python 3.12+, NumPy 2.1, Pandas 2.2 ve Scikit-Learn 1.6 uzerinde calistirilmaktadir. API yuzeyinin kucuk surumler arasindaki kararliligi surdurulmekle birlikte, NumPy 2.x'teki performans iyilestirmeleri buyuk dizi islemleri icin yukseltmeyi karsilanabilir kilmaktadir.
NumPy ile Verimli Dizi Islemleri
NumPy, Python listelerinin yerini bitisik bellek bloklari tarafindan desteklenen n-boyutlu dizilerle almaktadir. Performans farki kayda degerdir: 1 milyon eleman uzerinde vektorize edilmis bir NumPy islemi, esdeger bir Python dongusu ile karsilastirildiginda 50-100 kat daha hizli calismaktadir. Pandas DataFrame'leri ve Scikit-Learn modelleri de dahil olmak uzere tum veri bilimi araclari arka planda NumPy dizilerini kullanmaktadir.
# numpy_basics.py
import numpy as np
# Create arrays from different sources
prices = np.array([29.99, 49.99, 19.99, 99.99, 39.99])
quantities = np.arange(1, 6) # [1, 2, 3, 4, 5]
# Vectorized arithmetic — no loops needed
revenue = prices * quantities
print(revenue) # [29.99, 99.98, 59.97, 399.96, 199.95]
# Statistical aggregations
print(f"Total revenue: ${revenue.sum():.2f}") # $789.85
print(f"Mean price: ${prices.mean():.2f}") # $47.99
print(f"Std deviation: ${prices.std():.2f}") # $27.64
# Boolean indexing — filter without loops
premium_mask = prices > 40
premium_items = prices[premium_mask] # [49.99, 99.99]Boolean indeksleme, gercek veri bilimi kodlarinda en sik karsilasilan kaliptir. Donguler icinde if ifadeleri yazmak yerine, bir boolean maske tek bir islemde kosulu saglayan elemanlari secmektedir. Bu yaklasim hem okunabilirligi artirmakta hem de performansi onemli olcude iyilestirmektedir.
NumPy'da Yeniden Sekillendirme ve Yayilim (Broadcasting)
Iki boyutlu islemler, NumPy'nin farkli sekillerdeki dizileri nasil yaydiginin anlasilmasini gerektirmektedir. Yayilim kurallari, acik bir kopyalama islemi yapmadan matris ile vektor arasinda islem yapilmasina olanak tanimaktadir.
# numpy_reshape.py
import numpy as np
# Monthly sales data: 4 products x 3 months
sales = np.array([
[120, 150, 130], # Product A
[200, 180, 220], # Product B
[90, 110, 95], # Product C
[300, 280, 310], # Product D
])
# Column-wise mean (average per month)
monthly_avg = sales.mean(axis=0) # [177.5, 180.0, 188.75]
# Row-wise sum (total per product)
product_totals = sales.sum(axis=1) # [400, 600, 295, 890]
# Normalize each product relative to its own max
normalized = sales / sales.max(axis=1, keepdims=True)
# keepdims=True preserves the shape for broadcasting
print(normalized[0]) # [0.8, 1.0, 0.867] — Product A relative to its peak
# Reshape for Scikit-Learn (requires 2D input)
flat_sales = sales.flatten() # 1D array of 12 values
reshaped = flat_sales.reshape(-1, 1) # 12x1 column vectoraxis parametresi toplamanin yonunu kontrol etmektedir: axis=0 satirlari daraltir (sutun bazinda islem yapar), axis=1 ise sutunlari daraltir (satir bazinda islem yapar). keepdims=True argumani yayilim sirasinda sekil uyumsuzluklarini onlemektedir. Bu kavramlar, veri bilimi mulakat sorularinda siklikla karsilasilan konular arasinda yer almaktadir.
Pandas ile DataFrame Manipulasyonu ve Veri Temizleme
Pandas, NumPy dizilerini etiketli eksenler ve SQL benzeri islemlerle sarmaktadir. DataFrame, merkezi veri yapisi olarak her sutunun farkli bir veri tipi tasiyabildigi bir tablo gorevi gormektedir. Pandas 2.2, varsayilan olarak PyArrow destekli string sutunlari kullanmakta ve bu da object-dtype string'lere kiyasla bellek kullanimini onemli olcude azaltmaktadir.
# pandas_cleaning.py
import pandas as pd
import numpy as np
# Load and inspect raw data
df = pd.read_csv("candidates.csv")
print(df.shape) # (1500, 8)
print(df.dtypes) # Check column types
print(df.isna().sum()) # Count missing values per column
# Clean in a reproducible chain
df_clean = (
df
.dropna(subset=["salary", "experience_years"]) # Drop rows missing critical fields
.assign(
salary=lambda x: x["salary"].clip(lower=20000, upper=500000), # Cap outliers
experience_years=lambda x: x["experience_years"].astype(int),
hired_date=lambda x: pd.to_datetime(x["hired_date"], errors="coerce"),
)
.drop_duplicates(subset=["email"]) # Remove duplicate candidates
.query("experience_years >= 0") # Filter invalid entries
.reset_index(drop=True)
)
print(f"Cleaned: {len(df)} -> {len(df_clean)} rows").assign() ile metot zincirleme, donusumleri okunabilir ve tekrarlanabilir kilmaktadir. Her adim, neyin neden degistigini acikca belgelemektedir. .assign() icindeki lambda x: kalibinin zincirdeki o noktadaki DataFrame'e referans vermesi, eski verilere atifta bulunma riskini ortadan kaldirmaktadir.
Pandas 2.2, Copy-on-Write mekanizmasini varsayilan olarak etkinlestirmektedir. Bu ozellik, SettingWithCopyWarning uyarisini tamamen ortadan kaldirmakta ve zincirli islemleri daha guvenli hale getirmektedir. Bir dilim uzerindeki degisiklikler artik orijinal DataFrame'i sessizce degistirmemekte, Pandas yalnizca bir yazma islemi gerceklestiginde kopya olusturmaktadir.
Pandas ile GroupBy Toplamalari ve Ozellik Muhendisligi
GroupBy islemi, veriyi alt kumelere bolmekte, her alt kumeye bir fonksiyon uygulamakta ve sonuclari birlestirmektedir. Bu kalip, tablo tabanli makine ogrenimindeki ozellik muhendisligi is akislarinin buyuk cogulugunu yonlendirmektedir.
# pandas_groupby.py
import pandas as pd
# Aggregate candidate stats by department
dept_stats = (
df_clean
.groupby("department")
.agg(
avg_salary=("salary", "mean"),
median_experience=("experience_years", "median"),
headcount=("email", "count"),
max_salary=("salary", "max"),
)
.sort_values("avg_salary", ascending=False)
)
print(dept_stats.head())
# Create features for ML: encode categorical + add aggregated stats
df_features = (
df_clean
.assign(
# Ratio of individual salary to department average
salary_ratio=lambda x: x["salary"] / x.groupby("department")["salary"].transform("mean"),
# Time since hire in days
tenure_days=lambda x: (pd.Timestamp.now() - x["hired_date"]).dt.days,
# Binary encoding
is_senior=lambda x: (x["experience_years"] >= 5).astype(int),
)
).transform() metodu, orijinal indeksle hizalanmis bir Series dondurdugu icin .assign() icinde guvenle kullanilabilmektedir. Bu yaklasim, toplanmis sonuclarin orijinal DataFrame'e manuel olarak birlestirilmesi seklindeki yaygin hatayi onlemektedir.
Data Science & ML mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
Sifirdan Scikit-Learn Pipeline Olusturma
Scikit-Learn pipeline'lari, on-isleme adimlarini ve modeli tek bir nesne icinde zincirlemektedir. Pipeline, donusturuculeri yalnizca egitim verisi uzerinde fit ederek ve ayni donusumleri test verisine uygulayarak veri sizintisini onlemektedir. Bu yaklasim, gozetimli ogrenme gorevleri icin standart kalip olarak kabul edilmektedir.
# sklearn_pipeline.py
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
import pandas as pd
# Define column groups
numeric_features = ["salary", "experience_years", "salary_ratio", "tenure_days"]
categorical_features = ["department", "role_level"]
target = "promoted"
# Split before any preprocessing
X = df_features[numeric_features + categorical_features]
y = df_features[target]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Build the preprocessing + model pipeline
preprocessor = ColumnTransformer(
transformers=[
("num", StandardScaler(), numeric_features), # Scale numeric columns
("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features), # Encode categories
]
)
pipeline = Pipeline([
("preprocessor", preprocessor),
("classifier", GradientBoostingClassifier(
n_estimators=200,
learning_rate=0.1,
max_depth=4,
random_state=42,
)),
])
# Train and evaluate
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
print(classification_report(y_test, y_pred))ColumnTransformer, farkli sutun tiplerine farkli on-islemleri tek bir adimda uygulamaktadir. StandardScaler sayisal ozellikleri sifir ortalama ve birim varyansa normalize etmektedir. OneHotEncoder ise kategorik stringleri ikili sutunlara donusturmektedir. handle_unknown="ignore" parametresi, test verisinin egitim verisinde bulunmayan kategoriler icermesi durumunda pipeline'in hata vermemesini garanti altina almaktadir.
Capraz Dogrulama ve Hiperparametre Optimizasyonu
Tek bir egitim/test bolunmesi, hangi orneklerin hangi kume icinde yer aldigina bagli olarak yaniltici sonuclar uretebilmektedir. Capraz dogrulama, birden fazla bolunme uzerinde calisarak skorlarin ortalamasini almakta ve boylece daha guvenilir bir performans tahmini sunmaktadir.
# sklearn_tuning.py
from sklearn.model_selection import cross_val_score, GridSearchCV
import numpy as np
# 5-fold cross-validation on the full pipeline
scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring="f1")
print(f"F1 scores: {scores}")
print(f"Mean F1: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")
# Grid search over hyperparameters
param_grid = {
"classifier__n_estimators": [100, 200, 300],
"classifier__max_depth": [3, 4, 5],
"classifier__learning_rate": [0.05, 0.1, 0.2],
}
grid_search = GridSearchCV(
pipeline,
param_grid,
cv=5,
scoring="f1",
n_jobs=-1, # Use all CPU cores
verbose=1,
)
grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best F1: {grid_search.best_score_:.3f}")
# Evaluate the best model on held-out test set
best_model = grid_search.best_estimator_
print(classification_report(y_test, best_model.predict(X_test)))Cift alt cizgi sozdizimi (classifier__max_depth) pipeline icindeki ic ice gecmis parametrelere referans vermektedir. n_jobs=-1 aramalayi tum mevcut CPU cekirdekleri uzerinde paralellestirmekte ve bu da ayarlama suresini cok cekirdekli makinelerde saatlerden dakikalara indirebilmektedir.
Olcekleyicinin bolunmeden once tum veri seti uzerinde fit edilmesi, dogrulama katmanlarindan egitim katlanlarina bilgi sizmasina neden olmaktadir. Olcekleyicinin bir Pipeline icine yerlestirilmesi, olceklemenin yalnizca her katlamanin egitim bolumu uzerinde gerceklestirilmesini garanti etmektedir. Bu durum, makine ogrenimi mulakat sorularinda en sik karsilasilan hatalar arasinda yer almaktadir.
Modelleri Kaydetme ve Uretim Ortamina Tasima
Egitilmis bir pipeline'in dagitim icin seriletirilmesi gerekmektedir. joblib kutuphanesi, NumPy dizilerini Python'un yerlesik pickle modulu ile karsilastirildiginda daha verimli bir sekilde islemektedir.
# sklearn_export.py
import joblib
from pathlib import Path
# Save the complete pipeline (preprocessor + model)
model_dir = Path("models")
model_dir.mkdir(exist_ok=True)
joblib.dump(best_model, model_dir / "promotion_model_v1.joblib")
# Load and predict in a different process
loaded_model = joblib.load(model_dir / "promotion_model_v1.joblib")
new_data = pd.DataFrame({
"salary": [75000],
"experience_years": [4],
"salary_ratio": [1.05],
"tenure_days": [730],
"department": ["Engineering"],
"role_level": ["Mid"],
})
prediction = loaded_model.predict(new_data)
probability = loaded_model.predict_proba(new_data)[:, 1]
print(f"Promoted: {bool(prediction[0])}, Confidence: {probability[0]:.2%}")Yalnizca model yerine tum pipeline'in kaydedilmesi, on-isleme adimlarinin cikarim zamaninda birebir ayni sekilde uygulanmasini saglamaktadir. Model dosyasinin egitim betigiyle birlikte surumlendirilmesi tekrarlanabilirligi korumaktadir. Resmi Scikit-Learn kalicilik dokumantasyonu, guvenilir olmayan model dosyalarinin yuklenmesiyle ilgili guvenlik hususlarini kapsamaktadir.
Sonuc
- NumPy vektorize islemleri, Python dongularini 50-100 kat daha hizli dizi hesaplamalariyla degistirmektedir; boolean indeksleme ve yayilim, filtreleme ve donusum ihtiyaclarinin buyuk bolumunu karsilamaktadir
- Pandas'ta
.assign()ve.transform()ile metot zincirleme, okunabilir ve tekrarlanabilir veri temizleme hatlari olusturmaktadir; Pandas 2.2'deki Copy-on-Write ozelligi sessiz mutasyon hatalarini ortadan kaldirmaktadir - Scikit-Learn Pipeline'lari on-isleme ve modellemeyi tek bir nesne icinde birlestirimekte ve egitim ile test kumeleri arasinda veri sizintisini onlemektedir
GridSearchCVile capraz dogrulama, guvenilir performans tahminleri saglamakta ve hiperparametre optimizasyonunu tum CPU cekirdekleri uzerinde otomatiklestirmektedir- Tum pipeline'in
joblibile seriletirilmesi, egitim ve cikarim zamaninda birebir ayni on-islemenin uygulanmasini garanti etmektedir - Bu kaliplari, hem kodlama yetkinligini hem de istatistiksel temellerin kavranmasini test eden veri bilimi mulakat sorulari ile pratik yapmak tavsiye edilmektedir
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Etiketler
Paylaş
İlgili makaleler

Makine Öğrenmesi Algoritmaları: Teknik Mülakatlar İçin Kapsamlı Rehber
Makine öğrenmesi algoritmalarını derinlemesiyle öğrenin: denetimli öğrenme, karar ağaçları, kümeleme, model değerlendirme metrikleri ve düzenlileştirme yöntemleri. 2026 veri bilimi mülakatlarına hazırlık için Python kod örnekleriyle.

2026'da En Sık Sorulan 25 Veri Bilimi Mülakat Sorusu
2026 yılında veri bilimi mülakatlarında öne çıkan 25 kritik soru: istatistik, makine öğrenmesi, özellik mühendisliği ve MLOps konularında kapsamlı rehber.