Ana içeriğe geç

pandas’ta pandasql Sorgularını Kullanarak SQL Nasıl Kullanılır

SQL’in gücünü pandas içinde açığa çıkarın ve pandasql kütüphanesini kullanarak SQL sorgularını pandas’ta ne zaman ve nasıl kullanacağınızı öğrenin.
· 8 dk. oku

Yapay Zeka ile Keşfedin

Bu eğitimde, pandas çerçevesinde SQL işlevselliğini ne zaman ve nasıl (ve ne zaman kullanamayacağımızı) kullanabileceğimizi ele alacağız. Ayrıca bu yaklaşımın çeşitli örneklerini inceleyip sonuçları yalnızca pandas ile yazılmış eşdeğer kodla karşılaştıracağız.

Neden pandas’ta SQL Kullanalım?

Pandas veri analizi için her şeyi kapsayan bir paketken neden SQL’i pandas ile birlikte kullanmak isteyelim?

Cevap şu: Bazı durumlarda, özellikle de karmaşık programlarda, SQL sorguları karşılık gelen pandas koduna kıyasla çok daha anlaşılır ve okunması kolay görünür. Bu, özellikle önce verilerle çalışmak için SQL kullanıp sonradan pandas öğrenen kişiler için geçerlidir.

SQL’in okunabilirliğini görmek için, çeşitli penguen bilgilerini içeren penguins adlı bir tabloya (dataframe) sahip olduğumuzu varsayalım (ve bu eğitimde ileride böyle bir tabloyla çalışacağız). Yalnızca erkek olan ve yüzgeç uzunluğu 210 mm’den fazla olan penguen türlerinin tüm benzersizlerini çıkarmak için pandas’ta şu koda ihtiyaç duyarız:

penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique()

Aynı bilgiyi SQL kullanarak elde etmek için ise aşağıdaki kodu çalıştırırız:

SELECT DISTINCT species FROM penguins WHERE sex = 'Male' AND flipper_length_mm > 210

SQL ile yazılmış ikinci kod parçası neredeyse doğal bir İngilizce cümle gibidir ve bu nedenle çok daha sezgiseldir. Okunabilirliğini birden çok satıra yayarak daha da artırabiliriz:

SELECT DISTINCT species
  FROM penguins 
 WHERE sex = 'Male' 
   AND flipper_length_mm > 210

Artık pandas için SQL kullanmanın avantajlarını belirlediğimize göre, ikisini teknik olarak nasıl birleştirebileceğimize bakalım.

pandasql Nasıl Kullanılır

pandasql Python kütüphanesi, herhangi bir SQL sunucusuna bağlanmaya gerek kalmadan SQL komutları çalıştırarak pandas dataframe’lerini sorgulamanıza olanak tanır. Arka planda SQLite söz dizimini kullanır, herhangi bir pandas dataframe’ini otomatik olarak algılar ve onu sıradan bir SQL tablosu gibi ele alır.

Ortamınızı hazırlama

Önce pandasql’i kurmamız gerekiyor:

pip install pandasql

Ardından gerekli paketleri içe aktarırız:

from pandasql import sqldf
import pandas as pd

Yukarıda, pandasql’den doğrudan sqldf() fonksiyonunu içe aktardık; bu, kütüphanenin pratikte tek anlamlı fonksiyonudur. Adının da önerdiği gibi, dataframe’leri SQL söz dizimiyle sorgulamak için kullanılır. Bu fonksiyona ek olarak pandasql, load_births() ve load_meat() gibi kendini açıklayan fonksiyonlarla yüklenebilen iki basit yerleşik veri kümesiyle birlikte gelir.

pandasql Söz Dizimi

sqldf() fonksiyonunun söz dizimi oldukça basittir:

sqldf(query, env=None)

Burada query, SQL sorgusunu string olarak alan zorunlu bir parametredir; env ise isteğe bağlı (ve nadiren faydalı) bir parametredir; locals() veya globals() olabilir ve sqldf() fonksiyonunun Python ortamınızdaki ilgili değişken kümesine erişmesine izin verir.

sqldf() fonksiyonu, bir sorgunun sonucunu pandas dataframe’i olarak döndürür.

pandasql’i ne zaman kullanabiliriz

pandasql kütüphanesi, SQL’in alt kümelerinden biri olan Veri Sorgulama Dili’ni (DQL) kullanarak verilerle çalışmaya olanak tanır. Başka bir deyişle, pandasql ile bir veritabanında depolanan veriler üzerinde gerekli bilgileri almak için sorgular çalıştırabiliriz. Özellikle verilere erişebilir, çıkarabilir, filtreleyebilir, sıralayabilir, gruplandırabilir, birleştirebilir, toplamalar yapabilir ve üzerinde matematiksel ya da mantıksal işlemler gerçekleştirebiliriz.

pandasql’i ne zaman kullanamayız

pandasql, DQL dışında SQL’in diğer alt kümelerinin kullanılmasına izin vermez. Bu, pandasql’i tabloları değiştirmek (güncellemek, budamak, eklemek vb.) veya bir tablodaki verileri değiştirmek (güncellemek, silmek veya eklemek) için uygulayamayacağımız anlamına gelir.

Ayrıca, bu kütüphane SQL söz dizimine dayandığı için, SQLite’taki bilinen tuhaflıklara karşı dikkatli olmalıyız.

pandasql kullanımı örnekleri

Şimdi, pandasql’in sqldf() fonksiyonunu kullanarak pandas dataframe’leri üzerinde SQL sorgularının nasıl çalıştırılacağına daha ayrıntılı bakalım. Alıştırma yapacak veri olması için, seaborn kütüphanesinin yerleşik veri kümelerinden biri olan penguins’i yükleyelim:

import seaborn as sns
penguins = sns.load_dataset('penguins')
print(penguins.head())

Çıktı:

   species island     bill_length_mm  bill_depth_mm  flipper_length_mm  \
0  Adelie  Torgersen            39.1           18.7              181.0   
1  Adelie  Torgersen            39.5           17.4              186.0   
2  Adelie  Torgersen            40.3           18.0              195.0   
3  Adelie  Torgersen             NaN            NaN                NaN   
4  Adelie  Torgersen            36.7           19.3              193.0   

   body_mass_g     sex  
0       3750.0    Male  
1       3800.0  Female  
2       3250.0  Female  
3          NaN     NaN  
4       3450.0  Female

SQL becerilerinizi tazelemeniz gerekiyorsa, SQL Fundamentals beceri yolumuz iyi bir referans noktasıdır.

pandasql ile veri çıkarma

print(sqldf('''SELECT species, island 
FROM penguins 
LIMIT 5'''))

Çıktı:

  species  island
0  Adelie  Torgersen
1  Adelie  Torgersen
2  Adelie  Torgersen
3  Adelie  Torgersen
4  Adelie  Torgersen

Yukarıda, penguins dataframe’inden ilk beş penguenin tür ve ada bilgilerini çıkardık. sqldf() fonksiyonunu çalıştırmanın bir pandas dataframe’i döndürdüğüne dikkat edin:

print(type(sqldf('''SELECT species, island 
                      FROM penguins 
                     LIMIT 5''')))

Çıktı:

<class 'pandas.core.frame.DataFrame'>

Yalnızca pandas ile şöyle olurdu:

print(penguins[['species', 'island']].head())

Çıktı:

   species island
0  Adelie  Torgersen
1  Adelie  Torgersen
2  Adelie  Torgersen
3  Adelie  Torgersen
4  Adelie  Torgersen

Bir diğer örnek, bir sütundaki benzersiz değerleri çıkarmaktır:

print(sqldf('''SELECT DISTINCT species 
                 FROM penguins'''))

Çıktı:

     species
0     Adelie
1  Chinstrap
2     Gentoo

Pandas’ta şöyle olurdu:

print(penguins['species'].unique())

Çıktı:

['Adelie' 'Chinstrap' 'Gentoo']

pandasql ile veri sıralama

print(sqldf('''SELECT body_mass_g 
                 FROM penguins 
                ORDER BY body_mass_g DESC 
                LIMIT 5'''))

Çıktı:

   body_mass_g
0       6300.0
1       6050.0
2       6000.0
3       6000.0
4       5950.0

Yukarıda, penguenleri vücut kütlesine göre azalan düzende sıraladık ve en yüksek beş vücut kütlesi değerini gösterdik.

Pandas’ta şöyle olurdu:

print(penguins['body_mass_g'].sort_values(ascending=False, 
ignore_index=True).head())

Çıktı:

0    6300.0
1    6050.0
2    6000.0
3    6000.0
4    5950.0
Name: body_mass_g, dtype: float64

pandasql ile veri filtreleme

Pandas’ta neden SQL kullanılır bölümünde bahsettiğimiz aynı örneği deneyelim: Yalnızca erkek olan ve yüzgeç uzunluğu 210 mm’den fazla olan penguen türlerinin benzersizlerini çıkarma:

print(sqldf('''SELECT DISTINCT species
                 FROM penguins 
                WHERE sex = 'Male' 
                  AND flipper_length_mm > 210'''))

Çıktı:

     species
0  Chinstrap
1     Gentoo

Yukarıda, verileri iki koşula göre filtreledik: sex = 'Male' ve flipper_length_mm > 210.

Pandas’taki aynı kod biraz daha göz korkutucu görünebilir:

print(penguins[(penguins['sex'] == 'Male') & (penguins['flipper_length_mm'] > 210)]['species'].unique())

Çıktı:

['Chinstrap' 'Gentoo']

pandasql ile gruplama ve toplulaştırma

Şimdi, dataframe’de her bir tür için en uzun gaga uzunluğunu bulmak üzere veri gruplama ve toplulaştırma uygulayalım:

print(sqldf('''SELECT species, MAX(bill_length_mm)
                 FROM penguins 
                GROUP BY species'''))

Çıktı:

     species  MAX(bill_length_mm)
0     Adelie                 46.0
1  Chinstrap                 58.0
2     Gentoo                 59.6

Pandas’taki aynı kod:

print(penguins[['species', 'bill_length_mm']].groupby('species', as_index=False).max())

Çıktı:

     species  bill_length_mm
0     Adelie            46.0
1  Chinstrap            58.0
2     Gentoo            59.6

pandasql ile matematiksel işlemler yapma

pandasql ile veriler üzerinde kolayca matematiksel veya mantıksal işlemler yapabiliriz. Diyelim ki her bir penguen için gaga uzunluğu/derinliği oranını hesaplamak ve bu ölçümün en yüksek beş değerini göstermek istiyoruz:

print(sqldf('''SELECT bill_length_mm / bill_depth_mm AS length_to_depth
                 FROM penguins
                ORDER BY length_to_depth DESC
                LIMIT 5'''))

Çıktı:

   length_to_depth
0         3.612676
1         3.510490
2         3.505882
3         3.492424
4         3.458599

Dikkat edin, bu kez oran değerlerini içeren sütun için length_to_depth takma adını kullandık. Aksi halde, bill_length_mm / bill_depth_mm gibi hantal bir sütun adı elde ederdik.

Pandas’ta ise önce oran değerleriyle yeni bir sütun oluşturmamız gerekir:

penguins['length_to_depth'] = penguins['bill_length_mm'] / penguins['bill_depth_mm']
print(penguins['length_to_depth'].sort_values(ascending=False, ignore_index=True).head())

Çıktı:

0    3.612676
1    3.510490
2    3.505882
3    3.492424
4    3.458599
Name: length_to_depth, dtype: float64

Sonuç

Özetle, bu eğitimde, daha iyi ve daha verimli kod yazmak için pandas için SQL işlevselliğini neden ve ne zaman birleştirebileceğimizi inceledik. Bu amaçla pandasql kütüphanesinin nasıl kurulup kullanılacağını ve bu paketin hangi sınırlamalara sahip olduğunu tartıştık. Son olarak, pandasql’in pratik uygulamasına dair çok sayıda popüler örneği ele aldık ve her durumda kodu pandas karşılığıyla kıyasladık.

Artık gerçek dünya projelerinde pandas için SQL uygulamak adına ihtiyaç duyduğunuz her şeye sahipsiniz. Pratik yapmak için harika bir yer, güçlü SQL desteğine sahip DataCamp’in yapay zekâ destekli veri not defteri DataLab’dir.

Konular

İlgili