Hafta 2 · eGFR fonksiyonu: bir kodu okumak¶
Yapay Zeka ve Sağlık · Fırat Üniversitesi Tıp Fakültesi
Derste tarayıcıda çalışan bir klinik hesaplayıcı yazdırdık; içindeki egfrCkdEpi2021 fonksiyonunu okuduk.
Bu defterde aynı fonksiyonun Python karşılığı var. Amaç yazmak değil: def, parametre, return ve if'i tanımak.
Bu hafta tek işimiz bu.
1 · Değişkenler ve tipler: 3 satır¶
Bir hastanın verisi. Sayı ile metin farklı tiptir; type() bunu söyler.
kreatinin = 1.1 # mg/dL → ondalık sayı (float)
yas = 54 # yıl → tam sayı (int)
cinsiyet = "kadın" # metin → str
print(type(kreatinin), type(yas), type(cinsiyet))
<class 'float'> <class 'int'> <class 'str'>
Form alanlarından ve dosyalardan gelen her şey metin gelir. Metinle hesap yapılmaz; önce sayıya çevrilir.
girdi = "1.1" # kullanıcı böyle yazdı: bir metin
# print(girdi * 2) # deneyin: metni 2 ile "çarpmak" ne verir?
kreatinin = float(girdi) # tip dönüşümü: metin → ondalık sayı
print(kreatinin * 2, type(kreatinin))
2.2 <class 'float'>
2 · Fonksiyon: def gördüğünüzde¶
Aşağıdaki blok bir fonksiyon tanımı. Parantez içi parametreler (formülün girdileri); return sonucu geri verir.
Formül: CKD-EPI 2021 (Inker ve ark., NEJM 2021). Cinsiyet üç yerde işe karışıyor; bulun.
def egfr_hesapla(kreatinin, yas, cinsiyet):
"""CKD-EPI 2021 ile eGFR (mL/dk/1,73 m²). kreatinin mg/dL, yas yıl, cinsiyet 'kadın' | 'erkek'."""
kadin = cinsiyet == "kadın" # mantıksal değer: True / False
kappa = 0.7 if kadin else 0.9 # κ
alfa = -0.241 if kadin else -0.302 # α
oran = kreatinin / kappa
egfr = 142 * min(oran, 1) ** alfa * max(oran, 1) ** -1.200 * 0.9938 ** yas
if kadin:
egfr = egfr * 1.012 # kadın çarpanı
return egfr
print(round(egfr_hesapla(1.1, 54, "kadın")))
print(round(egfr_hesapla(1.1, 54, "erkek")))
60 80
Okuma sorusu: Aynı kreatinin ve yaşta kadın ile erkek sonucu neden farklı? Kodda hangi üç satır bunu yapıyor?
3 · Koşul: if eşikleri¶
Sayıyı klinik anlama çeviren kısım. KDIGO 2024 evreleri. Sıra önemli: yukarıdan aşağı ilk doğru olan kazanır.
def kdigo_evresi(egfr):
"""eGFR değerini KDIGO G evresine çevirir."""
if egfr >= 90:
return "G1 · normal veya yüksek"
elif egfr >= 60:
return "G2 · hafif azalmış"
elif egfr >= 45:
return "G3a · hafif–orta azalmış"
elif egfr >= 30:
return "G3b · orta–ağır azalmış"
elif egfr >= 15:
return "G4 · ağır azalmış"
else:
return "G5 · böbrek yetmezliği"
for deger in [95, 72, 59.6, 44, 20, 9]:
print(deger, "→", kdigo_evresi(deger))
95 → G1 · normal veya yüksek 72 → G2 · hafif azalmış 59.6 → G3a · hafif–orta azalmış 44 → G3b · orta–ağır azalmış 20 → G4 · ağır azalmış 9 → G5 · böbrek yetmezliği
Okuma sorusu: 59,6 hangi evreye düştü? Önce yuvarlasaydık ne olurdu? Kılavuz ne diyor?
4 · Üç hasta, tek fonksiyon¶
Fonksiyonun gücü: bir kez tanımla, istediğin kadar çağır.
hastalar = [
("Hasta A", 0.8, 32, "kadın"),
("Hasta B", 1.4, 68, "erkek"),
("Hasta C", 2.6, 75, "kadın"),
]
for ad, kre, yas, cins in hastalar:
e = egfr_hesapla(kre, yas, cins)
print(f"{ad}: eGFR {e:5.1f} → {kdigo_evresi(e)}")
Hasta A: eGFR 100.3 → G1 · normal veya yüksek Hasta B: eGFR 54.7 → G3a · hafif–orta azalmış Hasta C: eGFR 18.7 → G4 · ağır azalmış
5 · Bilerek hata: birim¶
Laboratuvar kreatinini µmol/L raporladı: 97. Fonksiyona olduğu gibi verirsek ne olur?
print(round(egfr_hesapla(97, 54, "kadın"))) # 97 µmol/L'yi mg/dL sanıyor
0
Sonuç saçma ama kod hata vermedi. Bu, yazılımın en sinsi hatası: çalışır, yanlış söyler. Çözüm, girdiyi kontrol etmek.
def egfr_guvenli(kreatinin, yas, cinsiyet):
"""Kreatinin 15'ten büyükse µmol/L varsayar ve mg/dL'ye çevirir (÷ 88,4)."""
if kreatinin > 15:
print(f"Uyarı: {kreatinin} µmol/L olarak yorumlandı → {kreatinin/88.4:.2f} mg/dL")
kreatinin = kreatinin / 88.4
return egfr_hesapla(kreatinin, yas, cinsiyet)
print(round(egfr_guvenli(97, 54, "kadın")))
Uyarı: 97 µmol/L olarak yorumlandı → 1.10 mg/dL 60
6 · Deneyin: VKİ ve bel/boy¶
Bu iki fonksiyon bilerek eksik bırakıldı. ... yerine formülü yazın ya da bir yapay zeka asistanına yazdırın; sonra okuyun.
- VKİ = kilo / boy² (boy metre)
- Bel/boy oranı = bel / boy (ikisi de cm); hedef < 0,5
def vki(kilo, boy_m):
"""Vücut kitle indeksi (kg/m²)."""
return ... # buraya formül
def bel_boy(bel_cm, boy_cm):
"""Bel/boy oranı; < 0.5 hedef."""
return ... # buraya formül
# print(round(vki(72, 1.74), 1))
# print(round(bel_boy(88, 174), 2))
Bugün ne okuduk?¶
| Kavram | Python'da | Tarayıcı aracında |
|---|---|---|
| Değişken | kreatinin = 1.1 |
const kre = ... |
| Tip dönüşümü | float("1.1") |
Number("1.1") |
| Fonksiyon | def egfr_hesapla(...) |
function egfrCkdEpi2021(...) |
| Koşul | if egfr >= 60: |
if (egfr >= 60) |
Eve: Bölüm 6'yı tamamlayın; kendi VKİ ve bel/boy oranınızı hesaplayın (sonucu paylaşmak zorunda değilsiniz).
Bölüm 6'nın cevabı — önce kendiniz deneyin, sonra açın
def vki(kilo, boy_m):
"""Vücut kitle indeksi (kg/m²)."""
return kilo / boy_m ** 2
def bel_boy(bel_cm, boy_cm):
"""Bel/boy oranı; < 0.5 hedef."""
return bel_cm / boy_cm
print(round(vki(72, 1.74), 1)) # 23.8
print(round(bel_boy(88, 174), 2)) # 0.51
İki noktaya dikkat: boy_m ** 2 ifadesi boyun karesi (Python'da üs alma ** ile yazılır) ve iki fonksiyonda boy farklı birimde. Birinde metre, diğerinde santimetre; parametre adlarına bunu bilerek yazdık. Aynı hastada VKİ normal sınırda çıkarken bel/boy oranının 0,5'i geçmesi, derste konuştuğumuz "normal kilolu santral obezite" durumunun ta kendisidir.