Verimizi Hangisine Emanet Etmeliyiz? Pandaya Mı? Kutup Ayısına Mı?

Fethi Tekyaygil
4 min readMay 6, 2022

--

Hepimiz Veri Bilimi ve Yapay Zeka projelerimizde verilerimizi projemize aktarmakta ve veriler üzerinde belli istatistiksel ve manipülatif işlemler yapmaktayız. Önceki yazımda bu veri formatının genel kanı olarak csv olduğunu ama csv’den daha performanslı alternatifler olduğunu gördük:

Şimdi de tabular veriyi ön işleyebilmek ve analiz edebilmek için kullanılan en yaygın kütüphanelerden olan Pandas’ın da daha performanslı bir alternatifi olduğunu söyleseydim?

Hemen ohooo demeyin, bir şans verin. İşte karşınızda Polars kütüphanesi. (Pandas, Polars güzel isimlendirme çeşitleri :) )

Polars Nedir?

İşin hayvan boyutunu bir kenara bırakırsak Polars, Rust programlama dilinde yazılmış ve temel olarak Apache Arrow’u kullanan bir DataFrame kütüphanesidir. Rust dilinde de kullanılabilmesinin yanı sıra, eksiksiz bir Python API’si sunarak Python dilinde de geliştirme yapmanıza olanak sağlayan bu kütüphaneyi ister DataFrame kütüphanesi olarak ister de veri modelleriniz için backend sorgu motoru olarak kullanabilirsiniz. Daha detaylı bilgi için Polars’ın kendi sitesini buradan inceleyebilirsiniz.

Apache Arrow

Kendi sitesindeki tanıma göre Apache Arrow, CPU’lar ve GPU’lar gibi modern donanımlarda verimli analitik işlemler için düzenlenmiş, düz ve hiyerarşik veriler için dilden bağımsız bir sütunlu bellek biçimi tanımlar. Arrow, DBMS, sorgu motorları, DataFrame kütüphaneleri arasında aracı görevi görür.

Polars’ı Ne Zaman Kullanmalıyım?

Veriniz Pandas için çok büyük, Spark için çok küçük olduğunda Polars kesinlikle çok iyi bir çözüm.

Neden Polars?

Polars hızını, paralel yürütme için makinenizin birden çok çekirdeğini kullanmasına borçludur.

H20.ai veri manipüle eden tüm kütüphaneleri bir benchmark testine sokmuş. Bu testte veriler aggreagate edilip iki veri seti birleştirilmiş. Bu testler boyutları sırasıyla 0.2 GB, 5 GB, 50 GB olan veriler üzerinde gerçekleştirilmiş. Bu testle ilgili detaylara buradan ulaşabilirsiniz.

- Aggregation Testi

Aggregation testinde Polars, 143 saniye ile zirveyi domine etmişken Pandas out of memory hatasından dolayı işlemi tamamlayamamış bile.

Resim H20.ai sitesinden alınmıştır

- İki Veri Setini Birleştirme (Join) işlemi

İki Veri Setini Birleştirme işlemini Polars 43 saniyede yaparken, Pandas’ın bu işi yapması 628 saniye sürmektedir. Bu durumda bu işlem için Polars’ın Pandas’tan neredeyse 15 kat daha hızlı olduğunu görebiliriz.

Resim H20.ai sitesinden alınmıştır

- Diğer İşlemler

Aşağıda, Veri üzerinde yapabileceğimiz diğer işlemlerin Pandas ve Polars üzerindeki çalışma hızları verilmiştir. Bu benchmarkları ölçerken kullanılan veri seti 25 milyon kayda sahip 6.4 GB boyutunda bir veri setidir.

Resim https://www.analyticsvidhya.com/ sitesinden alınmıştır

Bu benchmark’a göre de Polars’ın Pandas’tan 2–3 kat daha hızlı olduğunu görebilirsiniz.

PAMUK ELLER KODA :)

Gelin ellerimizi kirletelim ve bu anlattıklarımızı kendimiz bir proje üzerinde teyit edelim. Bunun için önceki yazımda kullandığım nft verisetini kullanacağım. Verisetine buradan erişebilirsiniz. Ben csv uzantılı dosyayı parquet’e çevirip kullanacacağım. Bu yazımda csv dosyasını parquet’e çevirmeyi öğrenmiştik. Parquet dosyamın boyutu 534 MB’tır.

Çalışma zamanlarını ölçmek için Python’ın timeit modülünü kullanacağım.

Google Colab’i açıyorum ve yeni bir notebook oluşturuyorum.

CSV IMPORT ETME

Pandas Performansı

setup = "import pandas as pd"
mycode = '''
pd.read_parquet("/content/drive/MyDrive/ParquetCsvDataset/the-reddit-nft-dataset-comments.parquet")
'''
print(timeit.timeit(setup = setup, stmt = mycode, number = 100))

Parquet verimizi pandas ile okutunca bu işlemin 1127 saniye sürdüğünü görebiliriz.

Polars Performansı

!pip install polars
setup = "import polars as pl"
mycode = '''
pl.read_parquet("/content/drive/MyDrive/ParquetCsvDataset/the-reddit-nft-dataset-comments.parquet")
'''
print(timeit.timeit(setup = setup, stmt = mycode, number = 100))

Parquet verimizi polars ile okutunca bu işlemin 680 saniye sürdüğünü görebiliriz. Polars, pandas’tan daha kısa işlem süresine sahip oldu.

AGGREGATION İŞLEMİ

Verisetimizi subreddit.name kolonuna göre gruplayıp sentiment toplamlarını alacağız. Bu toplamları büyükten küçüğe sıralayarak sentiment ile score kolonlarını döndüreceğiz.

Pandas Performansı

Pandas bu aggregation işlemini 140 saniyede gerçekleştirdi.

Polars Performansı

Polars’ı Eager ve Lazy olarak iki şekilde kullanabilirsiniz. Biz burada lazy modda kullandık. Eager vs Lazy ile ilgili de bir yazı yayınlamayı planlıyorum o yüzden takipte kalın :)

Polars bu aggregation işlemini 90 saniyede gerçekleştirdi.

KAPANIŞ

Bu yazımızda Pandas’ın aslında en iyi çözüm olmadığını ve Polars isimli kütüphanenin performans optimizasyonu sağladığını öğrendik. Elbette ki kullanım konusunda son karar sizin :)

Sonraki yazılarım için beni takip etmeyi unutmayın, kendinize çok iyi bakın, veri bilimiyle kalın efendim, hoşçakalın :)

KAYNAKÇA:

  1. https://betterprogramming.pub/this-library-is-15-times-faster-than-pandas-7e49c0a17adc
  2. https://www.analyticsvidhya.com/blog/2021/06/polars-the-fastest-dataframe-library-youve-never-heard-of/#:~:text=3x%20faster%20than%20Pandas,-(mostly)&text=The%20dataset%20used%20is%20quite,Gb)%20with%2025%20million%20entries.&text=So%20as%20you%20can%20see,3%20times%20faster%20than%20Pandas.
  3. https://www.analyticsvidhya.com/blog/2021/02/is-pypolars-the-new-alternative-to-pandas/#:~:text=If%20you%20have%20a%20dataset,your%20machine%20for%20parallel%20execution.

--

--

Fethi Tekyaygil
Fethi Tekyaygil

Written by Fethi Tekyaygil

.NET Core Backend & Google Certified Tensorflow Developer — Flutter & Solidity Padawan — Animal Person

No responses yet