Python Temelleri

 

Veri madenciliği problemlerinin çözümü için genel amaçlı programlama dillerinin hemen hepsi kullanılabilir. C gibi orta seviye bir programlama dilinde dahi yazılabilen veri madenciliği kodları bunun nasıl yapılabileceğini göstermektedir. Bununla birlikte alan için geliştirilmiş dilleri kullanmak veri madenciliği uygulamaları geliştirmeyi daha kolay bir hale getirmiştir. Python bu anlamda veri madenciliği uygulamaları yapmak için uygun bir dildir. Veri önişleme ve veri keşiften veri madenciliği algoritmalarına kadar birçok işi Python yardımıyla kolayca yapabilirsiniz. Bu yeteneklerini zengin kütüphanelerine borçlu olan Python dilinin; temel matematiksel işlemler, doğrusal cebir işlemleri, veri analizi işlemleri, görselleştirme seçenekleri ve makine öğrenmesi yazılımları başta olmak üzere birçok kütüphanesi bulunur.

Bu yazıda Python diline sıfırdan başlayarak Python ile programlama ve bazı basit işlemlerin nasıl yapılabileceği anlatılmıştır. Programlama dili öğretiminde her zaman olduğu gibi “merhaba dünya” yazımından başlayıp değişken tanımlama, diziler, döngüler ve veri analizine doğru adım adım işlemler gösterilecektir. Her bir uygulama örneği anlatılacak ve böylece her seviyeden okuyucunun yazılanları anlaması sağlanacaktır.

1. GİRİŞ

Python ile çalışabilmek için ilk yapılması gereken programlama dili yorumlayıcısının bilgisayara indirilmesidir. Python indirmek için https://www.python.org/getit/ adresine giderek bilgisayar işletim sistemi ve çekirdek özelliklerine uygun sürümü indirebilirsiniz.

Python indirme işlemi ardından en basit komutları çalıştırmak için bile kütüphanelerin yazılıma kurulması (install edilmesi) ihtiyacı vardır. Bunu yerine getirmek için sırayla kütüphaneleri pip komutu yardımıyla kurmak gerekmektedir. Eğer kalıcı işler yapmak yerine bazı denemeler işinizi görecek ise çevrimiçi olarak Python kodu çalıştıran web siteleri de bulunmaktadır. https://pynative.com/online-python-code-editor-to-execute-python-code/ adresinde yer alan web tabanlı arabirim grafikleri dahi çalıştırabilmektedir. Benzer şekilde https://www.onlinegdb.com/online_python_compiler adresinde bulunan yorumlayıcı da başarılı örneklerden birisidir.

Kimi zaman sadece Python değil Python ile ilişkili diğer uygulamalara erişmeye ihtiyaç duyulmaktadır. O durumda karşımıza çıkan uygulamalar bir nevi hub konumunda ve bizi birçok uygulamaya ulaştıran yazılımlar olacaktır. Onlardan biri Anaconda platformudur. Sadece Python değil aynı zamanda R ve Orange gibi ürünleri de içeren platformun bireysel kullanım amaçlı sürümüne https://www.anaconda.com/products/individual adresinden ulaşıp uygulama indirilebilir.

Python yardımıyla kodlama yaparken bazı özellikler dikkat çekicidir. Bu özellikler aşağıda özetlenmeye çalışılmıştır.

Ø  Blok oluşturma işlemi girintiler yardımıyla yapılır. Eğer bir blok oluşturmaya çalışıyorsanız kontrol ifadesinden sonra bir tab girinti ile işlem yapılmalıdır.

while (cevap=="E") or (cevap=="e"):

  print("döngü devam ediyor")

Ø  Koşul ifadeleri veya döngülerde blok komutlarından önce ve ifadelerden sonra iki nokta üst üste işareti kullanılır. Bir önceki örnekte kullanım görülmektedir.

Ø  Özellikle input komutu yardımıyla veri alınırken alınan veri tipi metin olup ihtiyaca göre tip dönüşümü yapılmalıdır. Örneğin; sayi=input(“bir sayı giriniz”) ifadesi yardımıyla alınan verinin tamsayı olarak işlem görebilmesi için int(sayi) şeklinde bir dönüşüme ihtiyaç vardır. 

2. PYTHON TEMELLERİ

Veri bilimi, yapay zeka ve veri madenciliğinde yoğun olarak kullanılan Python her şeyden önce yıllardır kullanılan genel amaçlı bir programlama dilidir. Bu kısımda bir programlama dili olarak Python dilinin temel özellikleri verilecektir.

2.1.  Veri giriş çıkışı

Python yardımıyla ekranda sabit veya değişken mesajlar görüntülemek, klavyeden veriler almak ve bunlar üzerinde temel işlemleri yapmak için basit giriş çıkış komutları desteklenmektedir. Bu komutlar print ve input komutları olup print komutu ekranı, input komutu klavyeyi temsil etmektedir.

2.1.1.    Print komutu

Python yardımıyla ekranda sabit bir metin olarak "Merhaba dünya" yazdırmak istersek yapmamız gereken şey uygun bir arabirim üzerinde;

          print ('Merhaba dünya') veya print (“Merhaba dünya”) 

yazmak olacaktır. Burada dikkat edilmesi gereken konu ekranda bir mesaj göstermek için kullanılan komutun print komutu olduğu ve print komutu kullanımında tek veya çift tırnak operatörünün kullanılabildiğidir. Sabit değer gösteriminde olduğu gibi değişken değer gösteriminde de print komutunu kullanabiliriz. Değişkenimiz benimDegiskenim isminde ve değeri 100 olsun. Kullanım aşağıdaki gibi olacaktır.

          benimDegiskenim=300

print(benimDegiskenim)

2.1.2.    Input komutu

Print komutu ekranı temsil ederken Input komutu da klavyeyi temsil eder. Dolayısıyla klavyeden bir değer almak istediğimizde bunu Input komutu yardımıyla yaparız. Örneğin, klavyeden bir isim isteyip ekrana o ismi aşağıdaki gibi bastırabiliriz.

isim=input("Size seslenebilmek için isminizi yazınız :")

print("merhaba "+isim)

Bu kod parçasında input komutunun kullanımı ve print komutunun farklı kullanımı görülmektedir. Input komutu ile klavyeden veri alınırken kullanıcıya gösterilecek mesajda komut içerisinde verilir. Komut yardımıyla klavyeden bir değer alındıktan sonra komut çıktısı olan değer bir değişkene atanır. Print komutunun buradaki farklı kullanımında ise yapılan işlem bir sabit değer olan “Merhaba” ile değişken olan “isim” değişkeninin birleştirilmesidir. Birleştirme sırasında + operatöründen yararlanılmıştır. Dolayısıyla Python ile metin birleştirmesi yapmak bu kadar kolaydır.

            isim=input("Adınızı giriniz :")

            print("Merhaba "+isim)

Bu seferki örneğimiz klavyeden önce doğum tarihini almak sonra da bu yılın tarihini alarak kişinin yaşının hesap edilmesi problemi olsun.  

dogum_tarihi=input("Doğum tarihinizi yıl olarak giriniz :")

mevcut_tarih=input("Bugünün tarihini yıl olarak giriniz :")

print("Yaşınız :")

print((int(mevcut_tarih))-(int(dogum_tarihi)))

Örneğimizde açıklanması gereken birkaç husus vardır. Bunlardan birincisi input komutu yardımıyla alınan değerler metin değerler olup onlar üzerinde sayısal işlem yapabilmek için tip dönüşümüne ihtiyaç vardır. Kodlar içerisinde int(mevcut_tarih) ve int(doğum_tarihi) bu nedenle kullanılmıştır. Eğer metin olarak alınan değer reel sayı olsaydı o zaman int yerine float değeri kullanılacaktı.

Sabit metin olan “Yaşınız :” metni ile yaşın hesap edildiği işlem bir araya getirilemediği için ayrı yazılmıştır. Burada da print içerisinde hem bir matematiksel işlem hem de metin ile birleştirme mümkün olmamıştır. 

2.2.    Koşul ifadeleri

Koşul ifadeleri diğer dillerde olduğu gibi If komutu ile yerine getirilmektedir. Temel yapısı If <şart> formatında olup şart kısmında iki değerin veya bir değişken ile bir değerin karşılaştırması yapılır. Yapılan karşılaştırmalar sırasında 6 farklı duruma göre sınama yapılır. Her bir sınama ve ona karşılık gelen operatörler aşağıda verildiği gibidir.

Python sınama ifadeleri

Eşitlik sınaması

if (a= =b)

Eşit değil sınaması

if (a != b)

Küçüklük sınaması

if (a<b)

Büyüklük sınaması

if (a>b)

Küçük veya eşit sınaması

if (a<=b)

Büyük veya eşit sınaması

if (a>=b)

 

Konuyla ilk örneğimizde a ve b gibi iki değeri birbiriyle karşılaştıralım.

 

a=10

b=20

if (a==b):

  print("a değeri ve b değerine eşittir")

elif (a<b):

  print("a değeri b değerinden küçüktür")

else:

  print("a değeri b değerinden büyüktür")

 Uygulamanın çıktısı ekranda "a değeri b değerinden küçüktür" mesajının görülmesi olacaktır.

Bir sonraki örneğimiz final notu ve başarı notuna göre geçme ve kalmayı kontrol eden uygulama olsun. Bu uygulamada final notu ve başarı notunun ikisi birden 50 ve üzeri iken öğrenci başarılı aksi takdirde başarısız sayılacaktır.

final = 55

bnotu = 45

if (final>50):

  if (bnotu>50):

    print("başarı ile geçtiniz")

  else:

    print("başarı notu yeterli değil")

else:

  print("final notu yeterli değil")

Yukarıdaki örneği iç içe kontrol yapısı yerine mantıksal bağlaç yardımıyla yeniden yazmak gerekirse karşımıza çıkacak yeni kod bloğu aşağıdaki gibi olacaktır.

final = 55

bnotu = 45

if (final>50) and (bnotu>50):

    print("başarı ile geçtiniz")

else:

  print("final veya başarı notu geçmek için yeterli değil")

2.3.    Döngüler

Programlama dillerinde döngüler rutin işlerin yerine getirilmesinde kullanılır. 1..n arasındaki sayıların kümülatif olarak toplanması veya n! Faktöriyel değerinin hesap edilmesi döngülerin kullanımı için en sık kullanılan örneklerdir. Python veri analizinde oldukça fazla veri yapısı ve yöntem içerdiği için döngülerle sıklıkla çalışma ihtiyacı bulunmaktadır. Problem uzayı açısından ise döngüler veri setinde arama veya sıralama işlemlerinde de kullanılır.

Döngü işlemlerinde sıklıkla while ve for komutları kullanılır. Döngülerde dikkat edilmesi gereken konu yapısal olarak üç ögenin eksiksiz verilmesidir.

·       Sayaç veya kontrol değişkenine ilk değer verme

·       Döngüden çıkış koşulu kontrolü

·       Döngü gövdesinde yapılan işlemler (işlem ve sayaç güncelleme) 

Eğer, döngü başlangıç koşulu ile döngü çıkış koşulu doğru şekilde ayarlanamazsa doğru sonucu elde edemez ve kimi zaman da sonsuz döngüler oluşturabiliriz. Bazı hatalı döngü örnekleri aşağıda bulunmaktadır.

i=1

while (i==1):

  print("döngü devam ediyor")

i değeri güncellenmediği için 1 olarak kalmakta ve döngü koşulu devamlı doğru (true) olduğu için döngü devamlı surette çalışmaktadır.

i=1

while (i<10):

  print("döngü devam ediyor")

Benzer şekilde i değeri güncellenmediği için yine sonsuz bir döngü elde edilir. Bu döngünün düzeltilmesi için yapılması gereken işlem döngü bloğu içerisine sayacı güncelleyen bir satırın eklenmesidir.

i=1

while (i<10):

  print("döngü devam ediyor")

  i=i+1

Bu kod parçasının çıktısı 10 kere “döngü devam ediyor” metninin yazılması olacaktır. Çünkü yukarıdaki kod parçası bir döngüde olması gereken temel üç özelliği de sağlamaktadır. Kimi zaman döngüler bir sayaç değerine göre değil bir metin değerine göre de devam edebilir. Öyle bir örnek aşağıda verilmiştir.

cevap="E"

while (cevap=="E") or (cevap=="e"):

  print("döngü devam ediyor")

  cevap=input("devam etmek istiyor musunuz (devam etmek için e veya E giriniz) :")

Ekranda “döngü devam ediyor” mesajının devamında “devam etmek istiyor musunuz (devam etmek için e veya E giriniz) :” mesajı çıkacak ve sizden bir giriş bekleyecektir. Giriş değeri ‘e’ veya ‘E’ olduğu takdirde işlem devam edecek bu değer başka bir değer olduğunda ise döngüden çıkış işlemi gerçekleşecektir.

Döngü komutu olarak sıklıkla kullanılan ifadelerden birisi de hiç şüphesiz for ifadesidir. For yardımıyla kurulacak döngü örnekleri aşağıda sunulmuştur. Konuyla ilgili ilk örnek bir listede yer alan elemanların sırayla gösterilmesi olacaktır. 

numbers=(1,2,3,4,5,6)

for sayi in numbers:

  print(sayi)

numbers 6 adet sayının içerisinde bulunduğu bir dizi değişkeni olup döngü komutu yardımıyla dizideki elemanlar sırayla ekrana bastırılmıştır. Bazen tanımlı veri kümeleri kullanılır ve sıfır başlangıç değerinden bir bitiş değerine kadar aralıktaki sayılar yazdırılabilir.

for x in range(5):

  print(x)

Elde edilen çıktı 0 değerinde 4 değerine kadar 5 adet sayının ekranda gösterilmesi olacaktır. Dolayısıyla indis değeri 0’dan başlamaktadır. Bazen de başlangıç değeri sıfır değil de başka bir sayı olabilir. Örneğin 3 değerinden başlayıp 6 değerine kadar sayıları ekranda görmek istersek aşağıdakini yazarız.

for x in range(3, 6):

  print(x)

Bu kod bolğunun çıktısı olarak ekranda 3, 4 ve 5 değerleri görünecektir. Biz bazen de değerleri birer artan şeklinde değil de daha büyük artım veya eksiltimler şeklinde sunabiliriz. Örneğin 3 değerinden başlayıp 8 değerine kadar 2’şer artım ile aşağıdaki gibi yazabiliriz.

for x in range(3, 8, 2):

  print(x)

Bu yazımın ardından ekranda 3, 5 ve 7 rakamları görünecektir. Eğer azalan sırada bir gösterim ihtiyacı varsa o zaman aşağıdaki gibi yazımı tercih ederiz. Büyük olan değer önce küçük olan sonra ve azaltım miktarı en sonda verilir.

for x in range(8, 3, -2):

  print(x)

2.4.    Liste kullanımı

Python tarafından desteklenen veri yapılarından birisi listelerdir. Listeler dinamik veri yapıları olup dizilere (arrays) nispetle çeşitli avantajları bulunmaktadır. Daha büyük boyutlu verilerle listeler yardımıyla çalışabiliriz ve ayrıca daha esnek şekilde bellek yönetimi sağlayabiliririz.

Listelerle çalışabilmek için öncelikle boş liste oluşturulur. Adı benimListem olan liste aşağıdaki gibi oluşturulur.

benimListem = []

Listeye eleman eklemek için yapılması gereken işlem oldukça basittir. Bu listeye 1, 2 ve 3 değerlerini aşağıdaki gibi ekleyebiliriz.

benimListem.append(1)

benimListem.append(2)

benimListem.append(3)

Listedeki elemanların hepsini bir arada görmek istersek;

print(benimListem)

Listedeki elemanları tek tek görmek istersek o zaman da;

print(benimListem[0]) # ilk elemanı (1) gösterir

print(benimListem[1]) # ikinci elemanı (2) gösterir

print(benimListem[2]) # üçüncü elemanı (3) gösterir

Listelerle yapılabilecek işlemler bunlarla da sınırlı değildir. Eğer değişken tanımıyla birlikte liste oluşturmak istersek;

iris = ['setosa', 'versicolour', 'virginica']

Listeden bir elemanı bir değişkene almak istediğimizde ise;

ilk_eleman = iris[0]

print('listenin ilk elemanı :'+ilk_eleman)

Şeklinde yazarız.

Listenin son elemanını bulmak için de farklı bir yol kullanır ve indis değerini -1 olarak veririz.

son_eleman = iris[-1]

print('listenin son elemanı :'+son_eleman)

2.5.    Fonksiyon kullanımı

Program kodunun tek parça olması idare edilmesini ve hata bulunmasını zorlaştırır. O nedenle proje kodunun fonksiyon adı verilen alt program parçalarına bölünmesi benimsenmiştir. Fonksiyonlar python dilinde de kullanılmaktadır. Konuyla ilgili ilk örneğimiz selamlar fonksiyonu olsun. Bu fonksiyonun tek görevi sabit bir mesajı ekranda göstermektir.

def basit_selamlama():

  print("İlk fonksiyondan merhaba!")

def önbildirimi ile başlayan fonksiyon yazımı fonksiyon adı, fonksiyon operatörü () ve iki nokta üst üste operatörü ile devam eder. İki nokta üst üste operatöründen sonra fonksiyon gövdesine geçilir. Fonksiyon gövdesi girinti yardımıyla içeriden yazılır.

basit_selamlama()

Yazılan fonksiyonun ana programdan çağrılması ise doğrudan fonksiyon adını yazarak olur. Bazen de argümanlar yardımıyla fonksiyon yazmamız gerekebilir. Bu durumda fonksiyon sözdiziminde farklılıklar meydana gelecektir. 

def argumanla_selamlama(isim, soyad):

  print("Selam %s  %s"%(isim, soyad))

argumanla_selamlama başlıklı bu fonksiyonda dış dünyadan isim ve soyad adında iki argüman alınmakta ve alınan bu bilgilere Selam isim soyad şeklinde seslenme çıktısı elde edilmektedir. İlgili fonksiyonun ana program içerisinde kullanımı aşağıdaki gibi olmuştur. 

argumanla_selamlama("Hidayet", "Takcı")

Eğer biz bir fonksiyon yardımıyla iki sayının toplamını almak ve sonucunu ana programa göndermek istiyorsak yapmamız gereken işlem basittir. Argümanları kullanırız ve return ifadesi yardımıyla da sonucu ana programa döndürürüz.

def toplam(a, b):

  return a + b

sayi1=input("bir sayı giriniz :")

sayi2=input("diğer sayiyi giriniz :")

x = toplam(int(sayi1),int(sayi2))

print(x)

İşlemi bir adım daha ileriye götürüp hesap makinesi programına çevirmek istersek yapmamız gereken işlem çok zor olmayacaktır. Dört işlem için dört fonksiyon tanımlayacak, işlem kodu için yeni bir değer girişi yapacak ve koşullu ifadeler yardımıyla sonucu elde edeceğiz.

def toplam(a, b):

  return a + b

def fark(a, b):

  return a - b

def carpim(a, b):

  return a * b

def bolum(a, b):

  return a / b

sayi1 =input("bir sayı giriniz :")

sayi2 =input("diğer sayiyi giriniz :")

islem =input("bir işlem kodu giriniz ( +, -, *, / )")

if (islem=='+'):

  sonuc = toplam(int(sayi1),int(sayi2))

  print(sonuc)

elif (islem=='-'):

  sonuc = fark(int(sayi1),int(sayi2))

  print(sonuc)

elif (islem=='*'):

  sonuc = carpim(int(sayi1),int(sayi2))

  print(sonuc)

elif (islem=='/'):

  sonuc = bolum(int(sayi1),int(sayi2))

  print(sonuc)

else:

  print("hatalı işlem kodu seçimi")

2.6.    Sınıf kullanımı

Python yeteneklerinden birisi de sınıf tanımlamayı ve kullanımını desteklemesidir.

2.7.    Sözlük kullanımı

Liste kullanımına benzer olmakla birlikte veriler anahtar – değer ikilisi olarak sunulur. Bu veri yapısının sözlük adıyla anılmasının sebebi de sözlüklerde olduğu gibi sözcük – kelime anlamı yapısına benzerliği nedeniyledir. Sözlük veri yapısı yardımıyla çalışırken listelerde olduğu gibi öncelikle boş bir sözlük oluşturulur ve sonra anahtar – değer ikilileri şeklinde veri girişi yapılır.

adresdefteri = {}

adresdefteri["Hidayet"] = 2492

adresdefteri["Gurkan"] = 2235

adresdefteri["Kali"] = 2461

Sözlük veri yapısı ile oluşturulmuş adresdefteri isimli değişkene yapılan kayıtların neler olduğu görülmek istendiğinde;

print(adresdefteri)

Komutu kullanılmış olup komut çıktısı aşağıdaki gibi olmuştur.

{'Hidayet': 2492, 'Gurkan': 2235, 'Kali': 2461}

Sözlük veri yapısına tanımlama sırasında değer girişi için yapılacak işlem aşağıda gösterildiği gibidir.

          sozluk ={'renk':'yeşil', 'uzun_kenar':5}

Yukarıda yapılan veri girişi sonrasında biz anahtarını vererek değerini aşağıdaki gibi bulabiliriz.

print("renk değeri "+sozluk['renk'])

Eğer, sözlüğe yeni bir anahtar – değer ikilisi eklemek istersek o zaman yapmamız gereken işlem aşağıdaki gibi olacaktır. 

sozluk['kisa_kenar']=3

print(sozluk)

Eklenen yeni girişin ardından sozluk değişkeninin çıktısı aşağıdaki gibi görülecektir.

{'renk': 'yeşil', 'uzun_kenar': 5, 'kisa_kenar': 3}

Sözlükler ile ilgili olarak yapılacak işlemlerden birisi döngüler yardımıyla sözlük verileri arasında gezmek ve anahtar değer eşleşmelerini sırayla görmek olacaktır.

adresdefteri = {}

adresdefteri["Hidayet"] = 2492

adresdefteri["Gurkan"] = 2235

adresdefteri["Kali"] = 2461

print(adresdefteri)

for isim, telefon in adresdefteri.items():

  print(isim + ' telefon numarası ' + str(telefon))

Bu kod parçasının çıktısı aşağıdaki gibi olmuştur.

{'Hidayet': 2492, 'Gurkan': 2235, 'Kali': 2461}

Hidayet telefon numarası 2492

Gurkan telefon numarası 2235

Kali telefon numarası 2461

2.8.    Set kullanımı

Set veri yapısı diğer veri yapılarına benzemekle birlikte işlevsel olarak birçok özelliği bulunmaktadır. Bunlardan ilki set ile tanımlaman bir metnin bileşenlerine ayrılmasıdır. Aşağıdaki örnek set yardımıyla metni bileşenlerine ayırma işlemi yapar.

print(set("bu metin set yardımıyla ayrılacaktır".split()))

Komut çalıştırıldıktan sonra aşağıdaki çıktı elde edilecektir.

{'set', 'bu', 'ayrılacaktır', 'metin', 'yardımıyla'}

Set veri yapısı yardımıyla iki küme arasındaki kesişim elde edilebilir. İki küme a ve b olmak üzere bu iki kümede birden yer alan değer intersection komutuyla elde edilir.

3.         PYTHON KÜTÜPHANELERİ

Python oldukça kapsamlı ve genel amaçlı bir programlama dilidir. Zenginliğinin kaynağı hem dil tarafından desteklenen yapılar hem de zengin kütüphaneleridir. Kitabın bu bölümünde veri madenciliği ve makine öğrenmesi ile daha ilişkili olan; Numpy ve Pandas kütüphaneleri detaylı, Matplotlib, Scikit-Learn, Tensorflow ve Statsmodels kütüphaneleri ise sadece amacı açısından anlatılmıştır.     

3.1.  NumPy kütüphanesi

NumPy ismi Numerical Python sözcüklerinden türemiştir. Amacı bilimsel hesaplamaları yerine getirmek olan bir matematik kütüphanesidir. Temel olarak dizi işlemlerini yerine getiren ve doğrusal cebir konularına kolaylıklar sağlayan bir kütüphanedir. NumPy kütüphanesini kullanabilmek için aşağıdaki gibi kütüphanenin eklenmesi lazımdır.

import numpy as np

NumPy yardımına bir dizi tanımlamak için yapılması gereken işlem şöyledir.

numpy_dizisi = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

Eğer iki boyutlu bir dizi oluşturmak istersek o zaman yapmamız gereken çalışma şöyle olacaktır.

numpy_dizisi2 = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])

Yukarıdaki kullanımda iki boyutlu bir dizi tanımlamak için iç içe köşeli parantez kullanımına dikkat edilmelidir. Her iki tanımlamanın ardından dizi boyutlarını görmek için ndim özelliğini kullanabiliriz.

print(numpy_dizisi.ndim) // sonuç 1 olacaktır

print(numpy_dizisi2.ndim) // sonuç 2 olacaktır

Ayrıca her birinin kaç satır ve kaç sütundan oluştuğunu görmek için shape komutu kullanılır.

print(numpy_dizisi.shape) // sonuç 6 olacaktır.

print(numpy_dizisi2.shape) // sonuç (2,3) olacaktır. Çünkü 2 satır 3 sütun bulunmaktadır. Dizi elemanlarını reshape komutu yardımıyla yeniden düzenleyebilir ve farklı açılardan görebiliriz. Örneği veriyi tanımladımızda veri (1,10) yani 1 satır 10 sütun formatında ve viz bunu 10 satır 1 sütun şeklinde görmek istersek yapmamız gereken işlem reshape yardımıyla;

print(numpy_dizisi.reshape(10,1))

Hatta 1 satır 10 sütundan oluşan veriyi 2 satır 5 sütun halinde bile yeniden düzenleyebiliriz. Yapmamız gereken tek işlem;

print(numpy_dizisi.reshape(2,5))

arange isimli komut yardımıyla np dizilerinde başlangıcı, bitişi ve artım miktarı verilen değerler üretebiliriz. Örneğin;

np.arange(0,10,3)

Kullanımı ile (0, 3, 6, 9) rakamlarını elde ederiz. numpy_dizisi isimli değişkenin very tipini öğrenmek istersek o zaman yazmamız gereken ifade;

numpy_dizisi.dtype.name olacaktır.

Aynı dizinin eleman sayısını bulmak istediğimizde ise bu sefer size komutu kullanılacaktır.

numpy_dizisi.size

Sıfır değerlerinden oluşan bir dizi için;

numpy_dizisi.zeros(2, 4)

Bir değerlerinden oluşan bir dizi için;

numpy_dizisi.ones(2, 4)

Boş bir dizi oluşturabilmek için;

numpy_dizisi.empty(2, 4)

İki diziyi birbiriyle çarpmak için;

a=np.array([1, 2, 3])

b=np.array([3, 4, 5])

a*b

İşlem sonunda ekranda aşağıdaki değerler görülür.

array([3, 8, 15])

Dizi tanımlamalarının sonrasında toplama, çıkarma ve diğer işlemleri çarpma işlemini yaptığımız gibi yaparız. Dizi çarpımından farklı olarak iki matrisi çarpmak istediğimizde matrislerden birinin transpozunu almaya ihtiyaç vardır. Bu nedenle yapılması gereken işlem adımları şöyle olacaktır.

a=np.array([[1,3,5],[2,4,6]])

b=np.array([[2,3,4],[4,5,6]])

a.dot(b) // hata verecektir. O nedenle;

a.dot(b.T) // şeklinde kullanılmalıdır.

Diğer işlemler; a ve b birer dizi olmak üzere toplama, en küçük değer bulma, en büyük değer bulma, karekök alma, kümülatif toplama gibi işlemler aşağıdaki gibi sunulabilir.

a.sum()

a.max()

a.min()

np.sqrt(a)

np.square(a)

b.sum(axis=0) // sütunlar toplamı

b.sum(axis=1) // satırlar toplamı

Dizi elemanlarına ulaşım;

dizi_değişkeni[i, j] // i+1 satır ve j+1 sütun numaralı elemanı getirir.

a[:,1] // bütün satırlardaki 2. Sütuna ait değerleri getirir.

a[1,:] // sadece 2. Satırdaki bütün değerleri getirir.

a[-1,:] // son satırdaki tüm sütunları getirir.

a[:,-1] // tüm satırlardaki son sütunu getirir.

3.2.  PANDAS kütüphanesi

Pandas kütüphanesi NumPy kütüphanesini tamamlayan bir kütüphanedir. Homojen olmayan veri yapılarında ve eksik verilerin söz konusu olduğu durumlarda imdada yetişen bir kütüphanedir. Temel olarak DataFrame ve Series şeklinde iki veri yapısını destekler. Pandas kütüphanesini eklemek için aşağıdaki ifade yazılmalıdır.

import numpy as np

import pandas as pd

3.2.1.    Nesne oluşturma

Bir pandas serisi oluşturmak ve o seriye veri atamakla ilgili satırlar aşağıda verildiği gibidir.

pandasSerisi = pd.Series([1, 3, 5, np.nan, 6, 8])

Bir tanesi de boş değer (np.nan) olan 6 değer seri olarak tanımlanmıştır. Şimdi önce bir tarih serisi oluşturup ardından tarih bilgisiyle birlikte random değerlerden oluşan bir dataframe oluşturalım.

tarihler = pd.date_range(‘20200101’, periods=6)

Bu komutla birlikte 01/01/2020 başlangıç olmak üzere 6 adet tarih bilgisi aşağıdaki gibi elde edilecektir.

DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',

               '2020-01-05', '2020-01-06'],

              dtype='datetime64[ns]', freq='D')

Ardından aşağıdaki satırı yazalım.

df = pd.DataFrame(np.random.randn(6, 3), index=tarihler, columns=list('XYZ'))

Bu satırın açıklaması şöyledir: numpy kütüphanesi yardımıyla 6 satır ve 3 sütundan oluşan bir dataframe oluştur. Oluşturulan dataframe için index bilgisi tarihler serisinden gelsin. Kolon isimleri XYZ olsun ve değerler random oluşturulsun. Sonuç ekranı aşağıdaki gibidir.

 

X        

Y        

Z

1.01.2020

-0.195651

-0.803418

-0.658856

2.01.2020

-0.207879 

0.960277

-0.344220

3.01.2020

-1.571.570

-0.763220

-1.011.676

4.01.2020

0.505514

-1.033.324

-1.248.981

5.01.2020

-0.753375

-1.277.116

-0.193132

6.01.2020

0.848490

-0.057527

-1.241.682

Eğer index bilgisi olarak tarih verileri değil de başka bir bilgi kullanmak isteseydik o zaman sırayla aşağıdaki işlemleri yapmamız gerekirdi.

Önce;

seri=pd.Series(['satır 1','satır 2','satır 3'])

Şeklinde bir tanımlama ile satır numaralarından oluşan seri isimli bir veri yapısı oluştururduk. Daha sonra;

df = pd.DataFrame(np.random.randn(3, 3), index=seri, columns=list('XYZ'))

Yardımıyla, değerleri yine random olarak sunacak fakat 3 satır ve 3 sütun şeklinde bir matris verecek bir dataframe oluştururuz. Çıktı aşağıdaki gibi olacaktır.

                     X                  Y                  Z

satır 1           1.213373      0.892767      -1.915159

satır 2           0.864402      0.591875      0.399380

satır 3           0.526204      -0.271156     0.196229

Bir dataframe sözlükte olduğu gibi farklı veri tipleriyle de oluşturulabilir.

yeniFrame = pd.DataFrame({'A': 2.,
   ...:                     'B': pd.Timestamp('20200101'),
   ...:                     'C': pd.Categorical(["test", "train", "test", "train")]),
   ...:                     'C': 'foo'})

Şeklinde olabilir.

3.2.2.    Veriyi görme

Bir dataframe içerisindeki en tepedeki satırları görmek için;

df.head()

Sondaki 3 elemanı görmek için,

df.tail(3)

dataframe için index bilgisini görmek için,

df.index

dataframe kolonlarını görmek için,

df.columns

dataframe özet istatistiklerini görmek için,

df.describe()

Kod çalıştırıldığında aşağıdaki gibi sonuç elde edilir.

                     X                  Y                   Z

count            3.000000      3.000000      3.000000

mean            0.867993      0.404495      -0.439850

std                0.343599      0.604162      1.281686

min               0.526204      -0.271156     -1.915159

25%             0.695303       0.160360     -0.859465

50%             0.864402      0.591875      0.196229

75%             1.038888      0.742321      0.297805

max              1.213373      0.892767      0.399380

Bu bilgiler kitabımızın özet istatistikler kısmında verilen birçok istatistiği bir arada sunmaktadır. Verilerin transpozunu almak istediğimizde yazmamız gereken kod parçası;

df.T

Bu komutu çalıştırdığımızda elde ettiğimiz sonuç ise aşağıda verildiği gibi olmuştur.

          satır 1           satır 2           satır 3

X        1.213373      0.864402      0.526204

Y        0.892767      0.591875      -0.271156

Z        -1.915159     0.399380      0.196229

Dataframe içerisinde yer alan verilerin kolon sıralarını değiştirmek için;

df.sort_index(axis=1, ascending=False)

Kullanılır ve çıktı aşağıdaki gibi oluşur.

                     Z                  Y                  X

satır 1           -1.915159     0.892767      1.213373

satır 2           0.399380      0.591875      0.864402

satır 3           0.196229      -0.271156     0.526204

Bazen bu işlem bir kolondaki değerlere göre sıralama şeklinde olabilir.

df.sort_values(by='Y')

Bu kullanımın amacı Y kolonunda yer alan değerlere dayalı olarak verilerin küçükten büyüğe şeklinde sıralanmasıdır. Çıktı aşağıdaki gibi gerçekleşmiştir.

                     X                  Y                  Z

satır 3           0.526204      -0.271156     0.196229

satır 2           0.864402      0.591875      0.399380

satır 1           1.213373      0.892767      -1.915159

3.2.3.    Veriyi seçme

Pandas kütüphanesi veri seçimi konusunda da oldukça kuvvetli yeteneklere sahiptir. Öneğin dataframe içerisinde sadece X kolonunda bulunan değerleri elde etmek istersek;

df['X']

Yazmamız yeterli olacaktır. Ilk iki satırda yer alan veriyi seçmek istersek;

df[0:2]

X                            Y                            Z

satır 1           1.213373      0.892767      -1.915159

satır 2           0.864402      0.591875      0.399380

 

Bazen veri seçimini kayıtla ilgili ID vererek yapmak isteriz. Örneğin, ‘satır 1’ de yer alan kayıtları seçmek için;

df.loc[‘satır 1’]

Kullanır ve çıktıyı aşağıdaki gibi görebiliriz.

X    1.213373

Y    0.892767

Z   -1.915159

Bazen de kolon seviyesinde seçim yapmak isteriz ve aşağıdaki gibi bir yazımı tercih ederiz.

df.loc[:, ['X', 'Z']]

Bu yazım sayesinde dataframe içerisindeki bütün satırlar görünür fakat sadece X ve Z kolonu görünür.

                     X                            Z

satır 1           1.213373      -1.915159

satır 2           0.864402      0.399380

satır 3           0.526204      0.196229

Bu seçimin üzerine eğer bir de satır seviyesinde seçim yapmak istersek;

df.loc['satır 1':'satır 2', ['X', 'Z']]

                      X                 Z

satır 1           1.213373      -1.915159

satır 2           0.864402      0.399380

Şeklinde bir yazım tercih ederiz. Böylece satırlardan iki tanesi ve kolonlardan iki tanesi seçilmiş olacaktır. Hücre mantığında bir seçim yapmak istediğimizde satır ve sütun bilgisini vermeye ihtiyaç olacaktır. Örneğin, üçüncü satırdeki Y elemanı görmek istersek o zaman aşağıdaki ifadeyi yazarız.

df.loc['satır 3','Y']

Seçme işlemi bazen pozisyon bilgisi yardımıyla yapılır. O zaman iloc metodu kullanılır. Bu metot için indis değeri 0 (sıfır) ile başlar. Dolayısıyla üçüncü satırdaki elemanı iloc metodu ile görmek istersek o zaman;

df.iloc[2]

Komutunu yazarız. Çıktısı aşağıda görüldüğü gibidir. 

X   

0.526204

Y  

-0.271156

Z  

 0.196229

Name: satır 3, dtype: float64

İloc metodu yardımıyla satır ve sütun seviyesinde seçim yapabiliriz.

df.iloc[3:5, 0:2]

Bu kullanım sayesinde 4 ve 5. Satırlara ait birinci ve ikinci sütunda yer alan değerler gösterilir. Bazen bir koşula dayalı olarak da biz verileri görmek isteyebiliriz.

df[df['X'] > 0]

Burada yapılan çalışma X kolonunda değeri 0’dan büyük olan satırların gösterilmesidir.

3.3.  Matplotlib kütüphanesi

Matplotlib kütüphanesinin amacı veri görselleştirme seçeneklerinin çalıştırılmasıdır. Veri görselleştirme veri keşif faaliyetlerinden birisi olup veri analiz öncesi yapılması gereken bir faaliyettir. Matplotlib kütüphanesini eklemek için aşağıdaki satır yazılır.

import matplotlib.pyplot as plt

Kütüphane yardımıyla yapılacak ilk çalışma iki boyutlu bir düzlemde verilen X ve Y değerlerine dayalı olarak bir grafik çizdirmek olacaktır. y=x3 grafiği için aşağıdaki komut verilmelidir.

plt.plot([1, 2, 3, 4], [1, 8, 27, 64], 'ro')

plt.axis([0, 6, 0, 65])

plt.show()

Burada önce X değerleri sonra Y değerleri verilmiştir. Ayrıca X ve Y değerleri için aralıklar verilmiştir. Elde edilen çıktı aşağıdaki gibidir.

Aynı anda bir grafikte iki farklı seri gösterilmek istenirse aşağıdaki ifade yazılmalıdır.

3.4.  Scikit-learn kütüphanesi

Scikit-learn kütüphanesi Python yardımıyla makine öğrenmesi algoritmalarının kullanımını mümkün hale getiren kütüphanedir. Bu kütüphane yardımıyla denetimli ve denetimsiz öğrenme yöntemleri kullanılabilir. Ayrıca model uydurma, model karşılaştırma gibi birçok makine öğrenmesi işlevi yerine getirilmektedir.

 

Kütüphane yardımıyla çok sayıda makine öğrenmesi algoritması kullanılabilir ve fit yöntemi yardımıyla tahminciler verilere uydurulur. Makine öğrenmesi algoritmalarını geliştirmek amacıyla kullanılan temel kütüphane scikit-learn kütüphanesidir. Bu bölümde scikit-learn kütüphanesi yardımıyla bazı makine öğrenme algoritmaları yerine getirilecektir.

3.5.  Tensorflow kütüphanesi

Tensorflow, Google tarafından geliştilmiş, açık kaynak kodlu bir derin öğrenme kütüphanesidir. Tensorflow farklı platformlar için de destek sağlamaktadır. Web ortamında, mobil ortamda ve diğer ortamlarda kullanabilirsiniz. Bugüne kadar yapılan örneklerinden birisi kamera görüntülerinden hareketli nesne tanımadır. Ayrıca emoji tanıma üzerine çalışma yapıldığı da görülmüştür.

3.6.  Statsmodels kütüphanesi

Statsmodels kütüphanesi, model tahmini, istatistiki testler, istatistiksel veri analizi gibi imkânlar barındıran bir Python kütüphanesidir. Sadece bir istatistik modülü değil aynı zamanda makine öğrenmesi araçlarını da sağlayan bir kütüphanedir. Kütüphane kapsamında; zaman serileri analizi, normal dağılım, faktör analizi, ANOVA, MANOVA gibi işlemler desteklenmektedir. 

Not: Kaynak göstermek şartıyla kullanılabilir. 

Yorumlar

Bu blogdaki popüler yayınlar

VERİ MADENCİLİĞİ NEDİR?

MAKİNE ÖĞRENMESİ NEDİR?