NumPy vs. Pandas 📚

Melisa Çevik
8 min readJan 30, 2024

--

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 ❓

  1. Hız 👉🏻 bunu sabit tipte veri tutarak gerçekleştiriyor.
  2. 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 🚀

burada index eksik ama konuya odaklanalım 🐣

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

--

--