Python ile Makine Öğrenmesine Giriş Pandas Kütüphanesi

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:
01
17
23
37
23
37
49
510

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ık1Başlık2
İst-0.792252-0.047696
Ankara1.8527430.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ık1Başlık2
İst-0.792252-0.047696
Ankara1.8527430.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ık1Başlık2Başlık3
İst-0.792252-0.047696-1.031586
Ankara1.8527430.6545191.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ık1Başlık2Başlık3Başlık4Başlık5
İst-0.792252-0.047696-1.031586-0.317169-2.188703
Ankara1.8527430.6545191.6857371.4403575.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ık1Başlık2Başlık3Başlık4
İst-0.792252-0.047696-1.031586-0.317169
Ankara1.8527430.6545191.6857371.440357

Input:

df

Output:

Başlık1Başlık2Başlık3Başlık4Başlık5
İst-0.792252-0.047696-1.031586-0.317169-2.188703
Ankara1.8527430.6545191.6857371.4403575.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ık1Başlık2Başlık3Başlık4
İst-0.792252-0.047696-1.031586-0.317169
Ankara1.8527430.6545191.6857371.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ık1Başlık2Başlık3Başlık4
İstTrueTrueFalseTrue
AnkaraTrueTrueTrueTrue

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ık1Başlık2Başlık3Başlık4
İst1-0.047696-1.031586-0.317169
Ankara30.6545191.6857371.440357

Input:

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

Output:

Başlık2Başlık3Başlık4
Başlık1
1-0.047696-1.031586-0.317169
30.6545191.6857371.440357

Input:

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

Output:

Başlık1Başlık2Başlık3Başlık4
İst1-0.047696-1.031586-0.317169
Ankara30.6545191.6857371.440357

Input:

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

Output:

Başlık2Başlık3Başlık4
Başlık1
1-0.047696-1.031586-0.317169
30.6545191.6857371.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ık1Başlık2Başlık3
01.05.0NaN
1NaN7.0NaN
2NaN9.08.0
  • Direkt Düşürmek

Input:

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

Output:

Başlık1Başlık2Başlık3

Input:

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

Output:

Başlık2
05.0
17.0
29.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ık1Başlık2Başlık3
01.05.0NaN
2NaN9.08.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ık1Başlık2Başlık3
01.05.015.0
115.07.015.0
215.09.08.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:

ABC
1A1B1C1
2A2B2C2
3A3B3C3
4A4B4C4

Input:

df2

Output:

ABC
5A5B5C5
6A6B6C6
7A7B7C7
8A8B8C8
  • 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:

ABC
1A1B1C1
2A2B2C2
3A3B3C3
4A4B4C4
5A5B5C5
6A6B6C6
7A7B7C7
8A8B8C8
  • 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:

ABCABC
1A1B1C1NaNNaNNaN
2A2B2C2NaNNaNNaN
3A3B3C3NaNNaNNaN
4A4B4C4NaNNaNNaN
5NaNNaNNaNA5B5C5
6NaNNaNNaNA6B6C6
7NaNNaNNaNA7B7C7
8NaNNaNNaNA8B8C8

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:

ABanahtar
0A1B1K1
1A2B2K2
2A3B3K3

Input:

df2 = pd.DataFrame(dataset2)
df2

Output:

XYanahtar
0X1Y1K1
1X2Y2K2
2X3Y3K5
3X4Y4K4
  • 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:

ABanahtarXY
0A1B1K1X1Y1
1A2B2K2X2Y2
  • 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:

ABXY
0A1B1X1Y1
1A2B2X2Y2
2A3B3X3Y3

Input:

df2.join(df1)

Output:

XYAB
0X1Y1A1B1
1X2Y2A2B2
2X3Y3A3B3
3X4Y4NaNNaN

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: 0DateAveragePriceTotal Volume404642254770Total BagsSmall BagsLarge BagsXLarge Bagstypeyearregion
002015-12-271.3364236.621036.7454454.8548.168696.878603.6293.250.0conventional2015Albany
112015-12-201.3554876.98674.2844638.8158.339505.569408.0797.490.0conventional2015Albany
222015-12-130.93118220.22794.70109149.67130.508145.358042.21103.140.0conventional2015Albany
332015-12-061.0878992.151132.0071976.4172.585811.165677.40133.760.0conventional2015Albany
442015-11-291.2851039.60941.4843838.3975.786183.955986.26197.690.0conventional2015Albany

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: 0DateAveragePriceTotal Volume404642254770Total BagsSmall BagsLarge BagsXLarge Bagstypeyearregion
002015-12-271.3364236.621036.7454454.8548.168696.878603.6293.250.0conventional2015Albany
112015-12-201.3554876.98674.2844638.8158.339505.569408.0797.490.0conventional2015Albany
222015-12-130.93118220.22794.70109149.67130.508145.358042.21103.140.0conventional2015Albany
332015-12-061.0878992.151132.0071976.4172.585811.165677.40133.760.0conventional2015Albany
442015-11-291.2851039.60941.4843838.3975.786183.955986.26197.690.0conventional2015Albany
  • Mesela bu Dataset’ten Date Sutün’unu düşürmek istersem.

Input:

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

Output:

Unnamed: 0AveragePriceTotal Volume404642254770Total BagsSmall BagsLarge BagsXLarge Bagstypeyearregion
001.3364236.621036.7454454.8548.168696.878603.6293.250.0conventional2015Albany
111.3554876.98674.2844638.8158.339505.569408.0797.490.0conventional2015Albany
220.93118220.22794.70109149.67130.508145.358042.21103.140.0conventional2015Albany
331.0878992.151132.0071976.4172.585811.165677.40133.760.0conventional2015Albany
441.2851039.60941.4843838.3975.786183.955986.26197.690.0conventional2015Albany

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:

İstanbulAnkaraİzmirAdana
01576
12145
25163
36778
  • 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:

AmsterdamCA
021123
11341
  • 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:

AdanaAnkaraİstanbulİzmir
06517
15124
23156
38767

Input:

type(datajson)

Output:

pandas.core.frame.DataFrame

Input:

datajson.to_json("newdatajson.json")

Yazar Hakkında
Toplam 7 yazı
Yunus Emre GÜNDOĞMUŞ
Yunus Emre GÜNDOĞMUŞ
Machine Trainer & Junior Data Scientist
Yorumlar (1 Yorum)
İsim
İsim Yanıtla
- 01:04

..

index2 = [“İstanbul”, “Ankara”, “İzmir”, “Yalova”, “Adana”, “Diyarbakır”, “Bursa”] #Yalnış

..

kısmında “Yanlış” yazılmalıydı

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara