Veri analitiğinde sıkça karşılaşılan bir işlem, tekrar eden satırları kaldırmaktır. Bu işlem, özellikle Veri Çıkarma, Dönüştürme ve Yükleme (ETL) süreçlerinde kritik öneme sahiptir. Çünkü en son kayıtları incelemek, bir anahtarın ilk kez göründüğü zamanı bulmak veya verilerin içindeki tüm tekrarları tamamen kaldırmak isteyebilirsiniz. Hangi satırların saklanacağı ve satır sıralaması, sonraki işleme aşamalarını etkilemektedir.
RAPIDS, veri bilimi ekosistemi için optimize edilmiş GPU hızlandırıcılı açık kaynak kütüphaneler sunmaktadır. RAPIDS cuDF, pandas uygulamalarında, herhangi bir kod değişikliği olmadan NVIDIA GPU’lar üzerinde süper hızlı DataFrame analitiği için optimize edilmiş algoritmalar sağlar.
Bu yazıda, cuDF’deki hızlı ve doğru tekrarları kaldırma algoritmalarını ve veri yapılarını inceleyeceğiz. cuDF’nin, pandas’da popüler olan DataFrame.drop_duplicates
yöntemini nasıl uyguladığını göstereceğiz. Herhangi bir uygulama kodu değişikliği olmadan %100 hızlı sonuçlar elde edeceğiz.
pandas’ta drop_duplicates
ile Tanışma
Pandas’ta drop_duplicates
işlevinin en önemli yönü, keep
seçeneğidir; bu seçenek hangi tekrarların korunacağını belirler. Aşağıdaki seçenekler, pandas drop_duplicates belgeleri‘nde tanımlanmaktadır:
"first"
: İlk örneği hariç tüm tekrarları kaldırır"last"
: Son örneği hariç tüm tekrarları kaldırırFalse
: Tüm tekrarları kaldırır
Aşağıdaki kod parçası, farklı seçenekleri gösterir:
import pandas as pd
df = pd.DataFrame({"key": [0, 0, 0, 1, 1, 2, 2], "values": [1, 2, 3, 4, 5, 6, 7]})
df.drop_duplicates(subset=["key"], keep="first")
df.drop_duplicates(subset=["key"], keep="last")
df.drop_duplicates(subset=["key"], keep=False)
Stabil Sıralama
Stabil sıralama, drop_duplicates
yöntemi için bir diğer kritik noktadır; bu durum, çıktı satırlarının girişten gelen orijinal sırasını koruması anlamına gelir. Stabil sıralama sağlanamadığında, algoritma arzulanan tekrarları (ilk, son ya da hiç) herhangi bir sırayla döndürebilir. Tekil algoritmalar için stabil sıralama sağlamak oldukça basit olabilir. Ancak, GPU üzerinde çalışan algoritmalarda bu durum her zaman geçerli olmayabilir. Stabil sıralama gereksinimlerini sonraki bölümlerde daha detaylı inceleyeceğiz.
CUDA C++ ile drop_duplicates
Çözümü
cuDF, pandas API’leri, DataFrame
oluşturucuları gibi tüm yöntemleri çağırdığında, libcudf
CUDA C++ kütüphanesini kullanarak GPU üzerinde işlemleri gerçekleştirmektedir. cudf.pandas arayüzü, panda API’sının tamamını destekleyerek, mevcut pandas kodlarını değiştirmeksizin hızlandırmaktadır. Eğer GPU üzerinde işlem yapma başarısız olursa CPU panda işlemlerine dönüşüm sağlar.
Bu özelliği sağlamak için hür CUDA C++ kodlarının libcudf’te pandas’daki tüm seçenekleri desteklemesi gerekmektedir. Bunun yaninda, tekrarları kaldırma sorununu çözmek için, C++ Standart Kütüphanesi ve benzer algoritmik primitif kütüphanelerden yardım alacağız. Örneğin, CCCL de bu konudaki ilham kaynaklarımız arasındadır.
İki temel C++ algoritması ile veri tekrarı ile başa çıkma yöntemine bakalım:
std::unique
ve std::unordered_set
std::unique: Sıralı bir aralıktaki art arda gelen tekrarlayan elemanları kaldırır. Ancak tüm tekrarları kaldırmak için aralığın sıralanmış olması gerekir ve alternatif indeksleri takip etmeniz gerekir. Bu belirli bir karmaşıklık yaratır.
Aşağıdaki kod, std::unique
‘ün nasıl kullanılacağını gösterir:
#include
#include
#include
int main() {
std::vector vec = {1, 2, 2, 3, 4, 4, 2, 2};
auto it = std::unique(vec.begin(), vec.end());
vec.erase(it, vec.end());
for (int n : vec) {
std::cout
std::unordered_set: Tekrarları kaldırmak için bir hash tabanı yapısı kullanarak doğrudan bir yol sunar, ancak yapıların sırasını sağlamaz.
Aşağıdaki kod std::unordered_set
kullanımını göstermektedir:
#include
#include
#include
int main() {
std::vector vec = {1, 2, 2, 3, 4, 4, 2, 2};
std::unordered_set s(vec.begin(), vec.end());
for (int n : s) {
std::cout
C++ STL, veri tekrarlarını kaldırmak için iki yöntem sunsa da, ne yazık ki bu yöntemler pandas’ın işleyişine uyum sağlamaz. std::unique
sadece komşu tekrarlayan elemanları kaldırdığından, her tekrarı kaldırmak için sıralama yapmak ve ardından giriş sırasına göre tekrar sıralama yapmak gerekecektir.
distinct
Algoritmasını Tanıtalım
Hedefimizi gerçekleştirmenin uygun bir yolu bulamamak nedeniyle cudf::distinct adını verdiğimiz bir algoritma geliştiriyoruz. cudf::stable_distinct
ise sıralama düzenini korumak için kullanılır. Bu, cudf::unique
‘dan daha farklıdır, çünkü o yalnızca komşu tekrarları dikkate alır. Bu nedenle kullandığımız isimler, işlevin teşkil ettiği işleyişi açıkça yansıtmaktadır.
distinct
için Hash Tabanlı Çözüm
CUDA C++ algoritmalarında hash tabanlı yaklaşımlar kullanmak, yüksek performans sağlayan eşzamanlı veri yapılarını kullanmamıza olanak tanır. Burada cuCollections kütüphanesini kullanarak işlemlerimizi gerçekleştirmekteyiz. cudf::distinct algoritmaları, tekrar eden değerlerin ilk ya da son hangi değer olduğunu ve giriş sırasını takip etmek zorundadır.
Özetle, geliştirilen algoritma, giriş değerleri ile eşleşen elemanları içeren bir harita sunar. İki anahtar durumunu ele alarak keep
seçeneklerini destekler. keep="any"
önemli olan göre, bu seçim uygulamada en iyi performansı getirir.
Sonuç ve Performans Değerlendirmesi
Genel olarak, distinct algoritmalarında iyi bir veri akışı gözlemlenmektedir. Bu performans avantajlarının yanına keep
seçeneklerini dikkate almak, uygulamanızı hızlandıracaktır. cuDF, hem yüksek veri boyutları hem de verimlilik açısından mükemmel bir analistik fırsatlar sunmaktadır. API’lerimizle ilgili daha fazla bilgi için cuDF belgelerini ziyaret edebilirsiniz.
Grafiksel analiz üzerinden performans durumlarını değerlendirirken, farklı veri büyüklüklerini ve *kardinalite* durumlarını göz önünde bulundurarak çeşitli *performans bilançoları* elde edilebilir. Örneğin, KEEP_ANY
ve KEEP_FIRST
seçeneklerinin, verinin büyüklüğü ve yalnızca bazı faktörlere bağlı olarak çıkış oranları arasında farklılıklar olabilmektedir.
Başarılı sonuçlar elde etmek için, raporlarımızı yönetmeye ve analitik süreçlerinizi hızlandırmaya her zaman açık olmalısınız.