Veri bilimi için temel Python kullanımı

Veri bilimi için kullanılabilecek en önemli dillerden biri Python'dur. Python kolay öğrenilebilen sentaksı (syntax) ve veri bilimine yönelik hazırlanan çok güçlü kütüphaneleri sayesinde istediğiniz işlemleri çok etkin bir şekilde yapabilmenize olanak sağlar. Veri bilimine giriş yapmak isteyenlerin bu dili temel seviyede öğrenmeleri tavsiye edilir.

Bu dokümanda dili formal bir şekilde öğretmek yerine veri biliminde lazım olabilecek operasyonlar hakkında ufak kod parçaları vermenin daha iyi olabileceğini düşündüm.


TEMEL DEĞİŞKENLER
In [1]:
# Python sürümünü görelim
import sys # kütüphane bu şekilde ekleniyor
print("Kullanılan python sürümü")
print(sys.version)
# Bir satır boşluk
print("\n")

# Değikenler

# integer
a = 2
print("a = %d / Tipi: %s" % (a,type(a).__name__ ) )
print("\n")

# float
b = 3.0
print("b = %f / Tipi: %s " % (b,type(b).__name__ ) )
print("\n")

# boolean
c = True
print("c = %r / Tipi: %s " % (c,type(c).__name__ ))
print("\n")

# string
d = "demo"
print("d = %s / Tipi: %s " % (d,type(d).__name__ ))
print("\n")

# kompleks
e = 1j
print("e = %s / Tipi: %s " % (e,type(e).__name__ ))
Kullanılan python sürümü
3.6.5 |Anaconda, Inc.| (default, Mar 29 2018, 13:32:41) [MSC v.1900 64 bit (AMD64)]


a = 2 / Tipi: int


b = 3.000000 / Tipi: float 


c = True / Tipi: bool 


d = demo / Tipi: str 


e = 1j / Tipi: complex 
  • Değişkenleri birbirine dönüştürme
In [2]:
# Örnek olarak float bir değişkeni int'e çevirelim
a = 1.345
print("a = %f / Tipi: %s" % (a,type(a).__name__ ) )
a = int(1.345)
print("a = %d / Tipi: %s" % (a,type(a).__name__ ) )
print("\n")


# Örnek olarak float bir değişkeni str'e çevirelim
a = 1.345
print("a = %f / Tipi: %s" % (a,type(a).__name__ ) )
a = str(1.345)
print("a = %s / Tipi: %s" % (a,type(a).__name__ ) )
a = 1.345000 / Tipi: float
a = 1 / Tipi: int


a = 1.345000 / Tipi: float
a = 1.345 / Tipi: str

VERİ YAPILARI (DATA STRUCTURES)

LIST

In [3]:
# Bir list yaratalım
a_list = [1,2,3,4,5]
In [4]:
# Belirli elemanına erişim
print(a_list[0])

# Listenin başlangıcından 2. elemanına kadar kesit alalım
# Bu operasyon liste döndürür
print(a_list[:2])

# Listenin 2. elemanından sonuncu elemanına kadar kesit alalım
print(a_list[2:])

# Listenin 2. elemanından 3. elemanına kadar kesit alalım
print(a_list[2:3])

# Listenin son elemanına erişim
print(a_list[-1])
1
[1, 2]
[3, 4, 5]
[3]
5

Listenin elemanları farklı veri yapıları, hatta başka listeler olabilir. Yukarıda erişim operasyonları bunun için de geçerlidir.

In [5]:
b_list = [1, "merhaba", True, [1,2,3,4], 3.14,["hoşçakal",1234]]
print(b_list)
print(b_list[2:4])
[1, 'merhaba', True, [1, 2, 3, 4], 3.14, ['hoşçakal', 1234]]
[True, [1, 2, 3, 4]]

Listenin içindeki listelere erişim sağlarken ikili indeksleme kullanmamız gerekir.

In [6]:
b_list[-1][0]
Out[6]:
'hoşçakal'
  • List Comprehensions
    Bu işlem tek satırda listelerden başka listeler elde etmeye yarar. Aslında işlev olarak for döngüsü ile birebir aynıdır fakat daha havalı görünür :) Çok kompleks şeyler yazılabilir, şimdilik basit bir örnek vererek giriş yapmış olalım. Örneğimiz bir listenin her bir elemanının karesini alarak yeni bir liste oluşturmak olsun.
In [7]:
a_list = [1,2,3,4,5,6]
b_list = [x**2 for x in a_list]
print(b_list)
[1, 4, 9, 16, 25, 36]

TUPLES
Tuple tanımlanırken köşeli parantez yerine yuvarlak parantez kullanılır.
Tuple veri tipinin en önemli özelliği "immutable" olmasıdır. Yani "tuple"ı bir kere tanımladıktan sonra değiştirmeniz mümkün değildir.
Aşağıdaki örnekte ilk elemanı değiştirmeye çalıştığımızda bir hata mesajı çıkacak. ('tuple' object does not support item assignment)

In [8]:
a_tuple = (1,"bir")
print(a_tuple[0])
print(a_tuple[1])
# tuple elemanını değiştirmeye çalışalım
try:
    a_tuple[0] = "değişir mi?"
except Exception as e:
    print(e)
    
1
bir
'tuple' object does not support item assignment

DICTIONARY
En faydalı veri tiplerinden biri de "dictionary"lerdir, sıklıkla kullanılır.
Anahtar - Değer (Key -Value) eşlerinden oluşur

In [9]:
dict_a = {"liste":[1,2,3,4],"metin":"dictionary örneği",
          "dict_icinde_dict": {"a":[1,2],"b":[3,4]},
          "my_favorite_bands":["Pink Floyd","Queen"],
         "my_favorite_songs":["Time","Bohemian Rhapsody"]}
dict_a
Out[9]:
{'liste': [1, 2, 3, 4],
 'metin': 'dictionary örneği',
 'dict_icinde_dict': {'a': [1, 2], 'b': [3, 4]},
 'my_favorite_bands': ['Pink Floyd', 'Queen'],
 'my_favorite_songs': ['Time', 'Bohemian Rhapsody']}
In [10]:
# İçindeki elemanlara erişim
dict_a["dict_icinde_dict"]
Out[10]:
{'a': [1, 2], 'b': [3, 4]}
In [11]:
# İkinci seviyeye de erişim istersek
dict_a["dict_icinde_dict"]["a"][-1]
Out[11]:
2

SET
Sıralanmamış ve indekslenmemiş elemanlar bütünüdür. Birleşim, kesişim, fark gibi operasyonları kolaylıkla set kullanarak yapabiliriz

In [12]:
a_set = {1,2,3,4,5}
b_set = {4,5,6,7,8}
# Birleşim
print("   Birleşim")
print(a_set.union(b_set))
#veya
print(a_set | b_set)

# Kesişim
print("   Kesişim")
print(a_set.intersection(b_set))
#veya
print(a_set & b_set)

# Fark
print("   a_set'in b_set'ten farkı")
print(a_set.difference(b_set))
# veya
print(a_set-b_set)

# Simetrik fark
print("   Simetrik fark")
print(a_set ^ b_set)
   Birleşim
{1, 2, 3, 4, 5, 6, 7, 8}
{1, 2, 3, 4, 5, 6, 7, 8}
   Kesişim
{4, 5}
{4, 5}
   a_set'in b_set'ten farkı
{1, 2, 3}
{1, 2, 3}
   Simetrik fark
{1, 2, 3, 6, 7, 8}

TEMEL MATEMATİKSEL İŞLEMLER

Numerik basit değişkenler için

In [13]:
a = 6
b = 3.0
print("a = %d " % a)
print("b = %f " % b)
print("   Toplama a+b ")
print(a + b)
print("   Çıkarma a-b ")
print(a-b)
print("   Değişken eşitleme c=a+b ")
c=a+b
print(c)
print("   Bölme a/b ")
print(a/b)
print("   Çarpma a*b ")
print(a*b)
print("   Kuvvetini alma a**b ")
print(a**b)
print("   Modunu alma a%(b+1) ")
print(a%(b+1))
a = 6 
b = 3.000000 
   Toplama a+b 
9.0
   Çıkarma a-b 
3.0
   Değişken eşitleme c=a+b 
9.0
   Bölme a/b 
2.0
   Çarpma a*b 
18.0
   Kuvvetini alma a**b 
216.0
   Modunu alma a%(b+1) 
2.0

Listeler için

In [14]:
a_list = [1,2]
b_list = [3,4,5]
# iki listeyi ard arda ekler
print(a_list+b_list)
# Listeyi tekrar ederek ekler
print(a_list*4)
[1, 2, 3, 4, 5]
[1, 2, 1, 2, 1, 2, 1, 2]

String'ler için

In [15]:
a_str = "asd"
b_str = "qwerty"
# İki stringi ard arda ekler
print(a_str+b_str)
# String'i tekrar eder
print(a_str*4)
asdqwerty
asdasdasdasd
AKIŞ KONTROLÜ

"if / else" ifadeleri ve matıksal operatörler

In [16]:
# İki değişken yaratalım
k=5
l=10

# Eşittir operatörü
if k==5: 
    print("k==5 doğru")

# Eşit değildir operatörü 
if k!=5:
    print("hiçbir şey")
else:
    print("Else kısmına geldi")
    
# Büyüktür operatörü
if k>3:
    print("k, 3'ten büyüktür")

# Küçüktür 
if k<=5:
    print("k, 5'e küçük veya eşittir")

# Mantıksal "ve(and)"
if (k==5) and (l==10):
    print("k, 5'e ve l, 10'a eşittir")

# Mantıksal "veya(or)"
if (k==5) or (l==20):
    print("k, 5'e veya l, 20'a eşittir")

# elif ifadesi
if k>5:
    print("hiçbir şey")
elif k<5:
    print("hiçbir şey")
elif k==5:
    print("elif ifadesinin sonu")
k==5 doğru
Else kısmına geldi
k, 3'ten büyüktür
k, 5'e küçük veya eşittir
k, 5'e ve l, 10'a eşittir
k, 5'e veya l, 20'a eşittir
elif ifadesinin sonu
  • if / else tek satırda kullanım
In [17]:
if 5 > 3: print("5, 3'ten büyüktür")
5, 3'ten büyüktür
In [18]:
print("hiçbir şey") if 5 < 3 else print("Yanlış önerme")
Yanlış önerme

"for" döngüsü

In [19]:
for i in [1,2,3,4]:
    print(i)
1
2
3
4

"while" döngüsü

In [20]:
i=0
while i < 5:
    print(i)
    i=i+1
0
1
2
3
4

"break","continue","pass" ifadeleri

  • break: Döngüyü sonlandırır.
  • continue: Döngünün mevcut elemanını atlar
  • pass: Döngüye devam eder birşey yapmaz. Genelleştirme maksadıyla kullanılır.
In [21]:
gunler = ["Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"]

for gun in gunler:
    if gun == "Pazartesi":
        print("continue: En zor gün " + gun + " :( bunu atlayalım lütfen. Tekrar yazılmayacak")
        continue
    if gun == "Salı":
        print("pass: Bunun etkisi olmayacak " + gun + " tekrar yazılacak")
        pass
    if gun == "Cuma":
        print("break: Cumartesi'ye gelmeden " + gun + "'da bitirelim. Cumartesi ve Pazar yazılmayacak")
        break
    else:
        print(" Bugün " + gun)
continue: En zor gün Pazartesi :( bunu atlayalım lütfen. Tekrar yazılmayacak
pass: Bunun etkisi olmayacak Salı tekrar yazılacak
 Bugün Salı
 Bugün Çarşamba
 Bugün Perşembe
break: Cumartesi'ye gelmeden Cuma'da bitirelim. Cumartesi ve Pazar yazılmayacak

try and except ifadeleri
Çoğu zaman programda bir hata olduğunda bunu yakalayıp ona göre programın işleyişini değiştirmek veya hata mesajları çıkarmak gerekebilir. Bu sebeple try ve except yapısını kullanabilir. except ifadesinden sonra "Exception as e" diyerek hata mesajını da yakalayabilmek mümkündür.

In [22]:
a_tuple = (1,"bir")
# tuple elemanını değiştirmeye çalışalım
try:
    a_tuple[0] = "değişir mi?"
except Exception as e:
    print(e)
'tuple' object does not support item assignment
FONKSİYONLAR (FUNCTIONS)

Fonksiyonlar çağrıldığı zaman koşan kod parçalarıdır. Fonksiyonlara parametre gönderebiliriz. Fonksiyonlardan çıktı alabiliriz.

In [23]:
# En basit şekilde bir fonksiyon hazırlayalım
def a_function():
    print("Merhaba dünya!")
# Hazırladığımız fonksiyonu çağırıyoruz.
a_function()
Merhaba dünya!
In [24]:
# Varsayılan parametresi olan bir fonksiyon yazalım
def b_function(country_name="Türkiye"):
    print("Burası " + country_name)

b_function()
b_function("dünya")
Burası Türkiye
Burası dünya
In [25]:
# Değer döndüren bir fonksyion yazalım
def c_function(num = 2):
    return num**2

ret_val = c_function(3)
print(ret_val)
9

LAMBDA FONKSİYONLAR

Lambda fonksiyonlar birden fazla parametre alabilen fakat tek bir ifadeye sahip fonksiyonlardır.
Genel yapıları aşağıdaki gibidir

*lambda parametre : ifade*

In [26]:
# Sayının kübünü alan bir fonksiyon
a_lambda_function = lambda x : x**3
print(a_lambda_function(3))
27

Diyelim ki sayının n. kuvvetini alan jenerik bir fonksiyon ailesi oluşturmak istiyoruz. Bu durumda bir başka fonksiyonun içinde lambda kullanabiliriz.

In [27]:
def power_family(n):
    return lambda x:x**n

karesini_al = power_family(2)
kubunu_al = power_family(3)
dorduncu_kuvvetini_al = power_family(4)

print(karesini_al(2))
print(kubunu_al(2))
print(dorduncu_kuvvetini_al(2))
4
8
16
SINIFLAR (CLASSES)

Python "Object Oriented" bir dildir. Python dilindeki hemen hemen herşey objelerden (objects), özelliklerden (properties) ve metotlardan (methods) oluşmaktadır.

In [28]:
# Genel sınıf tanımlası
class a_class:
    # Onje yaratıldığında çağrılan fonksiyon (aka Constructor)
    def __init__(self,name,number):
        self.name = name
        self.number = number
    def print_info(self):
        print("Name: " + self.name + "\nNumber: " + str(self.number))
In [29]:
my_name = a_class("dataFLOYD",42)
my_name.print_info()
Name: dataFLOYD
Number: 42