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: | |
---|---|
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")
..
…
index2 = [“İstanbul”, “Ankara”, “İzmir”, “Yalova”, “Adana”, “Diyarbakır”, “Bursa”] #Yalnış
…
..
kısmında “Yanlış” yazılmalıydı
Bu yazı gerçekten çok faydalıydı! Pandas kütüphanesinin temel özelliklerini öğrenmek için harika bir başlangıç noktası. Örneklerinizi ve açıklamalarınızı özellikle beğendim. Teşekkürler!