Veri Bilimi Okulu

Python ile Makine Öğrenmesine Giriş Pandas Kütüphanesi
Python ile Makine Öğrenmesine Giriş Pandas Kütüphanesi
pandas_logo-1080x675

Loading

Merhabalar,

Makine Öğrenmesine Giriş Serisi’nin İlk kütüphanesi Pandas’tan bahsedeceğim bu gün, serinin devamında numpy, matplotlib, scikit-learn vs. gibi kütüphanelerden bahsedip ardından önce basit örneklerden başlayıp daha komplike örnekler ile python’da makine öğrenmesini anlatacağım. Şimdiden İyi Okumalar!

Pandas Nedir?

  • Pandas genelde veri işleme ve temizlemede oldukça efektif şekilde kullanılan, hatta makine öğrenmesi gibi alanlarda oldukça fazla kullanılan bir python modülü
  • Pandas 2 aslında içerisinde 2’ye Ayrılıyor. Seriler ve Veri Çerçeveleri(DataFrame)

Pandas Nasıl Kurulur?

  • Pandas normalde size anaconda ile birlikte yüklü gelir ama yüklü değilse, bilgisayarınızda python path olarak varsa cmd’yi açıp “pip install pandas” veya anaconda varsa ve yüklü değilse anaconda prompter’dan “conda install pandas” yazarak indirebilir ve kullanabilirsiniz.
import pandas as pd #burada pandası çağırıp pd kısaltması ile kullanacağımızı belirtiyoruz
data = [1,7,3,7,9,10]
seri = pd.Series(data) #burada elemanları yazıp seriyi tanımlıyoruz
seri #seriyi yazdırıyoruz
Output:
0 1
1 7
2 3
3 7
2 3
3 7
4 9
5 10

dtype : int64v

Pandas’ta indexlere değer atama

  • Burada dikkat etmemiz gereken şey serilerde bahsettiğimiz eleman kadar index değeri atamak olacaktır. Eğer bunu fazla veya az yaparsanız valueerror alacaksınız.
index = ["İstanbul", "Ankara", "İzmir", "Yalova", "Adana", "Diyarbakır"] #Doğru
index2 = ["İstanbul", "Ankara", "İzmir", "Yalova", "Adana", "Diyarbakır", "Bursa"] #Yalnış
pd.Series(data = data , index = index)

Output:

İstanbul       1
Ankara         7
İzmir          3
Yalova         7
Adana          9
Diyarbakır    10
dtype: int64
  • Böyle yapmak yerine direkt dict’leri kullanarak hem indexleyip hemde elemanlarınızı içerisinde bulunduran bir seri oluşturabilirsiniz.
dataDict = {"İstanbul":3,"Ankara":2,"İzmir":4,"Yalova":7}
pd.Series(dataDict)

Output:

Ankara      2
Yalova      7
İstanbul    3
İzmir       4
dtype: int64

Pandas DataFrame Oluşturma

  • Columns : Başlıklar
  • İndex : Az önce bahsettiğim etiketler
  • Data : Elemanlar
from numpy.random import randn
data = randn(2,2) #radn kütüphanesi bize içerideki elemanları rahatça ve random şekilde oluşturmamızı sağlıyor
columns = ["Başlık1","Başlık2"] 
df = pd.DataFrame(data,index = ["İst","Ankara"],columns = columns) 
df

  Output:

Başlık1 Başlık2
İst -0.792252 -0.047696
Ankara 1.852743 0.654519

Başlıktan Sorgu yapmak

  • Burada kullanacağınız şey, elinizdeki verideki her bir başlığı, sutün’u tek başına alıp onu sorgulayabileceğiniz veya sadece ona işlem yapabilmenin ilk adımı olacak
Input:
df["Başlık1"]

Output:

İst      -0.792252
Ankara    1.852743
Name: Başlık1, dtype: float64

Input:

type(df["Başlık1"])

Output:

pandas.core.series.Series

Input:

type(df)

Output:

pandas.core.frame.DataFrame
  • Burada gördüğünüz gibi, birçok seri bir araya gelerek dataframe’i oluşturuyor.

DataFrame’ye Sutün Eklemek

df #eklemeden önceki hali

Output:

Başlık1 Başlık2
İst -0.792252 -0.047696
Ankara 1.852743 0.654519
  • Burada DataFrame’ye kendimiz belirlediğimiz elemanların olduğu bir sutün’u ekleyeceğiz.
df["Başlık3"] = pd.Series(randn(2),index = ["İst","Ankara"])
df

Output:

Başlık1 Başlık2 Başlık3
İst -0.792252 -0.047696 -1.031586
Ankara 1.852743 0.654519 1.685737
df["Başlık4"] = randn(2)
  • Şimdi ise diğer Sutünların toplamalarını yeni bir sutünda yazdıracağız.

Input:

df["Başlık5"] = df["Başlık1"] + df["Başlık2"] + df["Başlık3"] + df["Başlık4"]
df

Output:

Başlık1 Başlık2 Başlık3 Başlık4 Başlık5
İst -0.792252 -0.047696 -1.031586 -0.317169 -2.188703
Ankara 1.852743 0.654519 1.685737 1.440357 5.633356

Kullanmadığınız Sutünları Düşürmek.

  • Bu kısım daha çok feature selection yaparken kullanılıyor. Çoğu zaman verilerde zaman sutün’u düşürülüyor.

Input:

df.drop("Başlık5",axis = 1)

Output:

Başlık1 Başlık2 Başlık3 Başlık4
İst -0.792252 -0.047696 -1.031586 -0.317169
Ankara 1.852743 0.654519 1.685737 1.440357

Input:

df

Output:

Başlık1 Başlık2 Başlık3 Başlık4 Başlık5
İst -0.792252 -0.047696 -1.031586 -0.317169 -2.188703
Ankara 1.852743 0.654519 1.685737 1.440357 5.633356
  • Baktığınızda değişiklikler ana setimizde yansımamış şekilde sebebi ise düşürme işlemini df değişkeni üzerinde yapmadık.

Input:

df = df.drop("Başlık5",axis = 1)  #DOĞRU
df

Output:

Başlık1 Başlık2 Başlık3 Başlık4
İst -0.792252 -0.047696 -1.031586 -0.317169
Ankara 1.852743 0.654519 1.685737 1.440357

Loc ile DataFrame Listelemek

  • İndex Değerlerine Göre Listelemek

Input:

df.loc["İst"] # df=df.loc["A"] yapmazsanız kaydolmaz

Output:

Başlık1   -0.792252
Başlık2   -0.047696
Başlık3   -1.031586
Başlık4   -0.317169
Name: İst, dtype: float64

Input:

df.iloc[0] #buda 0. index yani istanbul.

Output:

Başlık1   -0.792252
Başlık2   -0.047696
Başlık3   -1.031586
Başlık4   -0.317169
Name: İst, dtype: float64

Input:

df.loc["İst","Başlık1"] #BAŞLIK1'İN İST İNDEXİNE SAHİP OLAN ELEMANINI ÇAĞIRIYORUZ

Output:

-0.7922522962389578

DataFrame Filtreleme

  • Boolean = True/False içeren değerler

Input:

df > -1 #Burada DataFramedeki -1'den büyük değerlerin True Dönmesini istiyorum hepsi döndü

Output:

Başlık1 Başlık2 Başlık3 Başlık4
İst True True False True
Ankara True True True True

Input:

df["Başlık1"] < 1 #Başlık1deki değerlerden 1'den büyük olanların true dönmesini istiyorum.

Output:

İst        True
Ankara    False
Name: Başlık1, dtype: bool

İndex ve Eleman Değerlerini Değiştirmek.

  • Yeni Elemanlar atarken çok işimize yarayacak

Input:

df["Başlık1"] = ["1","3"] #başlık1'in değerlerini değiştiriyorum
df

Output:

Başlık1 Başlık2 Başlık3 Başlık4
İst 1 -0.047696 -1.031586 -0.317169
Ankara 3 0.654519 1.685737 1.440357

Input:

df.set_index("Başlık1") #başlık1 bizim index'imiz olacaktır.

Output:

Başlık2 Başlık3 Başlık4
Başlık1
1 -0.047696 -1.031586 -0.317169
3 0.654519 1.685737 1.440357

Input:

df #değişikliklerin geçerliliği için

Output:

Başlık1 Başlık2 Başlık3 Başlık4
İst 1 -0.047696 -1.031586 -0.317169
Ankara 3 0.654519 1.685737 1.440357

Input:

df = df.set_index("Başlık1")
df

Output:

Başlık2 Başlık3 Başlık4
Başlık1
1 -0.047696 -1.031586 -0.317169
3 0.654519 1.685737 1.440357

Kayıp Veriler

  • Bir araştırmadaki en sorunlu ve en önemli kısıma şu anda değineceğiz, kayıp verileri atmadan makine öğrenmesi yapılamaz.

Input:

import numpy as np #burada numpy'i ilerideki yazılarda anlatacağım şu an eleman oluşturmak için kullanacağız
data = np.array([[1,5,np.nan],[np.nan,7,np.nan],[np.nan,9,8]])

Input:

df = pd.DataFrame(data,columns = ["Başlık1","Başlık2","Başlık3"])
df

Output:

Başlık1 Başlık2 Başlık3
0 1.0 5.0 NaN
1 NaN 7.0 NaN
2 NaN 9.0 8.0
  • Direkt Düşürmek

Input:

df.dropna() #bu direkt NaN bulunan İndex'i düşürür

Output:

Başlık1 Başlık2 Başlık3

Input:

df.dropna(axis = 1) #burada başlığa göre düşürüyor.

Output:

Başlık2
0 5.0
1 7.0
2 9.0
  • Alt Eşik Koymak

Input:

df.dropna(thresh = 2) # burada bir limit belirliyoruz. Index'te 2 değerden fazlası NaN ise o indexi düşür.

Output:

Başlık1 Başlık2 Başlık3
0 1.0 5.0 NaN
2 NaN 9.0 8.0
  • NaN’ları doldurmak (Pek önermiyorum, neden önermediğimi diğer yazılarımda anlatacağım.)

Input:

df.fillna(value = 15) #burada NaN'ları ne ile dolduracağımızı belirliyoruz.

Output:

Başlık1 Başlık2 Başlık3
0 1.0 5.0 15.0
1 15.0 7.0 15.0
2 15.0 9.0 8.0

Input:

df.sum() #NaN Değerleri tüm değerlerin ortalamasına bakarak belirlemek

Output:

Başlık1     1.0
Başlık2    21.0
Başlık3     8.0
dtype: float64

Input:

size = df.size
nan = df.isnull().sum().sum()
print("DataFramedeki Toplam Eleman Sayısı:", size)
print("DataFramedeki Toplam NaN Sayısı:", nan)
DataFramedeki Toplam Eleman Sayısı: 9
DataFramedeki Toplam NaN Sayısı: 4

DataFrameleri birleştirme Yöntemleri

Input:

dataset1 = {
    "A": ["A1","A2","A3","A4"],
    "B":["B1","B2","B3","B4"],
    "C":["C1","C2","C3","C4"],
}
dataset2 = {
    "A": ["A5","A6","A7","A8"],
    "B":["B5","B6","B7","B8"],
    "C":["C5","C6","C7","C8"],
}

Input:

df1 = pd.DataFrame(dataset1,index = [1,2,3,4])
df2 = pd.DataFrame(dataset2,index = [5,6,7,8] )

Input:

df1

Output:

A B C
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
4 A4 B4 C4

Input:

df2

Output:

A B C
5 A5 B5 C5
6 A6 B6 C6
7 A7 B7 C7
8 A8 B8 C8
  • Burada görmeniz gereken detay index sayıları birbirini takip ediyor. Peki ya ben bu dataframeleri birleştirirsem ne elde ederim?

Pd.Concat

  • Concat direkt başlıklar üzerinden veya indexler üzerinden birleştirme yapar

Input:

newdata = pd.concat([df1,df2]) 
newdata

Output:

A B C
1 A1 B1 C1
2 A2 B2 C2
3 A3 B3 C3
4 A4 B4 C4
5 A5 B5 C5
6 A6 B6 C6
7 A7 B7 C7
8 A8 B8 C8
  • Peki ya Ben bunları başlıkların eşitliğini yok sayarak birleştirirsem ne çıkar?

Input:

pd.concat([df1,df2],axis = 1)

Output:

A B C A B C
1 A1 B1 C1 NaN NaN NaN
2 A2 B2 C2 NaN NaN NaN
3 A3 B3 C3 NaN NaN NaN
4 A4 B4 C4 NaN NaN NaN
5 NaN NaN NaN A5 B5 C5
6 NaN NaN NaN A6 B6 C6
7 NaN NaN NaN A7 B7 C7
8 NaN NaN NaN A8 B8 C8

Pd.Merge

  • Merge Az olan değeri referans alıp ona göre birleştirir.

Input:

dataset1 = {
    "A" : ["A1","A2","A3"],
    "B" : ["B1","B2","B3"],
    "anahtar" : ["K1","K2","K3"]
}
dataset2 = {
    "X" : ["X1","X2","X3","X4"],
    "Y" : ["Y1","Y2","Y3","Y4"],
    "anahtar" : ["K1","K2","K5","K4"]
}

Input:

df1 = pd.DataFrame(dataset1)
df1

Output:

A B anahtar
0 A1 B1 K1
1 A2 B2 K2
2 A3 B3 K3

Input:

df2 = pd.DataFrame(dataset2)
df2

Output:

X Y anahtar
0 X1 Y1 K1
1 X2 Y2 K2
2 X3 Y3 K5
3 X4 Y4 K4
  • Ben bu 2 dataframe’i anahtar başlığı altında birleştirmek istersem bunda merge’i kullanabilirim.

Input:

pd.merge(df1,df2,on = "anahtar")

Output:

A B anahtar X Y
0 A1 B1 K1 X1 Y1
1 A2 B2 K2 X2 Y2
  • Farkettiyseniz merge’de az olan değere göre bir eleman atandı NaN’sız bir şekilde elime geçti. Peki ya az çok farketmeden direkt birleştirmek isteseydim ne yapabilirdim?

Join

  • Burada bilinmesi gereken şey indexler join edilen dataframeye göre referans alınır.

Input:

dataset1 = {
    "A" : ["A1","A2","A3"],
    "B" : ["B1","B2","B3"],
}
dataset2 = {
    "X" : ["X1","X2","X3","X4"],
    "Y" : ["Y1","Y2","Y3","Y4"],
}
df1 = pd.DataFrame(dataset1)
df2 = pd.DataFrame(dataset2)

Input:

df1.join(df2)

Output:

A B X Y
0 A1 B1 X1 Y1
1 A2 B2 X2 Y2
2 A3 B3 X3 Y3

Input:

df2.join(df1)

Output:

X Y A B
0 X1 Y1 A1 B1
1 X2 Y2 A2 B2
2 X3 Y3 A3 B3
3 X4 Y4 NaN NaN

Gerçek Datalar İle oynama Zamanı

  • Ben burada data olarak kaggle’dan aldığım Avakado satış fiyatlarını kullanacağım.

Dataset’e Tıklayarak ulaşabilirsiniz.

https://www.kaggle.com/neuromusic/avocado-prices

  • kodumuz pd.read_csv(‘datasetdizini’, sep=”dataset’in nasıl ayrıldığı*”)
  • ayrıldığı* = çoğu dataset bu kısımda default olarak “,” kullansada bazen “;” olabiliyor.

URL’den Dataset Çekme

Input:

url = "https://raw.githubusercontent.com/unforgiventr/Facebook-DataLeak-TextMining/master/avocado.csv"
data = pd.read_csv(url)
data.head()

Output:

Unnamed: 0 Date AveragePrice Total Volume 4046 4225 4770 Total Bags Small Bags Large Bags XLarge Bags type year region
0 0 2015-12-27 1.33 64236.62 1036.74 54454.85 48.16 8696.87 8603.62 93.25 0.0 conventional 2015 Albany
1 1 2015-12-20 1.35 54876.98 674.28 44638.81 58.33 9505.56 9408.07 97.49 0.0 conventional 2015 Albany
2 2 2015-12-13 0.93 118220.22 794.70 109149.67 130.50 8145.35 8042.21 103.14 0.0 conventional 2015 Albany
3 3 2015-12-06 1.08 78992.15 1132.00 71976.41 72.58 5811.16 5677.40 133.76 0.0 conventional 2015 Albany
4 4 2015-11-29 1.28 51039.60 941.48 43838.39 75.78 6183.95 5986.26 197.69 0.0 conventional 2015 Albany

Localde bulunan dataset’i tanıtma

  • Not: dataset’in yeri notebook veya kod’un yeri ile aynı değilse (‘avocado.csv’) kısmındaki tırnağın içerisinde yolu yazmanız gerekiyor.

Input:

data2 = pd.read_csv('avocado.csv', sep = ",")
data2.head()

Output:

Unnamed: 0 Date AveragePrice Total Volume 4046 4225 4770 Total Bags Small Bags Large Bags XLarge Bags type year region
0 0 2015-12-27 1.33 64236.62 1036.74 54454.85 48.16 8696.87 8603.62 93.25 0.0 conventional 2015 Albany
1 1 2015-12-20 1.35 54876.98 674.28 44638.81 58.33 9505.56 9408.07 97.49 0.0 conventional 2015 Albany
2 2 2015-12-13 0.93 118220.22 794.70 109149.67 130.50 8145.35 8042.21 103.14 0.0 conventional 2015 Albany
3 3 2015-12-06 1.08 78992.15 1132.00 71976.41 72.58 5811.16 5677.40 133.76 0.0 conventional 2015 Albany
4 4 2015-11-29 1.28 51039.60 941.48 43838.39 75.78 6183.95 5986.26 197.69 0.0 conventional 2015 Albany
  • Mesela bu Dataset’ten Date Sutün’unu düşürmek istersem.

Input:

data = data.drop(["Date"],axis = 1)
data.head()

Output:

Unnamed: 0 AveragePrice Total Volume 4046 4225 4770 Total Bags Small Bags Large Bags XLarge Bags type year region
0 0 1.33 64236.62 1036.74 54454.85 48.16 8696.87 8603.62 93.25 0.0 conventional 2015 Albany
1 1 1.35 54876.98 674.28 44638.81 58.33 9505.56 9408.07 97.49 0.0 conventional 2015 Albany
2 2 0.93 118220.22 794.70 109149.67 130.50 8145.35 8042.21 103.14 0.0 conventional 2015 Albany
3 3 1.08 78992.15 1132.00 71976.41 72.58 5811.16 5677.40 133.76 0.0 conventional 2015 Albany
4 4 1.28 51039.60 941.48 43838.39 75.78 6183.95 5986.26 197.69 0.0 conventional 2015 Albany

Dataseti üzerinde ayar yaptıktan sonra kaydetme

Input:

data.to_csv("yenidata.csv",index = False)

Exceldataset’i okutma

  • Çoğu zaman excel ve csv kullanıldığı için json vs. anlatmayacağım ama onları merak ederseniz google’a “pd.read_dosyatipi” şeklinde aratmanız yeterli olacaktır.
  • Örnek : pd.read_html

Input:

dataexcel = pd.read_excel("data.xlsx")
dataexcel.head()

Output:

İstanbul Ankara İzmir Adana
0 1 5 7 6
1 2 1 4 5
2 5 1 6 3
3 6 7 7 8
  • Bu şekilde her zaman ilk sayfayı alır çoklu sayfalılarda bile, diğer sayfalara erişmek için ise;

Input:

dataexcel2 = pd.read_excel("data.xlsx", sheet_name="Sayfa2")
dataexcel2

Output:

Amsterdam CA
0 21 123
1 13 41
  • Gördüğünüz gibi 2. sayfayı açtık.

Input:

dataexcel.to_excel("excelyeni.xlsx")

Json Tipi Data Okutma

Input:

datajson = pd.read_json("data.json")
datajson

Output:

Adana Ankara İstanbul İzmir
0 6 5 1 7
1 5 1 2 4
2 3 1 5 6
3 8 7 6 7

Input:

type(datajson)

Output:

pandas.core.frame.DataFrame

Input:

datajson.to_json("newdatajson.json")
0

2 Responses

Bir yanıt yazın