"Enter"a basıp içeriğe geçin

Python- Pandas nedir?

Yapay zeka, makine öğrenmesi veya derin öğrenme konularıyla ilgilenen hemen herkesin yolu Python ile kesişiyor. Bunun en büyük sebebi Python’da bu alanlara yönelik çok geniş ve büyük kolaylık sağlayan kütüphanelerin var olmasıdır.

Pandas da, kullanımı kolay veri yapıları sunan ve veri üzerinde analiz yapmayı sağlayan açık kaynak kodlu Python kütüphanelerinden birisidir. Sahip olduğu bir çok özellik sebebiyle veri okuma ve önişleme aşamalarında makine öğrenmesi alanlarında çalışanlara büyük kolaylıklar sağlamaktadır.

Ön koşullar


  • Python programlama dili hakkında temel bilgilere sahip olmak gereklidir.
  • Daha önceden NumPy vb. kütüphaneler hakkında bilgi sahibi olmak yazıyı daha anlamlı kılacaktır.

Çalışma özeti


  • Pandas’ın anaconda ve pip ile kurulumu
  • Pandas’ın kullanım alanlarını görüp, benzer kütüphaneler ile karşılaştırılması
  • Pandas ile veri üzerinde yapabileceğimiz basit işlemler ve çeşitli methodlar

Pandas’ın anaconda ve pip ile kurulumu


Anaconda

Anaconda dağıtımı, Python ve R programlama dilleri ile veri bilimi üzerinde uğraşan insanların gerekli kütüphanelere kolaylıkla erişebilmesi için üretilen bir paket yönetim uygulamasıdır. İçerisinde bu alanda temel kabul edilen scipy, numpy, matplotlib gibi kütüphaneler varsayılan olarak gelir. Aynı zamanda pandas kütüphanesi de yüklü olarak geleceğinden, Anaconda kullanan kişilerin ayrıca bir yükleme yapmasına gerek yoktur. Anaconda hakkında daha fazla bilgi almak için (burayı)[https://www.anaconda.com/] kontrol edebilirsiniz.

Pip

Pip kullanan arkadaşlar kendi aşağıdaki komut ile kurulumu gerçekleştirebilirler. Ancak Anaconda kullanımı bağımlılıkların kurulmasında problem çıkmaması açısından önerdiğim yöntemdir.

pip install pandas

Bu aşamalardan sonra kütüphaneyi import etmek isterseniz herhangi bir hatayla karşılaşmamanız gereklidir.

Pandas örnekler ile kullanımı


NumPy çok boyutlu veriler üzerinde hesaplama yapmayı kolaylaştıran çok önemli bir kütüphanedir ve Pandas aslında NumPy kütüphanesinin üzerine yapılandırılmıştır. Ancak Pandas daha yüksek seviyeli veri tipi olan DataFrame kullanırken NumPy daha düşük seviyeli olan np.array kullanır. Pandas daha çok tablosal verileri yönetmek için kullanıldığı gibi NumPy ile yapılabilen tüm işlemleri de yapabilmenize olanak sağlar. 

Üzerinde çalışacağımız basit bir veri üreterek Pandas ile neler yapabileceğimize bakalım. Öncelikle internet üzerinden rastgele csv dosyası üretelim.Bu işlem için burayı kullanabilirsiniz. 

import pandas as pd

data = pd.read_csv(path_of_csv_file) 

print(type(data)) # <class 'pandas.core.frame.DataFrame'>

Yukarıdaki gibi csv dosyasını okuduğumuzda elimizde  DataFrame tipinde bir veri yapısı dönüyor. DataFrame‘i incelediğimizde okunan veriyi anlamamızı sağlayacak en temel 4 özelliğinden bahsedebiliriz. 

  • dtypes – Her kolonun veri tipini döndürür.
  • index – Başlangıç ve bitiş indexlerini gösteren RangeIndex tipinde bir veri döndürür.
  • columns – Verinin kolon isimlerini döndürür.
  • values – Verinin içeriğini döndürür.

Tabi ki erişimler sadece bunlar değil. Bunların üzerine kurulu bir çok erişim yöntemi ve bu yöntemlerin birçok alanda avantajı var. Örneğin ilk 5 satırı göstermek istesek;

data.head(5)

İlk n satırını head ile gösterebileceğiniz gibi son n satırını da tail methodunu kullanarak gösterebilirsiniz.

Sadece belirli kolonları göstermek istersek;

data.first_name # Sadece ilk ismi listeler

data[['first_name', 'last_name']] # Birden fazla kolon - isim ve soyisim- listelenir.

Bu filtreleme işlemini bir adım öteye götürüp sadece belırlı satır aralığındaki belirli kolonları görmek istediğimizde loc methodunu kullanabiliriz. Bu methodun imzası aşağıdaki gibidir.

data.loc[from_row:to_row:step, ['column1', 'column2']]
data.loc[5:10, [‘first_name’, ‘last_name’]]

Eğer kolon isimleri yerine index‘lerini kullanmak istiyorsanız loc methodu yerine iloc kullanabilirsiniz.

data.loc[from_row:to_row:step, [column1_index, column2_index]]

Bu basit işlemlerden sonra veri üzerinde yapabileceğimiz başka filtreleme işlemlerine göz gezdirelim. Örneğin id ‘si 5’ten küçük olan satırları almak istediğimizde;

data[data['id'] < 5]

veya ismi Anastasia ve Karina olan kişileri filtrelemek istediğimizde;

data[data['first_name'].isin(['Anastasia','Karina'])]

gösterildiği gibi yapabiliriz.

Burada gösterilen örnekler komplex olmasa da her türlü filtreleme ve erişim işlemlerini çok kolaylıkla yapabiliyoruz. Benzeri işlemleri standart veri yapıları ile yapmak isteseydik  karmaşık döngüler ve koşullu ifadeler ile uğraşmamız gerekecekti.

İşin biraz daha analiz tarafına baktığımızda ve elimizdeki veriden istatistiksel hesaplamalar yapmamız gerektiğinde DataFrame bizlere describe methodunu sunuyor. Bu method ile numerik olan her kolon için en küçük ve en büyük değer, standart sapma gibi istatistikleri elde edebiliriz. Elimizdeki verideki kolonlar genelde nominal olduğu için belki iyi bir örnek olmayacak ama denediğimizde aşağıdaki gibi bir sonuç alacağız. 

data.describe()

Yine veri üzerinde yapabileceğimiz temel bir işlev olan sıralama işlemine bakacak olursak sort_values methodunu kullanabiliriz.

data.sort_values(['first_name', 'last_name'], ascending=True).head(5)

Burada ascending parametresini False göndererek büyükten küçüğe sıralama yapabiliriz.

Bu aşamaya kadar sadece veriye erişim üzerine işlemler yaptık. Ancak Pandas ile veri üzerinde manipülasyonlar yapmakta en az bu kadar basit. Örneğin isim ve soyisimi birleşitirerek full_name isminde yeni bir kolonda görmek istediğimizde;

data['full_name'] = data['first_name'] + ' ' + data['last_name']

Elimizdeki satırların her birine değil de sadece belirli şartlar altındakine yeni bir kolon eklemek istediğimizi ve bu kolonu çeşitli kurallara göre koymak istediğimiz bir senaryo düşünelim.
Mesela erkek olanların askerlik durumunu yeni bir kolonda tutmak istediğimizi ve eğer satırın id kolonu 5’e bölünebilir ise askerlikten muaf olduğunu geri kalanların ise henüz yapmadığını varsayalım. Kadın olanlarda ise herhangi bir değişiklik yapmayacağız.

Burada daha önce kullandığımız loc methodunu farklı bir amaç için kullanacağız.

data.loc[data['gender'] == 'Male', 'military_obligation'] = data['id'] % 5 == 0
data.head(10)

Aslında kodu okuduğumuzda kendini yeterince açıklıyor. Ancak burada loc methodunu farklı bir imza ile kullandık.

data.loc[condition, column_name]

Burada column_name yerine var olan bir kolon ismini yazsaydık aslında yine filtreleme yapmış olacaktık. Ancak atama operatörü kullandığımız için yeni bir kolon ekleme fırsatımız oluyor ve dikkat ettiyseniz eşitliğin diğer tarafında yine başka bir kolonu seçip her satır için kendine ait hücreyi kullanabiliyorum. Sonuçlara baktığımızda sadece erkek olan satırların id‘lerinin 5’e tam bölünebilenleri True , bölünemeyenlerin False, kadın olan satırlarda ise herhangi bir atama yapılmadığı için NaN (Not a Number)  ifadesini görüyoruz.

Sadece veri üzerinde değil istersek kolonlar üzerinde de değişiklik yapabiliriz. Bunu yapmak için columns özelliğini direkt olarak değiştirebileceğimiz gibi DataFrame‘in rename methodunu da kullanabiliriz.

# full_name -> full_name_changed
data.columns = ['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'military_obligation', 'full_name_changed']

data.columns
data.head(5)

# full_name_changed -> full_name
data.rename(columns = {'full_name_changed': 'full_name'}, inplace=True)
data.columns
data.head(5)

Tüm filtreleme ve atama işlemlerinden sonra elinizdeki DataFrame ‘i aşağıdaki gibi iterate edebilirsiniz;

for row_number, row in data.iterrows():
    print(row_number, row.first_name)

Son olarak Pandas elimizdeki veriyi birçok farklı formattan okuma ve yazma işlemine de olanak sağlamaktadır. Örneğin bir MySQL veritabanından bir tabloyu okuyup, işleyip csv veya çok daha farklı formatlara dönüştürerek kaydedebilirsiniz. Ancak yazı çok uzadığı için bu kısımları dahil etmeyeceğim.