Proje: kupon mutabakatı
Kesit SQL'deki BT İş Analisti yolunda Lezzet Kurye için geç teslim kuponu talebini analiz ettin: 45 dakikayı aşan teslime 30 TL, 60 dakikayı aşana 60 TL. Geliştirme bitti, kabul testi sana geldi. Elinde sipariş verisi ve kupon servisinin dökümü var. Soru basit: kural doğru uygulanmış mı? Bu dersteki küçük betik bu soruyu her seferinde aynı biçimde, elle Excel karşılaştırması yapmadan cevaplar.
Bu proje yazılımcı olmayı hedeflemez; yolda gördüğün dosya, CSV, JSON, pandas ve Excel işlerini gerçek bir kabul testinde birleştirir.
| Adım | Soru | Çıktı |
|---|---|---|
| 1. Kural | Kaç kupon oluşmalıydı? | beklenen_kuponlar |
| 2. Dosya | Döküm okunabilir mi? | dosya_oku |
| 3. Mutabakat | Nerede fark var? | mutabakat, ozet_cikar |
| 4. API | Cevaplar sözleşmeye uyuyor mu? | cevap_denetle |
| 5. Rapor | Kabul mü, ret mi? | rapor_sayfalari, karar_notu |
Önce beklenen sonuç
Kabul testinin ilk kuralı: dosyaya bakmadan önce beklenen sonucu kendin hesapla. Dosyadan başlarsan farkında olmadan ona uyum sağlarsın. Hesabın SQL yolundaki sonuçla aynı olmalı: 1.508 kupon, 51.900 TL (222 tanesi 60 TL).
import csv, io, json
import pandas as pd
import veri
def siparisleri_oku():
return veri.oku("lezzet_kurye", "lk_orders", parse_dates=["placed_at", "delivered_at"])
s = siparisleri_oku()
print(s["status"].value_counts().to_dict())
d = s[s["status"] == "teslim"]
sure = (d["delivered_at"] - d["placed_at"]).dt.total_seconds()
print("en kısa", sure.min(), "en uzun", sure.max(), "saniye")
İkinci dosya nereden geliyor?
Veri setlerinde gerçek bir kupon servisi dökümü yok, bu yüzden kupon_dosyasi onu hazır kuraldan üretir ve numaraya bağlı, açık hatalar ekler: bazı kuponlar oluşmamış, bazıları çift, bazılarında 30 ile 60 karışmış, bazıları zamanında teslime verilmiş. Hatalar derse aittir ve koda bakınca görünür; sonuçlar her çalıştırmada aynıdır.
Toplam tutarsa neden yetmez?
Dosyanın toplamını beklenenle karşılaştırmak en hızlı yoldur ve en yanıltıcısıdır. Bu örnekte beklenen 51.900 TL, dosyada 53.160 TL; net fark yalnız 1260 TL. Oysa 77 siparişte sorun var. Eksik kupon ile çift kupon birbirini götürür. Karşılaştırma bu yüzden sipariş numarası üzerinden, dış birleştirmeyle yapılır.
import pandas as pd
b = pd.DataFrame({"no": [1, 2, 3], "tutar": [30, 30, 60]})
d = pd.DataFrame({"no": [2, 3, 4], "tutar": [30, 30, 30]})
m = b.merge(d, on="no", how="outer", suffixes=("_b", "_d"), indicator=True)
print(m)
indicator=True her satırın nereden geldiğini söyler: left_only eksik, right_only fazla, both ise tutar karşılaştırılacak satır.
API cevabı da bir sözleşmedir
İş analisti API yazmaz ama cevabın sözleşmeye uyup uymadığını denetleyebilir. HTTP ve REST API istemcisi: requests, httpx ve dayanıklı istekler dersindeki JSON okuma burada işe yarar; gerçek servise bağlanman gerekmez, örnek cevaplar dosyadan okunur.
Bitince göreceğin sonuç
Rapor sayfalarını önce Python listesi olarak kurarsın, sonra gerçek Excel dosyasına yazarsın. Dosya bu sayfada oluşur, indirip Excel'de açabilirsin (openpyxl ilk kullanımda iner, yaklaşık 270 KB).
| Durum | Sipariş |
|---|---|
| Tamam | 1.459 |
| Eksik | 15 |
| Çift | 18 |
| Tutar farkı | 16 |
| Fazla | 28 |
Bunu işe taşı
Aynı kalıp her kabul testinde çalışır: kuralı ayrı hesapla, anahtarla karşılaştır, farkı sınıflandır, dosya olarak paylaş. Kural Kesit SQL'deki karar tablosundan geliyor; tablo değişirse betikte tek yer değişir. Bir sonraki adım olarak bu betiği bir sonraki sürümde yeniden çalıştırıp farkın kapandığını göster: buna regresyon denetimi denir.