Bu proje ödevime yardımcı olabilir misiniz?

Şimdi şöyle bir fonksiyon yazdım:

import pandas as pd

def chickenpox_by_sex():
    
    df = pd.read_csv("assets/NISPUF17.csv")
    eg=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "YES")]
    kg=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "YES")]
    egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")]
    kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")]
    eo=len(eg)/len(egm)
    ko=len(kg)/len(kgm)
    liste1=[eo, ko]
    liste2=["male", "female"]

    return dict(zip(liste2, liste1))

Fonksiyonun devamı da var, fakat burayı değiştirmem yasak, yukarıdaki benim yazdığım kısmı bu alttakine göre inşa edeceğim. Fonksiyon bunla birlikte çalışacak:

assert len(chickenpox_by_sex())==2, "Return a dictionary with two items, the first for males and the second for females."

Benim yazdıklarım şöyle bir hata veriyor:

ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-12-8b72455a9179> in <module>
----> 1 assert len(chickenpox_by_sex())==2, "Return a dictionary with two items, the first for males and the second for females."

<ipython-input-11-00cdd280172b> in chickenpox_by_sex()
      8     egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")].dropna()
      9     kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")].dropna()
---> 10     eo=len(eg)/len(egm)
     11     ko=len(kg)/len(kgm)
     12     liste1=[eo, ko]

ZeroDivisionError: division by zero

Yardımcı olursanız çok müteşekkir kalırım, Bu projeden sonra bir tane proje kalıyor, sonra sertifika alacağım, büyük iyilik yaparsınız. İlgili dosya linkini burada tekrar paylaşıyorum:
Doğru link: https://s7.dosya.tc/server18/tb6d37/NISPUF17.csv.html

Dipnot: benim de aklıma class yazmak ve__len__ kullanmak geldi…

Python’da ZeroDivisionError bir sayı 0’a bölünmeye çalışıldığında ortaya çıkıyor ve hata çıktısında da hatanın nerede olduğu gözüküyor. 10. ve 11. satılarda bölme işlemi yapıyorsunuz ve bunlardan 10. satırdakinde len(egm) 0 değer döndürüyor. Bölme işlemlerinden önce yazacağınız if koşullu kontrolleri ile hata almanın önüne geçebilirsiniz.

Dostum, 0 değer olmadığını göstermek için:
image
bak sonucu da bu:
image
Yani 0’lık bir çıktı da yok. Anlamadım.
Çözüm için bana nasıl bir kod yazmamı önerirsin.
Aynı durum, aslında diğer açtığım başlık için de geçerli bu arada…

Bu nasıl bir çözüm sağlayacak?

len(egm) hep aynı değeri mi alıyor ki? Bana bazen 0 bazen de değilmiş gibi geldi. Eğer hep aynı değeri alıyorsa sorunu çözmüşsünüz zaten, print kısmı çalışabiliyorsa hata verilmiyordur.

Bu nasıl bir çözüm sağlayacak?

Bu fikri söylemesinler diye söyledim.
Class’larda, böyle bir “len()” ile bir sayım yapmak için, self ile __ len__ i bağladığımızda bu işlemi gerçekleştirebiliyoruz. Yani len() ile örnekleme=sınıf_ismi() olan bir çıktıyı bağlayarak sayabiliyoruz. Ama sorun şu ki, kurs sınavını yapanlar yukarıda bahsettiğim assert ile başlayan kod satırını değiştirmeme izin vermiyor. İlla ki len’e fonksiyon değerini döndürmek zorundayım.

len(egm) hep aynı değeri mi alıyor ki? Bana bazen 0 bazen de değilmiş gibi geldi. Eğer hep aynı değeri alıyorsa sorunu çözmüşsünüz zaten, print kısmı çalışabiliyorsa hata verilmiyordur.

Onu da denedim
image
görüldüğü gibi boş değil o da:
image

Valla print kısmı çalışıyor, ama söylediğim hatayı döndürüyor, istersen linki verdim csv dosyasının, indirip deneyebilirsin. Kodlar yukarıda. Çözersen valla büyük sevap işlersin. :smiley:

Kimse yok mu yahu şu kodlara bir çözüm bulan, help?

En başta yazdığınız ZeroDivisionError hatası len(egm)'nin 0 olmasından kaynaklanıyordu. Siz şimdi len(egm)'nin 0 olmadığını söylüyorsunuz, o halde problem ne?

Hata döndürmek ne demek? Verdiğiniz kodlara baktığımda hata verildi ise print kısmının çalışmaması gerektiğini görebiliyorum.

Yani fonksiyon mantıken çalışıyor, fakat hatayı veriyor, elbette hata döndürmek saçma bir argüman oldu. Ama şimdi bu cümledeki argüman kelimesini de genel olarak kullandığıma göre, bu çok önemli bir konu değil :smiley:
Ya ekrem mentor, yemin ederim elimden geleni yaptım, hata veriyor paso. Kodları denedin mi görürsün zaten.

Çalıştırdım, hata falan almıyorum. Sadece şöyle bir uyarı veriliyor:

Warning (from warnings module):
  File "C:\Users\User\AppData\Local\Programs\Python\Python38\lib\idlelib\run.py", line 155
    ret = method(*args, **kwargs)
DtypeWarning: Columns (13,375,384,393,394,402,403,408,409,420,421,429,444) have mixed types.Specify dtype option on import or set low_memory=False.

Valla bende hata veriyor abi anlamadım gitti.

Hata ne?

Abi ben bunları bir kurs projesini geçmek için yazıyorum. Benim ıdle, spyder’da felan bu sınav kodlarının ikisi de hata vermiyor, ama bir sonuç da döndürmüyor.

Ben size deneyin diye veriyorum. Şimdi ikisini de tamamen atıyorum. Aynı csv dosyası ile yapabilirsin. Hatayı ise, sınav projesini verdiğim Jupyter dosyasında alıyorum, bende hata yok, ama sonuç da dönmüyor, boş değer var çıktı olarak.
Kodlar iki kısma ayrılıyor, projede benim istenen değerleri bulduğum kısım ve değiştirelemez, fonksiyonu len’in içine gömdükleri kısım(Fonskiyonu buranın çıktı vereceği şekilde yazıyorum).
Kodlar ve Sınav Jupyter Dosyası ile aldığım hatalar:
Kod 1:

import pandas as pd

def average_influenza_doses():
    # YOUR CODE HERE
    dem=list()
    def convert(*list):
        return tuple(*list)
    
    df = pd.read_csv("assets/NISPUF17.csv")
    lyes=len(df.CBF_01[df.CBF_01 == "YES"])
    lno=len(df.CBF_01[df.CBF_01 == "NO"])
    sumdata=lyes+lno
    a=sumdata/lyes
    b=sumdata/lno
    x=round(a,1)
    y=round(b,1)
    dem.append(x)
    dem.append(y)

    
    convert(dem)

assert len(average_influenza_doses())==2, "Return two values in a tuple, the first for yes and the second for no."

Kod 1 Hatası:

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-27-380749c0010d> in <module>
----> 1 assert len(average_influenza_doses())==2, "Return two values in a tuple, the first for yes and the second for no."

<ipython-input-26-5457ad3b8b21> in average_influenza_doses()
     11     lno=len(df.CBF_01[df.CBF_01 == "NO"])
     12     sumdata=lyes+lno
---> 13     a=sumdata/lyes
     14     b=sumdata/lno
     15     x=round(a,1)

ZeroDivisionError: division by zero

Kod 2:

import pandas as pd

def chickenpox_by_sex():
    
    def con_list_to_dict(*list):
        return dict(zip(*list))
    
    df = pd.read_csv(r"yol\NISPUF17.csv")
    eg=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "YES")]
    kg=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "YES")]
    egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")]
    kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")]
    eo=len(eg)/len(egm)
    ko=len(kg)/len(kgm)
    x=round(eo,4)
    y=round(ko,4)
    liste1=[x, y]
    liste2=["male", "female"]
    
    return con_list_to_dict(liste2, liste1)
assert len(chickenpox_by_sex())==2, "Return a dictionary with two items, the first for males and the second for females."

Kod 2 hatası:

---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-16-8b72455a9179> in <module>
----> 1 assert len(chickenpox_by_sex())==2, "Return a dictionary with two items, the first for males and the second for females."

<ipython-input-15-7f0412701e34> in chickenpox_by_sex()
      8     egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")]
      9     kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")]
---> 10     eo=len(eg)/len(egm)
     11     ko=len(kg)/len(kgm)
     12     liste1=[eo, ko]

ZeroDivisionError: division by zero

Şunları çözen olursa, kendisine duacı olacağım.

__ len__ kullandım, o bile olmadı :

import pandas as pd

def chickenpox_by_sex():
    

    
    def con_list_to_dict(*list):
        return dict(zip(*list))
    
    df = pd.read_csv(r"yol\NISPUF17.csv")
    eg=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "YES")]
    kg=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "YES")]
    egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")]
    kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")]
    eo=len(eg)/len(egm)
    ko=len(kg)/len(kgm)
    x=round(eo,4)
    y=round(ko,4)
    liste1=[x, y]
    liste2=["male", "female"]

    def __len__(self):
        return self.con_list_to_dict(liste2, liste1)
    
    return con_list_to_dict(liste2, liste1)

Çeşit çeşit __ len__ ler kullandım, onlar bile beni terk ettiler birer birer…

import pandas as pd

def chickenpox_by_sex():
    

    
    def con_list_to_dict(*list):
        return dict(zip(*list))
    
    df = pd.read_csv("assets/NISPUF17.csv")
    eg=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "YES")]
    kg=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "YES")]
    egm=df[(df['SEX'] == "MALE") & (df['HAD_CPOX'] == "NO")]
    kgm=df[(df['SEX'] == "FEMALE") & (df['HAD_CPOX'] == "NO")]
    eo=len(eg)/len(egm)
    ko=len(kg)/len(kgm)
    x=round(eo,4)
    y=round(ko,4)
    liste1=[x, y]
    liste2=["male", "female"]

    def __len__(self):
        return self.con_list_to_dict(liste2, liste1)
    res=chickenpox_by_sex()
    return res

Kodun sonuç döndürmesinden kastınız ne? Ekrana yazı yazılması mı?

Jupyter dosyası kısmını anlamadım, daha önce hiç jupyter kullanmadım.

ZeroDivisionError hatasının sebebi lyes’in 0 olması.

Burada da len(egm)'nin değeri 0.

__len__ fonksiyonunun, başka herhangi bir fonksiyon içinde özel bir tarafı yok. Bir metot olduğunda len fonksiyonu tarafından kullanılıyor.

__len__ konusuna bir daha göz atın bence. Buradaki sorununuz ile de alakası olduğunu sanmıyorum.

Ekrem abi o değerler 0 değil. İstersen kodları yaz, len ile dene, 0 olmadığını göreceksin. O değerler 0 değil.

Iki atimlik kursunum daha kaldi:


Shanyu kardes kod calisiyor. Istersen dosyaya yaz, python ile dene, calistiklarini goreceksin. O kod calisiyor.


Yazdiklarin ZeroDivisionError veriyorsa

bu screenshot’u/ciktiyi nereden aldin?

Ben de denedim kodlar çalışıyor, yanlış anlamadıysam bir mesajınızda hata vermiyor sonuç da döndürmüyor demişsiniz fakat assert’e gönderdiğiniz koşul doğruysa bir şey dönmemesi gayet normal ayrıca pd.read_csv(“csvdosayası”,low_memory=False) dener misiniz bir değişiklik olacak mı merak ediyorum.

Kendi spyder’ımda denediğim çıktı bu yahu. Fakat şuan kursta yanlış csv dosyasını indirmişim galiba. Gece yeni dosyayı yükleyip döndürdüm. Farklı bir hata alıyorum. Henüz uyandım, hatayı paylaşacağım, yeni csv’yi de.