İçeriğe geç
academia.sh

Ders 01 / 10

Veri Mühendisliği Nedir

Kurgu bir ölçüm ağının 2400 sayaç okumasının beş aşamalı bir hattan geçirilip her aşamanın taşıdığı satırın sayılması: ayıklama 2400, tekilleştirme 2400, tüketim 2200, özet 55 ve sunma 5. Tüketim aşamasının düşürdüğü satır sıfır olduğu hâlde çıkışı iki yüz satır daha az, çünkü ilk dönemin farkı tanım gereği yoktur. Beş sunulan değerin arkasında 2400 kaynak satırı duruyor, değer başına ortalama 480; en büyük değer 588 kaynak satırının, en küçüğü 372 satırın üzerinde. Hat belirlenimci olduğu için bu sayıların hepsi koşum yapılmadan da türetilebilir. Denetimsiz hatta yakalanan bozulma sıfır ve yakalama gecikmesi tanımsızdır, çünkü ölçen hiçbir şey yoktur.

İçindekiler

Yapay Zekâ Mühendisliğine Giriş kursuyla açılan müfredat, yüz otuz iki derste düzeneği modelin çevresine kurdu ve her parçanın bedelini ayrı ayrı yazdı. Bu derslerin tamamında modele giren verinin hazır olduğu varsayıldı: bir tablo vardı, okundu; bir öznitelik vardı, hesaplandı. O tablonun nasıl dolduğu, üretimde çalışır tutulmasının ne gerektirdiği ve bozulduğunda kimin haberi olacağı hiç sorulmadı.

Bu müfredatın konusu o hattır ve hattın kendine özgü bir kusuru bütün ölçüyü belirler: bir hat çöktüğünde haber verir, yanlış veri taşıdığında hiçbir şey söylemez. Çöken hat bir hata kaydı bırakır, bir uyarı tetikler, bir kuyruk biriktirir; birileri bakar. Yanlış satır taşıyan hat ise koşar, biter, tabloyu yazar ve gösterge yeşil kalır. Bu dersin işi o hattı kurmak ve saymaktır: kaç satır giriyor, her aşama kaçını taşıyor, kaçı sunulan sayıya ulaşıyor.

  • YD1. Kod bir kurgudur. Gerçek bir veri deposu, dosya biçimi, orkestratör ya da çalışma zamanı çağrılmaz; hat düz kitaplıkla yazılmıştır. Kaynak, bir ölçüm ağının kurgu sayaç okumalarıdır ve tohum 20260218’dir.
  • YD2. Kaynak 200 abone x 12 dönem = 2400 okuma. Her okuma bir endeks değeri taşır, endeks artandır ve birim m3’tür. Tüketim endeks farkından hesaplanır.
  • YD3. Hat beş aşamalıdır: ayikla, tekille, tuketim, ozet, sun. Her aşama kendi düşürdüğü satırı sayar; sayılmayan düşüş yoktur.
  • YD4. Toplama, temizleme, eksik değer ve aykırı değer yordamı tekrarlanmaz. Veri Toplama ve Hazırlama kursunda ölçüldü. Buraya eklenen tek şey aşama sayacıdır: bir satırın hangi adımda ve neden düştüğü yazılır.
  • YD5. Şema, kısıt ve normalleştirme yordamı tekrarlanmaz. Veri Modelleme ve İlişkisel Kuram kursunda ölçüldü. Bu derste şema yalnız “zorunlu alan var mı” sorusuna indirgenir.
  • YD6. Hat belirlenimcidir. random kullanılmaz, üreteç ders içinde yazılır; aynı tohum aynı 2400 satırı verir. Bu yüzden ölçüler koşumdan bağımsızdır ve aşağıdaki sayıların hepsi koşum yapılmadan da türetilebilir.
  • YD7. Hiçbir ürün, satıcı ya da biçim adı yazılmaz; depolar ve işleyiciler türleriyle anılır. Süre ham olarak yazılmaz; gecikme aşama ya da dönem olarak yazılır.
  • YD8. Kümenin çözünürlüğü ölçüm bandının alt sınırıdır: 2400 satırda satır oranının en küçük adımı 0,0004, 55 özet hücresinde 0,0182, 5 sunum değerinde 0,2000. Sunum üzerinde oran basılmaz, değerin kendisi yazılır.

Hattın Beş Aşaması

Veri mühendisliğinin sorumluluğu tek cümleyle şudur: bir yerde üretilmiş veriyi, başka bir yerde kullanılabilir hâle getirmek. Bu cümledeki “kullanılabilir” sözcüğü bir dizi adımı gizler ve adımlar sayılmadıkça sorumluluk da ölçülemez. Aşağıdaki hat o adımları beş parçaya ayırır: zorunlu alanı olmayan satır ayıklanır, aynı abone-dönem çifti tekilleştirilir, endeks farkından tüketim hesaplanır, bölge ve dönem başına özet çıkarılır, bölge başına dönem ortalaması sunulur.

Bu beşlinin sırası keyfî değildir ve iki bağı kodun kendisi zorlar. tekille aşaması satırın abone ve donem alanlarını doğrudan okur; bu alanlardan biri yoksa aşama hatayla durur. Yani ayıklama tekilleştirmeden önce gelmek zorundadır, yoksa hat çöker. İkinci bağ daha sessizdir: tuketim aşaması her giriş satırı için bir çıkış satırı üretir, ozet aşaması da bu satırları toplar. Çift kayıt tekilleştirilmeden tüketime girseydi aynı abone-dönem farkı iki çıkış satırı üretir ve özet hücresine iki kez eklenirdi. Birinci bağ ihlal edildiğinde hat durur ve haber verir; ikinci bağ ihlal edildiğinde hat çalışır, biter ve yanlış sayı yazar. Bir hattın aşama sırası, hangi hataların gürültülü hangilerinin sessiz olacağını belirleyen ilk karardır.

# KURGU hat -- gercek bir depo, bicim ya da orkestrator cagrilmaz.
# Kaynak bir olcum aginin KURGU sayac okumalaridir, tohum 20260218.
TOHUM, M32 = 20260218, 0xFFFFFFFF


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"]
TIP = ["mesken", "isyeri"]
DONEM = [f"2026-{a:02d}" for a in range(1, 13)]
ABONE = {}
for i in range(200):
    r = uretec(TOHUM + 37 * i)
    ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)],
                              "baslangic": 10000 + int(r() * 60000)}


# Her donem her abone icin bir okuma. Birim m3 , endeks artan.
def kaynak_uret():
    kayit = []
    for i, (ab, a) in enumerate(ABONE.items()):
        e = a["baslangic"]
        for d in DONEM:
            r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d))
            e += 4 + int(r() * 46)
            kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"],
                          "endeks": e, "birim": "m3"})
    return kayit


def a1_ayikla(kayit):
    """Zorunlu alanlari tasimayan satir dusurulur."""
    ZOR = ("abone", "donem", "bolge", "endeks", "birim")
    tut = [k for k in kayit if all(a in k for a in ZOR)]
    return tut, len(kayit) - len(tut)


def a2_tekille(kayit):
    gor, tut = set(), []
    for k in kayit:
        ad = (k["abone"], k["donem"])
        if ad in gor:
            continue
        gor.add(ad)
        tut.append(k)
    return tut, len(kayit) - len(tut)


def a3_tuketim(kayit):
    """Donem farkindan tuketim. Onceki donem yoksa satir hesaplanamaz."""
    tablo = {(k["abone"], k["donem"]): k for k in kayit}
    cikti, dusen = [], 0
    for k in kayit:
        i = DONEM.index(k["donem"])
        if i == 0:
            continue
        onceki = tablo.get((k["abone"], DONEM[i - 1]))
        if onceki is None:
            dusen += 1
            continue
        try:
            f = int(k["endeks"]) - int(onceki["endeks"])
        except (TypeError, ValueError):
            dusen += 1
            continue
        cikti.append(dict(k, m3=f))
    return cikti, dusen


def a4_ozet(kayit):
    top = {}
    for k in kayit:
        ad = (k["bolge"], k["donem"])
        top[ad] = top.get(ad, 0) + k["m3"]
    return top, 0


def a5_sun(ozet):
    """Sunum: bolge basina donem ortalamasi."""
    bolge = {}
    for (b, d), v in ozet.items():
        bolge.setdefault(b, []).append(v)
    return {b: round(sum(v) / len(v), 2) for b, v in bolge.items()}, 0


ASAMA = [("ayikla", a1_ayikla), ("tekille", a2_tekille), ("tuketim", a3_tuketim),
         ("ozet", a4_ozet), ("sun", a5_sun)]


def hat(kayit):
    iz, veri = [], kayit
    for ad, f in ASAMA:
        veri, dusen = f(veri)
        n = len(veri) if hasattr(veri, "__len__") else 0
        iz.append({"asama": ad, "kalan": n, "dusen": dusen})
    return veri, iz


kaynak = kaynak_uret()
sunum, iz = hat(kaynak)
print("kaynak satiri", len(kaynak), " abone", len(ABONE), " donem", len(DONEM))
print("asama      kalan   dusen")
for a in iz:
    print(f"{a['asama']:<10}{a['kalan']:>6}{a['dusen']:>8}")
print("sunum")
for b, v in sorted(sunum.items(), key=lambda x: -x[1]):
    print(f"  {b:<8}{v:>9.2f}")
kaynak satiri 2400  abone 200  donem 12
asama      kalan   dusen
ayikla      2400       0
tekille     2400       0
tuketim     2200       0
ozet          55       0
sun            5       0
sunum
  merkez    1321.45
  kuzey     1212.55
  guney     1065.55
  dogu       881.36
  bati       833.09

İz tablosunun ilk iki satırı sıfır düşüşle geçiyor: kaynak sağlam olduğu için ayıklanacak eksik alanlı satır yok, tekilleştirilecek çift kayıt yok. Üçüncü satır ise okumanın kilit noktasıdır. tuketim aşamasının düşürdüğü satır sıfır, buna karşılık çıkışı iki yüz satır daha az. Bu fark bir kayıp değil, tanımın kendisidir: tüketim iki dönemin endeks farkıdır ve her abonenin ilk döneminin farkı yoktur. İki yüz abonenin ilk dönemi hesaplanamaz, ama bunlar bozuk satır değildir. Bir hattın izinde “kalan” ile “düşen” sütunlarının ayrı tutulmasının nedeni budur: tanım gereği çıkmayan satır ile hata yüzünden çıkarılan satır aynı sütuna yazılamaz.

Bu sayıların hiçbiri koşuma bağlı değildir. Hat belirlenimci olduğu için tablo koşum yapılmadan da türetilir: 200 abone x 12 dönem = 2400; her abone bir dönem kaybettiği için 200 x 11 = 2200; 5 bölge x 11 dönem = 55 hücre; 5 bölge = 5 değer. Aynı tohumla ikinci bir koşum aynı tabloyu verir, bu yüzden aşağıdaki karşılaştırmalarda görülen her fark bozulmanın kendisinden gelir, oynaklıktan değil.

Sunulan Değerin Arkasındaki Satır

Bir hattın en çok bakılan yeri son aşamasıdır, çünkü rapor oradan okunur. Bu hattın son aşaması beş sayı üretiyor. O beş sayının arkasında kaç satır durduğu, hattın ne kadarını gizlediğini söyler.

# Her sunulan degerin arkasinda kac satir duruyor
v1, _ = a1_ayikla(kaynak)
v2, _ = a2_tekille(v1)
v3, _ = a3_tuketim(v2)
ozet, _ = a4_ozet(v3)
abone, satir, hucre = {}, {}, {}
for a in ABONE.values():
    abone[a["bolge"]] = abone.get(a["bolge"], 0) + 1
for k in v3:
    satir[k["bolge"]] = satir.get(k["bolge"], 0) + 1
for b, d in ozet:
    hucre[b] = hucre.get(b, 0) + 1
print("bolge     sunulan  ozet  tuketim  kaynak  abone")
for b, v in sorted(sunum.items(), key=lambda x: -x[1]):
    print(f"{b:<9}{v:>9.2f}{hucre[b]:>6}{satir[b]:>9}{abone[b] * 12:>8}{abone[b]:>7}")
print(f"{'toplam':<9}{len(sunum):>9}{len(ozet):>6}{len(v3):>9}{len(kaynak):>8}{len(ABONE):>7}")
bolge     sunulan  ozet  tuketim  kaynak  abone
merkez     1321.45    11      539     588     49
kuzey      1212.55    11      506     552     46
guney      1065.55    11      440     480     40
dogu        881.36    11      374     408     34
bati        833.09    11      341     372     31
toplam           5    55     2200    2400    200

Tablo hattın sıkıştırma oranını açıkça yazıyor. merkez için raporda görünen tek sayı, 1321,45, kırk dokuz abonenin on iki dönemlik 588 kaynak satırının, bunlardan hesaplanan 539 tüketim satırının ve on bir özet hücresinin üzerinde duruyor. En küçük değer olan bati, 372 kaynak satırının üzerinde. Beş değer birlikte 2400 satırı temsil ediyor, yani değer başına ortalama 480 kaynak satırı.

Bu sıkıştırmanın iki yüzü var. Yararlı yüzü açıktır: kimse iki bin dört yüz satıra bakarak karar veremez, özetin işi zaten budur. Bedeli ise ölçünün konusudur. Bir kaynak satırı bozulduğunda o bozulma sunulan sayıya 480’de bir ağırlıkla girer; merkez için 588’de bir. Tüketim katmanının kaynağa oranı 0,9167‘dir ve bu oranın en küçük adımı 0,0004 olduğuna göre üç haneli okunabilir; ama sunum katmanında oran yazmanın anlamı yoktur, çünkü orada yalnız beş değer vardır ve bir değerin oransal ağırlığı 0,2000’dir. Sunum katmanında yazılacak şey değerin kendisidir.

Buradan hattın ilk yapısal sonucu çıkar: tek bir satırın bozulması sunulan sayıda görünmeyecek kadar seyrelir, ama yüz satırın aynı yönde bozulması görünmeyecek kadar seyrelmez. Hangi bozulmanın hangi eşikte göründüğü bu hattın ölçülecek asıl niceliğidir ve bu ders onu henüz ölçmüyor, yalnız zeminini kuruyor.

Sıkıştırmanın satır sayısında görünmeyen bir yanı daha var: hat yalnız satır düşürmüyor, ayırt edici boyut da düşürüyor. İlk üç aşamanın çıkışı abone ile donem çiftiyle anahtarlıdır ve tabloda iki yüz ayrı abone durur. ozet aşamasının çıkışı ise bolge ile donem çiftiyle anahtarlıdır; abone sütunu orada kalmaz. Elli beş hücrenin hiçbirinden hangi abonelerin toplandığı okunamaz. sun aşaması aynı şeyi dönem eksenine yapar: beş değerin hiçbirinden hangi dönemin ne kadar eklediği okunamaz. Bu, bir kayıp değil özetin tanımıdır, ama sonucu üretimde ağırdır. Sunulan bir sayı şüpheli göründüğünde geriye doğru yürümek, ara çıktıları okumakla yapılamaz; hattın ilk üç aşamasının yeniden koşturulması gerekir. Bir hattın hangi aşamada hangi boyutu bıraktığını yazmak, bozulma araştırmasının maliyetini önceden yazmakla aynı şeydir.

Denetimsiz Hattın Sayısı

Yukarıdaki hat çalışıyor, bitiyor ve beş sayı yazıyor. Bu hat hakkında bilinen tek şey kaç satır taşıdığıdır. Taşıdığı satırların doğru olup olmadığı hakkında hiçbir şey bilinmiyor, çünkü hatta bunu soran hiçbir adım yok.

Müfredatın her dersinde bundan sonra üç sayı yan yana duracak:

  1. Denetimsiz hat. Hiçbir denetim açık değil. Yakalanan bozulma 0, yakalama gecikmesi tanımsız. Bu dersteki hat tam olarak budur.
  2. Denetimli hat. Aynı iş yükü, denetim eklenmiş. Yakalanan bozulma ve yakalama gecikmesi aşama numarası olarak yazılır.
  3. Bedel. Yakalama gecikmesi, yanlış engellenen iyi satır, yeniden işlenen satır ve eklenen aşama.

Üçüncü maddedeki kalemler bu müfredatın en sık atlanan yanıdır. Denetim eklemek bedava bir iyileşme değildir: bir denetim iyi satırı da engelleyebilir, hattı gereksiz yere durdurabilir, yeniden işleme sırasında satır çoğaltabilir ve kendisi kusurlu olabilir. Bu yüzden denetimli hat yazılırken yalnız yakalanan bozulma değil, denetimin kendi bedeli de aynı tabloya girer. Yakalanan bozulma sayısı tek başına yazıldığında iyileşme abartılmış olur.

Birinci maddedeki “tanımsız” sözcüğü dikkatle okunmalıdır. Denetimsiz hattın yakalama gecikmesi büyük değildir, yoktur; ölçen hiçbir şey olmadığı için gecikme diye bir nicelik oluşmaz. Bu, sıfır ile tanımsız arasındaki farktır ve raporlamada sık karıştırılır: “hiç bozulma yakalanmadı” cümlesi, denetim yokken bir başarı bildirimi değil, bir ölçüm yapılmadığının bildirimidir.

Buradan müfredatın kuralı gelir ve altı kurs boyunca sürer: bir veri hattının sayısı taşıdığı satır değil, yanlış satırın kaç adım sonra yakalandığıdır. Bozulmayı yakalayan denetimi yazılmayan hat ölçülmemiş sayılır. Yukarıdaki hattın izi kusursuz görünüyor, çünkü izin gösterdiği tek şey aşamaların birbirine kaç satır devrettiğidir. Devredilen satırın içeriği hakkında iz sessizdir ve sessizliği yeşil renkte yazılır.

Özet

  • Veri mühendisliğinin sorumluluğu bir yerde üretilmiş veriyi başka bir yerde kullanılabilir kılmaktır; bu sorumluluk ancak hattın aşamaları ve her aşamanın taşıdığı satır sayıldığında ölçülebilir hâle gelir.
  • Bir hat çöktüğünde haber verir, yanlış veri taşıdığında hiçbir şey söylemez; bu müfredatın ölçüsü ikinci durumdur.
  • Beş aşamalı hat 2400 kaynak satırını 2400, 2400, 2200, 55 ve 5 olarak taşıyor; tuketim aşamasının düşürdüğü satır sıfır olduğu hâlde çıkışı iki yüz satır azdır, çünkü ilk dönemin farkı tanım gereği yoktur.
  • Sunulan beş değerin arkasında 2400 kaynak satırı duruyor: değer başına ortalama 480, en büyüğü 588, en küçüğü 372. Bir satırın bozulması sunulan sayıya bu ağırlıkla seyrelerek girer.
  • Denetimsiz hatta yakalanan bozulma 0 ve yakalama gecikmesi tanımsızdır; “hiç bozulma yakalanmadı” cümlesi ölçüm yapılmadığının bildirimidir.
  • Müfredatın kuralı: bir veri hattının sayısı yanlış satırın kaç adım sonra yakalandığıdır; bozulmayı yakalayan denetimi yazılmayan hat ölçülmemiş sayılır.

Sonraki Adım

Bu dersin hattı sağlam bir kaynakla koştu ve iz tablosu her aşamada beklenen sayıyı verdi. Kaynağın sağlam olması bir varsayımdı; üretimde kaynak sağlam gelmez. Bir dönemin kayıtları geç gelir, aynı kayıt iki kez yazılır, bir alanın adı değişir, bir okuma başka bir birimle gönderilir, bir bölgenin bölümü hiç yazılmaz, sayı alanı metne döner. Bu kazaların hiçbiri saldırı değildir ve hepsi üretici tarafında olur. Sonraki ders bu altı sınıfı adlarıyla tanımlar ve aynı hattan geçirir; ölçülecek şey hangi bozulmanın hangi aşamada etkisini gösterdiğidir. Tablonun en rahatsız edici sütunu sonuncusu olacak: altı sınıfın üçü, hattın sunduğu beş değeri birebir aynı bırakıyor.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat