NumPy vs. Pandas 📚
Merhaba! 8. yazımda Miuul Data Science Bootcamp ’ inde öğrendiğim bilgileri aktaracağım. Bu yazıda, veri bilimi dünyasında vazgeçilmez olan Python’ ın iki önemli kütüphanesi olan NumPy ve Pandas’ a odaklanacağız. Peki, bu kütüphaneler nedir ve neden veri bilimi alanında çığır açan öneme sahiptir ? Hadi, başlayalım! ✨
🛑 NumPy
Numerical Python’ın kısaltmasıdır.
- Python dünyasında matematik ve istatistik konularında öne çıkan temel kütüphanelerden biri olarak bilinir.
- Bilimsel hesaplamalar için kullanılır.
- Çok boyutlu arrayler, matrisler üzerinde yüksek performans ile çalışma imkanı sağlar.
NumPy’ın listelerden farkı nedir ❓
☞ Farkı, verimli veri saklama ve vektörel operasyonlardır ( yüksek seviyeli işlemler )
Vektörel operasyon 👉🏻 NumPy; içerisinde bir veri tutarken, bunu fixed type adını verdiği sabitlenmiş tipte tutarak listelere kıyasla çok daha hızlı bir şekilde işlem yapma imkanı sağlar.
Döngü yazmaya gerek kalmadan basit şekilde gerçekleştirme imkanı sağlar.
1️⃣ Neden Numpy ❓
- Hız 👉🏻 bunu sabit tipte veri tutarak gerçekleştiriyor.
- Vektörel seviyede işlemlerle az çaba harcayarak daha fazla işlem yapma olanağı sağlar.
import numpy as np
# örnek: listedeki elemanları birbiriyle çarpacağız.
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
#klasik yöntem
ab = []
for i in range(0, len(a)):
ab.append(a[i] * b[i])
print(ab)
# numPy çözümü
a = np.array([1, 2, 3, 4])
b = np.array([2, 3, 4, 5])
print(a * b)
Klasik yöntemle bu örnekte;
1. elemanlar içinde gezme ( iterasyon ),
2. çarpma,
3. boş listeye ekleme,
4. sonuç görme
işlemlerini yapacaktık. Fakat NumPy ile bunu çok daha hızlı ve kolay şekilde çözdük! 🚀
2️⃣ NumPy Arrayi Oluşturma
Python’ ın veri yapıları olduğu gibi NumPy’ ın da kendine ait veri yapıları vardır. Buna ndarray ( numpy array ) adı verilir.
☞ NumPy işlemleri yapabilmek için NumPy arrayine ihtiyaç vardır.
import numpy as np
np.array([1, 2, 3, 4, 5])
type(np.array([1, 2, 3, 4, 5])) # class 'numpy.ndarray'
np.zeros(10, dtype=int) # 0 'dan oluşan ndarray oluşturmak istersem;
np.random.randint(0, 10, size=10) #(başlangıç aralık,bitiş aralık, adet) integer => randint()
# belirli bir istatiksel dağılıma göre sayı üretmek istersek normal() kullanırız
np.random.normal(10, 4,(3,4)) #(normaldağılımlıkitleortalaması, argüman=> ör stand sapm = 4 , boyut)
# 3 satır 4 sütundan oluşan ortalaması 10 standart sapması 4 olacak şekilde normal dağılımlı sayılar oluşturuldu.
3️⃣ NumPy Array Özellikleri
import numpy as np
# ndim : boyut sayısı
# shape : boyut bilgisi
# size : toplam eleman sayısı
# dtype : array veri tipi
a = np.random.randint(10, size=5)
a.ndim #tek boyutlu [] olduğu için 👉🏻 output: 1
a.shape #tek boyutlu ve içinde 5 eleman var 👉🏻 output: (5,)
a.size #toplam eleman sayısı 👉🏻 output: 5
a.dtype #veri yapısı 👉🏻 output: int64
4️⃣ Yeniden Şekillendirme — Reshaping
Numpy arrayin boyutunu değiştirmek istediğimizde, reshape()
metodunu kullanırız.
# örneğin: 3'e 3'lük matris oluşturmak istersek,
import numpy as np
np.random.randint(1, 10, size=9)
np.random.randint(1, 10, size=9).reshape(3,3)
# veya
ar = np.random.randint(1, 10, size=9)
ar.reshape(3,3)
# atayarak da olur.
# ihtiyaçlara göre daha az sayıda veya daha fazla sayıda satır
# ya da sütun bilgisi girerek boyut değiştirme işlemleri yapılır.
# ama 10 elemanlı olsaydı 3'e 3'lük matrise çeviremezdik. hata verir. ✖️
5️⃣ Index seçimi — Index Selection
Veri yapılarının içerisindeki verilere erişmek için kullandığımız yöntemlerdir.
import numpy as np
a = np.random.randint(10, size=10)
#randint metodu kullanarak 0'dan 10'a kadar sayılardan oluşan 10 adet değer oluşturuldu.
a[0] # 0.elemanına gitmek için
a[0:5] # 0'dan 5.elemana KADAR gitmek için
a[0] = 999 # 0. indexteki elemanı değiştirmek için
# 2 boyutlu arraylerde seçme işlemi nasıl olur?
# (3 satır,5 sütun)
m = np.random.randint(10,size=(3,5))
m[0, 0] #satır,sütun / 0'ın 0'ı
m[1, 1] #satır,sütun / 1'in 1'i
# elemanı değiştirmek istersem ❓ 👇🏻
m[0, 4] = 5
m[1, 3] = 999
#float girersen onu int olarak yazar cünkü ndarray tek veri yapısı ile tutar.
m[:, 0] # bütün satırların 0. elemanını almak istersem
m[1, :] # 1.satırın bütün sütunlarını seçmek istersek
# hem satırlardan hem de sütunlardan belli bir aralık verebiliriz.
m[0:2, 0:3]
6️⃣ Fancy Index
Numpy arrayine bir liste girdiğinizde seçim işlemi sağlar.
import numpy as np
#0'dan 30'a kadar 3'er artacak şekilde array oluşturma
v = np.arange(0, 30, 3)
print(v[1]) # output: 3
# diyelim ki elimde birden fazla index bilgisi var.
# tek tek [0] , [5], [6], [8] mi yazacağız?
catch = [1,2,3] # bakmak istediğim indexleri list haline getirdim.
print(v[catch]) # numpy array
7️⃣ NumPy’ da Koşullu İşlemler — Conditions on NumPy
import numpy as np
v = np.array([1,2,3,4,5])
#3'ten küçük değerlere erişmek istiyorsak;
# klasik çözüm
ab = []
for i in v:
if i < 4:
ab.append(i)
print(ab)
# NumPy çözümü
v[v < 3]
# v < 3boolean döndürür.o değere sahip elemanı seçmek için v[v < 3] yazdık
Bu işlemleri de yapabiliriz.
v[v > 3]
v[v == 3]
v[v != 3]
v[v >= 3]
8️⃣ NumPy’ da Matematiksel İşlemler — Mathematical Operations
import numpy as np
v = np.array([1,2,3,4,5])
v / 5 => bütün elemanları 5’e bölme
v * 5 /10
v ** 2
v - 1
v + 1
#metodlar ile de yapabiliriz;
print(np.subtract(v, 1))
print(np.add(v, 1))
print(np.mean(v))
print(np.sum(v))
print(np.min(v))
print(np.max(v))
print(np.var(v)) #varyans
# NumPy ile İki Bilinmeyenli Denklem Çözümü
# 5*x0 + x1 = 12
# x0 + 3*x1 = 10
a = np.array([[5,1] , [1,3]]) # (x0'ın katsayıları , x1 'in katsayıları)
b = np.array([12,10]) # sonuçlar
result = np.linalg.solve(a,b)
print(result)
🛑 Pandas
Panel Data’nın kısaltmasıdır.
Pandas, Python’ da veri manipülasyonu ve veri analizi alanlarında öne çıkan temel kütüphanelerden biridir. Özellikle veri çerçeveleri (DataFrames) üzerinde işlemler yapmamıza olanak tanır. Veri setlerini anlamak, temizlemek ve analiz etmek için yaygın olarak kullanılır.
☞Birçok farklı veri yapısıyla çalışabiliriz.
☞Birçok farklı kaynaktan veriyi okuma imkanına sahiptir.
1️⃣ Pandas Serileri ve DataFrameler
Pandas serileri, tek boyutlu ve index bilgisi barındıran veri yapılarıdır. DataFrameler ise çok boyutlu ve index bilgisi içeren veri yapılarıdır.
import pandas as pd
# Pandas Serisi oluşturma
s = pd.Series([10, 77, 12, 4, 5])
print(s)
# Pandas DataFrame oluşturma
df = pd.DataFrame({'Column1': [1, 2, 3], 'Column2': ['A', 'B', 'C']})
print(df)
2️⃣ Veri Okuma
Dış kaynaklı verileri okumak için Pandas’ın read_csv()
fonksiyonunu kullanırız. Bu sayede CSV dosyalarını okuyarak veri setlerini oluşturabiliyoruz.
# CSV dosyasını okuma
df = pd.read_csv("datasets/advertising.csv")
print(df.head())
3️⃣ Veriye Hızlı Bakış
Veri setine hızlı bir bakış için kullanılan head()
, tail()
, describe()
, info()
gibi metotlar sayesinde veri setinin yapısını anlamak daha kolay hale geliyor.
# Veriye hızlı bakış
print(df.head())
print(df.describe())
print(df.info())
4️⃣ Seçim İşlemleri ve Koşullu Seçim
Veri setinden istediğimiz verileri seçmek için Pandas’ın sunduğu farklı seçim yöntemleri vardır. Ayrıca koşullu seçim işlemleri ile belirli şartları sağlayan verileri filtreleyebiliriz.
# Veri seçim işlemleri
print(df['column_name'])
print(df[['column1', 'column2']])
print(df.loc[df['column'] > 50])
🚀 loc ve iloc
DataFramelerde seçim işlemleri için kullanılan özel yapılardır.
iloc 👉🏻 index bilgisi vererek seçim yapma işlemlerini ifade eder.
loc 👉🏻 mutlak olarak indexlerdeki labellara göre seçim yapar.
Farkları,
slice işlemlerinde iloc yapısında verilen değere kadar yazdırırken, loc yapısında o değeri de yazdırır.
[0:3] ☞ iloc ☞ 0,1,2
[0:3] ☞ loc ☞ 0,1,2,3
import pandas as pd
import seaborn as sns
pd.set_option('display.max_columns', None) # çıktıdaki 3 noktadan kurtulmak için
df = sns.load_dataset("titanic")
df.head()
# iloc
df.iloc[0:3]
df.iloc[0, 0]
# loc
df.loc[0:3]
# 0'dan 3'e kadar olacak şekilde sütunlardan da bir değişken seçmek istersem,
# satır ya da indexlerdeki değerlerin bizzat kendilerine göre
# seçim yapak istersem => loc kullanıyoruz.
df.loc[0:3, "age"]
col_names = ["age", "embarked", "alive"]
df.loc[0:3, col_names]
5️⃣ Gruplama
Veri setini belirli bir özellik üzerinde gruplama işlemlerini gerçekleşebiliriz. groupby()
metodu ile istediğimiz değişkenlere göre gruplayıp istatistiksel bilgiler elde ederiz.
# Toplulaştırma ve gruplama
print(df.groupby('category')['numeric_column'].mean())
# bu örnekte category'e göre gruplama yapılmıştır.
print(df.groupby(['category1', 'category2'])['numeric_column'].sum())
6️⃣ Pivot Table
Veri setini pivot tablo olarak düzenleyerek daha anlamlı bir yapı elde ederiz. pivot_table()
metodu ile belirli değişkenlere göre toplulaştırma işlemleri yaptık.
# Pivot tablo oluşturma
print(pd.pivot_table(df, values='value_column', index='index_column', columns='column_to_pivot'))
Group by ve Pivot Table arasındaki fark nedir ?
👇🏻 Detaylı şekilde Bonus 1' de ele alınmıştır 👇🏻➕🚀
7️⃣ Apply ve Lambda
apply()
metodu, veri setinde belirli bir fonksiyonu uygulayarak yeni değişkenler oluşturmak için kullanılır. Aynı zamanda lambda
ifadesiyle, sadece o anki işlemde kullanacağımız fonksiyonları tanımlayabiliriz (kullan-at fonksiyonu).
# Apply ve Lambda kullanımı
df['new_column'] = df['old_column'].apply(lambda x: x * 2)
8️⃣ Birleştirme ( Join ) İşlemleri
Birden fazla veri setini birleştirerek daha kapsamlı analizler yapabiliriz. concat()
ve merge()
mototları ile bu birleştirme işlemlerini gerçekleştiririz.
# Veri birleştirme
df_concatenated = pd.concat([df1, df2], ignore_index=True)
df_merged = pd.merge(df1, df2, on="common_column")
➕ BONUS 1 🚀
Group By ve Pivot Table Farkı Nedir ❓
Group By;
☞ Gruplama işlemleri sonucunda ortaya çıkan sonuç, genellikle hiyerarşik bir yapıda değildir ve daha düz bir formatta olabilir.
☞Genellikle, Birleştirme (aggregation) işlemleri yapılır, örneğin toplama, ortalama alma gibi.
Pivot table;
☞ Daha spesifik bir amaç için kullanılır ve çapraz tablo benzeri bir düzenleme sağlar.
☞ Veriyi çapraz tablo formatına getirerek daha okunabilir ve karşılaştırılabilir bir yapı oluşturur.
☞ Belirli bir şekilde düzenlenmiş tablolar oluşturmak için kullanılır.
Örneğin,
import pandas as pd
import numpy as np
# basit veri çerçevesi oluşturalım
data = {'yil': [2020, 2020, 2021, 2021, 2021],
'ay': [1, 2, 1, 2, 3],
'gun': [1, 15, 1, 15, 1],
'satislar': [100, 150, 120, 180, 200]}
df = pd.DataFrame(data)
# Group by kullanarak her yıl ve ay için toplam satışları göster
grouped_data = df.groupby(['yil', 'ay']).sum()['satislar']
print("Group by ile elde edilen çıktı:\n", grouped_data, "\n")
# Pivot_table kullanarak çapraz tablo oluştur
pivot_table_data = pd.pivot_table(df, values='satislar', index='yil', columns='ay', aggfunc='sum')
print("Pivot table ile elde edilen çıktı:\n", pivot_table_data)
Çıktılar şu şekilde olacaktır 👇🏻
# Group by ile elde edilen çıktı:
yıl ay
2020 1 100
2 150
2021 1 120
2 180
3 200
# Pivot table ile elde edilen çıktı:
ay 1 2 3
yıl
2020 100.0 150.0 NaN
2021 120.0 180.0 200.0
Neden NaN geldi ❓
pivot_table
metodu, eksik verileri yönetme amacıyla default olarak birleştirme işlemi uygular, bu da eğer bir kombinasyon için hiç veri yoksa, o hücreye NaN
değeri atanmasına neden olabilir.
NaN değerlere 0 atama
NaN değere 0 atamak için veri setinizi ve değişkeninizi iyi tanımanız önemlidir. Örneğin, sağlık verileri üzerinde çalışırsanız ve insülin değerleri NaN ise 0 atamak ciddi problemlere yol açabilir.
NaN yerine 0 atamak istersek:
fill_value = 0 parametresi ile NaN değerlerin yerine 0 atanır.
➕ BONUS 2 🚀
df['Released'] > 1980
ifadesi, 'Released' sütunundaki her bir eleman için 1980' den büyük olup olmadığını kontrol eden bir boolean Serisi oluşturur. True/False değerleri içeren bu Seri, 'Released' sütunundaki her bir değer için 1980' den büyük olup olmadığını gösterir.
df[df['Released'] > 1980]
ifadesi ise bu boolean Serisi kullanılarak DataFrame' i filtreler. Sadece 'Released' sütununda 1980' den büyük olan satırları içeren bir DataFrame oluşturur. Yani, filtreleme işlemi sonucunda sadece 'Released' sütununda değeri 1980'den büyük olan filtrelenmiş satırları içeren bir alt DataFrame elde edilir.
Özetle,
NumPy, bilimsel hesaplamalarda etkili olan bir kütüphane iken, Pandas veri manipülasyonu ve analizi için kullanılıyor. 🐍
Okuduğunuz için teşekkür ederim! 🤩 🎊
Kaynaklar