Tembel hileler: Pandas kodu yazmaktan nasıl kaçınacağınızı öğretin

Tam metin 4781 kelime ve beklenen öğrenme süresi 14 dakikadır

Kaynak: Pexels

Pandaların veri bilimi alanında tanıtılması gerekmez, yüksek performanslı, kullanımı kolay veri yapıları ve veri analiz araçları sağlar. Bununla birlikte, çok fazla veriyle uğraşırken, tek bir çekirdekteki Pandalar, fazlasıyla enerjiye sahip görünüyor ve herkesin performansı artırmak için farklı dağıtılmış sistemlere başvurması gerekiyor. Bununla birlikte, performansı iyileştirmenin değiş tokuşuna genellikle dik bir öğrenme eğrisi eşlik eder.

Ve herkes bu tür uçurumlardan olabildiğince kaçınmaya çalışıyor Tahmin edebileceğiniz gibi, hepsi pandalar kodunu yazmaktan nasıl kaçınacaklarına yöneldi.

Son 4 yılda, veri analizi için ana araç olarak pandaları kullanıyorum. "Pandas kodu yazmaktan nasıl kaçınılacağı" nın içeriğinin çoğunun pandalarla programlamanın ilk aşamalarından geldiği kabul edilmelidir. Kodu gözden geçirirken, hala birçok deneyimli programcının bazı popüler "nasıl kaçınılacağı" gönderilerine baktığını görüyorum.

Bu makalede, yazar önce bir "nasıl önlenir" örneğini gösterir ve ardından istatistikleri hesaplamak için doğru bir "nasıl kullanılır" pandalar yöntemi gösterir. İyileştirmeden sonra, kod daha kısa, okunması daha kolay ve yürütülmesi daha hızlı. Rapor süresinin formatı şu şekildedir: döngü başına 831 ms ± 25.7 ms, bu da ortalama 831 milisaniye ve 25.7 milisaniyelik standart sapma anlamına gelir. Her kod örneği, doğru yürütme süresini hesaplamak için birden çok kez yürütülür.

Her zaman olduğu gibi, JupyterNotebook'u indirebilir ve bilgisayarınızda deneyebilirsiniz.

Pandalar oyun yolculuğuna başlamak için lütfen aşağıdaki kaynakları okuyun:

  • 5 az bilinen panda numarası
  • Keşif amaçlı veri analizi için pandaları kullanın

Kaynak: Pexels

Kurmak

  • platformdan importpython_versionimport numpy np olarak
  • Pandaları pdnp.random.seed (42) olarak içe aktarın # örnekleri tekrarlanabilir kılmak için tohum ayarlayın
  • Örnek veri seti

    Örnek veri seti, her şehir için rezervasyon bilgilerini içerir, rasgele ve tek amaç, örneği göstermektir.

    Veri kümesinin üç sütunu vardır:

    • kimlik, benzersiz kimlik anlamına gelir
    • şehir önceden belirlenmiş şehir bilgilerini temsil eder
    • ayrılmış yüzde, belirli bir zamanda ayrılan yüzdeyi temsil eder

    Hız artışını daha belirgin hale getiren on bin veri seti vardır. Kod doğru pandalar biçiminde yazılırsa, pandaların DataFrames'i milyonlarca (hatta milyarlarca) istatistik satırı hesaplamak için kullanabileceğini unutmayın.

  • size = 10000cities = df = pd.DataFrame (
  • {"city": np.random.choice (şehirler, beden = beden), "rezerve_perc": np.random.rand (beden)}
  • )
  • df = df.index.map (str) + "-" + df.city
  • df = df
  • df.head ()
  • 1. Verileri özetlemekten nasıl kaçınılır

    Rolling Panda / Reddit

    Java dünyasından esinlenilen "döngü için çok satırlı" Python'a uygulandı.

    Ayrılmış yüzde sütununun toplamını hesaplamak, yüzdeleri toplamak anlamsız, ama yine de deneyelim ve alıştırma yapalım.

  • %% timeitsuma = 0
  • _ için, df.iterrows () satır:
  • suma + = row.booked_perc766ms ± 20.9 ms döngü başına (ortalama ± std. sapma 7 çalıştırma, her biri 1 döngü)
  • Sütunları toplamanın daha Python tarzı bir yolu aşağıdaki gibidir:

  • %% timeitsum (df.booked_perc cinsinden ayrılmış_perc forbooked_perc) 989 µs ± 18.5 µs döngü başına (ortalama ± standart dev. 7 çalıştırma, her biri 1000 döngü) %% timeitdf.booked_perc.sum () 92µs ± 2.21 µs döngü başına (ortalama ± standart dev. 7 çalıştırma, her biri 10000 döngü)
  • Beklendiği gibi, ilk örnek en yavaş olanıdır - on bin öğeyi toplamak neredeyse 1 saniye sürer. İkinci örneğin hızı şaşırtıcı.

    Doğru yol, verileri toplamak için pandaları kullanmaktır (veya sütunlarda başka herhangi bir işlemi kullanmaktır) Bu üçüncü örnektir ve en hızlısı!

    2. Verileri filtrelemekten nasıl kaçınılır

    Panda / Giphy Oynamak

    Pandaları kullanmadan önce, numpy'ye zaten aşinaydım ve verileri filtrelemek için bir for döngüsü kullandım. Toplarken, performanstaki fark hala gözlemlenebilir.

  • %% timeitsuma = 0
  • _ için, df.iterrows () satır:
  • row.booked_perc ise < = 0.5:
  • suma + = row.booked_perc831ms döngü başına ± 25,7 ms (ortalama ± standart sapma 7 çalıştırma, her biri 1 döngü) %% timeitdf.booked_perc.sum () Döngü başına 724 µs ± 18,8 µs (ortalama ± standart sapma 7 çalıştırma, her biri 1000 döngü)
  • Beklendiği gibi, ikinci örnek ilkinden çok daha hızlı

    Ya daha fazla filtre eklenirse? Parantez içine ekleyin

  • %% timeitdf.booked_perc.sum () 1.55ms ± 10.7 µs döngü başına (ortalama ± standart sapma 7 çalıştırma, her biri 1000 döngü)
  • 3. Önceki değerlere erişimden nasıl kaçınılır

    Yuvarlanan Panda / Giphy

    Şöyle diyebilirsiniz: Tamam, ancak önceki bir sütunun değerine erişmeniz gerekiyorsa, yine de bir for döngüsüne ihtiyacınız var. Hatalısınız!

    Bir satırdan diğerine yüzde değişimini hesaplamak için döngüler için ve olmadan kullanın

  • %% timeit for i inrange (1, len (df)):
  • df.loc = (df.loc .booked_perc- df.loc .booked_perc) / df.loc.booked_perc7.02 s ± 24.4 ms döngü başına (ortalama ± standart sapma 7 çalıştırma, her biri 1 döngü) %% timeitdf = df.booked_perc.pct_change () döngü başına 586µs ± 17.3 µs (ortalama ± standart dev. 7 çalıştırma, her biri 1000 döngü)
  • Benzer şekilde, ikinci örnek, for döngüsü kullanan ilk örnekten çok daha hızlıdır.

    Pandaların, önceki değerlere dayalı olarak istatistikleri hesaplamak için birçok işlevi vardır (örneğin, kaydırma işlevi değerleri kaydırır). Bu işlevler dönemler parametresini kabul eder ve hesaplamaya önceki değerlerin sayısını içerebilir.

    4. Karmaşık işlevleri kullanmaktan nasıl kaçınılır

    Kaynak: Düşen Panda (National Geographic) Giphy

    Bazen DataFrame'de karmaşık işlevleri (çok değişkenli işlevler) kullanmanız gerekir. New York'taki booking_perc değerini çiftler halinde çarpalım, diğerlerini 0 olarak ayarlayalım ve bu sütunu sales_factor olarak adlandıralım.

    Yazar ilk olarak döngü için yinelemeler kullanmayı düşündü

  • %% timeitfor i, df.iterrows'daki satır ():
  • row.city == 'new york' ise:
  • df.loc = row.booked_perc * 2
  • Başka:
  • df.loc = 03.58 s ± 48.2 ms döngü başına (ortalama ± standart sapma 7 çalıştırma, her biri 1 döngü)
  • Daha iyi bir yol, işlevi doğrudan DataFrame üzerinde kullanmaktır

  • %% timeitdef calculate_sales_factor (satır):
  • row.city == 'new york' ise:
  • return row.booked_perc * 2
  • dönüş 0df = df.apply (hesap_satış_faktörü, eksen = 1) 165 ms ± 2,48 ms döngü başına (ortalama ± standart sapma 7 çalıştırma, her biri 10 döngü)
  • En hızlı yol, fonksiyon değerini doğrudan hesaplamak için pandalar filtresini kullanmaktır

  • %% timeit df.loc = df.booked_perc * 2
  • df.sales_factor.fillna (0, yerinde = Doğru) 3,03 ms ± 85,5 µsper döngü (ortalama ± standart sapma 7 çalıştırma, her biri 100 döngü)
  • İlk örnekten son örneğe olan ivmeyi görebilirsiniz.

    3 veya daha fazla değişkenli bir işlevi çözerken, birden çok pandas ifadesine ayrıştırılabilir. Bu, işlevleri kullanmaktan daha hızlıdır.

  • Örneğin: f (x, a, b) = (a + b) * x
  • df = df + df
  • df = df * df
  • 5. Verileri gruplamaktan nasıl kaçınılır

    Tickle Panda / Giphy

    Şimdi, pandaları kullanmaya başlamadan önce, döngüler için daha çok güvendiğimi görebilirsiniz. Verileri gruplamaya gelince, pandaların avantajlarından tam anlamıyla faydalanırsanız, kod satırlarının sayısını azaltabilirsiniz.

    Aşağıdaki verileri hesaplamak için:

    • Bir şehrin ortalama satış faktörü
    • Bir şehrin ilk rezervasyon kimliği
  • %% timeit avg_by_city = {}
  • count_by_city = {}
  • first_booking_by_city = {} i için, df.iterrows'da satır ():
  • city = row.city
  • avg_by_city içinde şehir ise:
  • avg_by_city + = row.sales_factor
  • count_by_city + = 1
  • Başka:
  • avg_by_city = row.sales_factor
  • count_by_city = 1
  • first_booking_by_city = şehir için row, _ içinde avg_by_city.items ():
  • avg_by_city / = count_by_city878 ms ± 21,4 ms döngü başına (ortalama ± std. sapma 7 çalıştırma, 1 döngüsel)
  • Pandaların bir gruplama işlemi vardır, bu nedenle DataFrame üzerinde yineleme yapmaya gerek yoktur.Pandaların gruplama işlemi SQL GROUP BY deyimiyle aynıdır.

  • %% timeitdf.groupby ('şehir'). sales_factor.mean ()
  • df.groupby ('şehir']. sales_factor.count ()
  • df.groupby ('şehir'). id.first () 3,05 ms ± 65,3 µs döngü başına (ortalama ± standart dev. 7 çalıştırma, her biri 100 döngü) %% timeitdf.groupby ("şehir"). agg ({ "sales_factor" :, "id": "ilk"}) 4,5 ms ± 131 µs döngü başına (ortalama ± standart sapma 7 çalıştırma, her biri 100 döngü)
  • Şaşırtıcı bir şekilde, üçüncü örnek en hızlı değil, ancak ikinciden daha özlü. Yazar, hızlandırılmış koda ihtiyacınız varsa ikinci yöntemi kullanmanızı önerir.

    Mutlu Panda / Giphy

    Son olarak Xiaoxin'in önerisi şudur: Bir for döngüsü yazmak için pandaları kullanmanız gerekiyorsa, onu yazmanın daha iyi bir yolu olmalıdır.

    Büyük miktarda hesaplamaya sahip bazı işlevler olacaktır, yukarıdaki optimizasyon yöntemleri bile geçersiz olacaktır. O halde son çare olan Cython ve Numba'yı kullanmalıyız.

    Gelin bu yöntemleri birlikte deneyelim, beklenmedik kazançlar olacak ~

    Yorum Beğen Takip Et

    Yapay zeka öğrenme ve geliştirmenin kuru mallarını paylaşalım

    Yeniden yazdırıyorsanız, lütfen arka planda bir mesaj bırakın ve yeniden yazdırma şartnamelerine uyun

    Yetersiz zaman? Pandaların daha hızlı uygulanmasını sağlamak için bu kelimeyi ekleyin
    önceki
    Core Voice Today | Yeni Yıl! CCTV 2019 bilim ve teknoloji haberlerini duyurdu, bunu biliyor musunuz?
    Sonraki
    Irak parlamentosu, yabancı askerlerin konuşlandırılmasına son verme kararı aldı
    Kalbini ısıt! Yaşlı adam büyüteci aldı ve bu teşekkür mektubunu sağlık personeline yazdı ...
    Yeni yılda ilk kez toplam RRR düşürülecek Bugün 800 milyardan fazla kırmızı zarftan kim faydalanacak?
    Aşırı fakir köyün ilk sekreteri zamana karşı yarışıyor: 20 ayda 100.000 mil yol aldı ve 15 lastiği değiştirdi | Araştırma · Gözlem
    Çatışmanın tırmanması! Irak birçok yerde bombalandı ve ABD askerleri arttı Orta Doğu savaşı yeniden alevlendirecek mi?
    90'lar sonrası "küçük kardeş" Pekin'e giren insanlara sıcak bir şekilde "eve" gitmeleri için eşlik etti.
    Liuzhou, Guangxi, yoksul insanların yoksulluktan kurtulmalarına yardımcı olmak için elde taşınır video görüşme platformunu başlattı
    Mango TV'nin anti-salgın kısa draması "Bir gün kazanacak", ön saflardaki sağlık çalışanlarına saygı duruşunda bulunuyor
    Lin Zhifang: "Kes" mutluluk
    Jinan City Kültür Merkezi açılmaya devam ediyor, iki büyük folklor sergisi sizi bekliyor
    Pekin'de ilk bahar sergisi açıldı ve 12 sanat ustası salgın altında "Ben kimim" diye sordu?
    Hubei'ye yardım eden 47 Shenzhen sağlık ekibi üyesi geri döndü, şehir bu gece evdeki en güzel retrogradları karşılamak için aydınlattı
    To Top