Modül 10 · Capstone · ⏱ 20 dk

C2: Bir veri kalitesi ajanı yaz

C2 data quality agent

Bu derste neler öğreneceksin

  • Alert kuralı tanımlar (örn: %50 düşüş mail)
  • Python script yazar
  • GitHub da public repo olarak paylaşır

Uykucu Gözlemci

Gece 3’te birisi elinde silgiyle defterine yanlış sayı yazdı. Sabah 9’da sen geldiğinde, dünkü raporda 50 ürün eksik. Bunu fark edene kadar 6 saat geçti. Bir veri kalitesi ajanı, uyumaz. Her saat başı veriye bakar, “anormal bir şey var mı?” diye sorar, bir sorun varsa seni uyandırır (mail, Slack, SMS).

Bu capstone’ta gerçek bir alert ajanı yazacaksın. Küçük olacak (50-80 satır Python) ama gerçek bir iş çözecek.

Adım 1: Ne Uyarısı?

Önce bir kural yaz. Kural, “şu olursa haber ver” cümlesi. Örnekler:

  • “Dünkü sipariş sayısı, önceki günün %50’sinden azsa mail at.”
  • “API’den 100’den az satır geldiyse Slack’e yaz.”
  • “Bir ürünün fiyatı 0 veya negatif olduysa alarm ver.”

Bir kural seç, README’ye yaz:

Kural: Dünkü sipariş sayısı, önceki günün %50'sinden azsa
       mail ile uyarı gönder.
Neden:  %50 düşüş normal dalgalanma değil, büyük ihtimalle
        ingestion hatası (kaynak API kapalı, credential expire, vs.)

Adım 2: Python Script’i Yaz

dq_agent.py — 50-80 satır:

import duckdb
import smtplib
import os
from email.message import EmailMessage
from datetime import datetime, timedelta

# 1) Veritabanına bağlan
con = duckdb.connect("limonata.duckdb", read_only=True)

# 2) Dün ve önceki günün satış sayısını çek
today = datetime.now().date()
yesterday = today - timedelta(days=1)
day_before = today - timedelta(days=2)

yesterday_count = con.execute(
    "SELECT COUNT(*) FROM raw.sales WHERE DATE(order_time) = ?",
    [yesterday],
).fetchone()[0]

day_before_count = con.execute(
    "SELECT COUNT(*) FROM raw.sales WHERE DATE(order_time) = ?",
    [day_before],
).fetchone()[0]

con.close()

# 3) Kural uygula
if day_before_count == 0:
    print("Önceki gün verisi yok, karşılaştırma yapılamaz.")
    raise SystemExit(0)

drop_ratio = 1 - (yesterday_count / day_before_count)
print(f"Dün: {yesterday_count}, önceki gün: {day_before_count}")
print(f"Düşüş oranı: {drop_ratio:.0%}")

# 4) Eşik: %50 düşüş
THRESHOLD = 0.5
if drop_ratio >= THRESHOLD:
    send_alert(yesterday_count, day_before_count, drop_ratio)
else:
    print("Veri normal görünüyor. İyi günler!")

def send_alert(y_count, d_count, ratio):
    """E-posta ile uyarı gönder."""
    msg = EmailMessage()
    msg["Subject"] = f"[DQ ALERT] Satış %{int(ratio*100)} düştü"
    msg["From"] = os.environ["ALERT_FROM"]
    msg["To"] = os.environ["ALERT_TO"]
    msg.set_content(
        f"Dünkü satış: {y_count}\n"
        f"Önceki gün: {d_count}\n"
        f"Düşüş: %{ratio*100:.0f}\n"
        f"Kontrol et: ingestion log'ları + API durumu."
    )
    with smtplib.SMTP_SSL("smtp.gmail.com", 465) as s:
        s.login(os.environ["ALERT_FROM"], os.environ["ALERT_APP_PASSWORD"])
        s.send_message(msg)
    print("Uyarı gönderildi.")

Not: Gmail için App Password kullan (2FA açıkken). Normal şifre çalışmaz. https://myaccount.google.com/apppasswords adresinden üret.

Adım 3: GitHub’a Public Repo Olarak Yayınla

Adımlar:

  1. gh repo create dq-agent --public --source=. --description="Veri kalitesi ajanı"
  2. .env.example ekle (gerçek secret’lar değil, anahtar isimleri).
  3. README’de nasıl kurulur bölümü yaz.
  4. Bir kez bilerek fail et (veri sil, alert gitmeli), ekran görüntüsünü docs/alert.png olarak ekle.
  5. Repo URL’ini Capstone C1’in README’sine “related projects” olarak koy.

Adım 4: PR’ı İncele

GitHub’da repo’ya gir, “Insights → Community” sekmesinden eksikleri gör:

  • License (MIT ekle)
  • Description
  • Topics (data-quality, python, duckdb)
  • README’nin tamamlanma yüzdesi

Mümkünse bir arkadaşın issue açıp “kural için threshold configurable olmalı” desin. Sen düzelt, commit at, PR’ı kapat. İlk açık kaynak döngün tamamlanmış olur.

Bonus: Cron + GitHub Actions

  • Cron: her saat başı çalıştırmak için crontab -e ile 0 * * * * cd /path && python dq_agent.py.
  • GitHub Actions: repo’da .github/workflows/dq.yml ile saatlik schedule + mail action.

Ne Öğrendik?

  • Anomali tespiti (bugün / dün karşılaştırması) veri kalitesinin temel taşı.
  • SMTP + App Password ile mail göndermek (gerçek production’da Slack/PagerDuty olur).
  • Public repo yayınlamak ve sosyal kanıt üretmek.
  • Küçük bir script bile doğru tasarlanırsa gerçek bir sorunu yakalayabilir.

Sıradaki

Capstone C3: Açık kaynak projeye PR gönder →