Başlamadan önce size sevgili kızımın pandas (pandalar) yorumunu sunmak istiyorum.
Ben resimde en çok kaydırağa tırmanan pandayı sevdim :)
from IPython.display import Image
Image(filename='pandas_enb.png')
Pandas Python kullanan her veribilimcinin bilmesi haberi olması gereken bir kütüphane. Resmi [web sayfasında] (https://pandas.pydata.org/pandas-docs/stable/) pandas şu şekilde tanımlanıyor:
"pandas hızlı, esnek ve açıklayıcı veri yapıları sunan bir Python kütüphanesidir. İlişkisel ve işaretlenmiş veri ile sezgisel ve kolay bir şekilde çalışabilmek amacıyla tasarlanmıştır. Python ile gerçek dünyadaki very analizleri için temel bir yapı taşı olmayı hedeflemektedir."
"pandas is a Python package providing fast, flexible, and expressive data structures designed to make working with “relational” or “labeled” data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python"
Pandas ile birlikte gelen temel iki veri yapısı vardır.
# pandas kütüphanesini ekleyelim
# genel olarak pd diye eklemek makbüldrü
import pandas as pd
# İlk Series nesnemizi yaratalım
a_pd_series = pd.Series([1,2,3,4,5,6,7,8,9,10])
# bastıralım
print(a_pd_series)
Gördüğünüz gibi veri tipi otomatik olarak int64 olarak atanmış durumda ve iki adet sütun mevcut. İlk sütuna indeks (index) ve ikinci sütuna da değerler (values) denilmektedir.
# values
print(a_pd_series.values)
# index
print(a_pd_series.index)
a_pd_series.dtype
b_pd_series = pd.Series([1,2,3,4,5],index=["bir","iki","üç","dört","beş"])
print(b_pd_series)
print(a_pd_series[3])
print(b_pd_series["iki"])
c_pd_series = pd.Series({"bir":1,"iki":2})
print(c_pd_series)
print(a_pd_series[3:5]),
print("\n")
print(b_pd_series["iki":"dört"])
d_pd_series = pd.Series(["a",3.14,42,True,1j],index=[0,1,2,3,4])
d_pd_series
"Dataframe"ler iki boyutlu matrisler olarak düşünülebilir. Başka bir bakış açısıyla bunu bir excel dosyası olarak da değerlendirmek mümkündür. Satırların indeksi sütunların ise isimleri vardır. "Dataframe" nesneleri aynı indekse sahip seri nesnelerinin yanyana gelmiş hali gibidir.
# numpy kütüphanesini çağıralım
import numpy as np
# Bir "dataframe oluşturalım"
a_pd_df = pd.DataFrame(np.random.random((4,3)), # 4x3 rasgele matris oluşturalım
index = np.arange(4), # indeks isimleri
columns=["A","B","C"]) # sütun isimleri
# gösterelim
a_pd_df
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)
# birleştirmek için pd concat fonksiyonunu kullanalım
pd.concat([age_pd_series,weight_pd_series],axis=1,sort=True)
# veya çoğunlukla yaptığımız gibi pd.DataFrame() kullanalım
pd.DataFrame({"yaş":age_pd_series,"kilo":weight_pd_series})
a_pd_df.index
a_pd_df.columns
long_pd = pd.DataFrame(np.random.random((1000,5)),columns=["A","B","C","D","E"])
long_pd.head()
long_pd.tail()
long_pd.head(10)
long_pd.shape
long_pd.describe()
long_pd.info()
long_pd.count()
long_pd.sum()
(long_pd.max() - long_pd.min()) / long_pd.mean() * long_pd.median()
long_pd.idxmax()
# Örnek bir dataframe oluşturalım
inp = {"isim":["Ali","Ayşe","Ahmet","Burcu","Cansu","Ramiz"],"cinsiyet":["E","K","K","E","E","E"],"boy":[180,160,150,170,200,190],"kilo":[80,55,60,50,110,90],"yaş":[15,40,72,65,20,27]}
df_example = pd.DataFrame(inp)
df_example
# Cinsiyet üzerinden gruplandırıp ortalamasını bulalım
df_example.groupby("cinsiyet").mean()
# Hangi sütunların gruplandırılacağını da seçebilirsiniz.
# Burada "max" kullanalım değişiklik olsun
df_example.groupby("cinsiyet")[["boy","yaş"]].max()
# Maksimum değerleri görelim
df_example.pivot_table(index=["cinsiyet","yaş"],aggfunc="mean")
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)
custom_df = pd.concat([age_pd_series,weight_pd_series],axis=1,sort=True)
custom_df
# Her sütun için max-min aralığını bulalım
custom_df.apply(lambda x:x.max()-x.min())
# Her elemanın karesini alalım
custom_df.applymap(lambda x:x**2)
apply sütunlar veya satırlar üzerinde işlem yapar. applymap elemanlar üzerinde işlem yapar.
# 2017 dünya mutluluk raporu
whp_2017 = pd.read_csv("world_happiness_report_2017.csv")
whp_2017.head()
whp_2017.info()
whp_2017.describe()
hs_cards = pd.read_json("hscards.json")
hs_cards.head()
whp_2017["Country"].head() # çıktıyı kısaltmak için head() kullanalım
# Veya
whp_2017.Country.head()
whp_2017[["Country","Happiness.Score"]].head()
whp_2017[0:3]
whp_2017.loc[[1,2,3],["Country","Happiness.Rank"]]
whp_2017.iloc[1:3,0:2]
Yukarıdaki örnekte "loc" fonksiyonun etiket aldığına iloc fonksiyonunun tamsayı aldığına dikkat ediniz
loc ve iloc hakkında daha fazla bilgi almak için aşağıdaki bağlantıya bakmanızı tavsiye ederim. https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-vs-loc-explanation-how-are-they-different
# Mutluluk değeri 5.5 üzeri ve 5.7 altı olan ülkelerin seçimi
whp_2017[ (whp_2017["Happiness.Score"]>5.5) & (whp_2017["Happiness.Score"]<5.7)]
# İlk iki tane hariç tüm satırları düşürelim
whp_2017.drop(range(2,whp_2017.shape[0]))
whp_2017.drop("Country",axis=1).head()
whp_2017.sort_values(by="Economy..GDP.per.Capita.",ascending=False).head()
whp_2017.rank().head()
age_pd_series = pd.Series({"A":33,"B":24,"C":45,"E":18},name="yaş")
weight_pd_series = pd.Series({"A":55,"B":65,"C":75,"D":80},name="kilo") # in kg :)
age_pd_series + weight_pd_series
Pandas kütüphanesi "matplotlib" tabanlı çizdirme fonksiyonlarına sahiptir. Bunlar için hızlı bir gösterim yapalım
# Varsayılan plot grafiği
whp_2017.Generosity.plot();
# Grafikler için stil ekleyebiliriz
whp_2017.Generosity.plot(style="r.-",title="Generosity");
# Çoklu grafik
whp_2017[["Generosity","Happiness.Score"]].plot(title="Multi Plot Example");
# Alt grafiklerden oluşan çoklu grafik
whp_2017[["Generosity","Happiness.Score"]].plot(subplots=True);
# Histogram
whp_2017[["Generosity","Happiness.Score"]].hist();
# Boxplot'lar
whp_2017[["Generosity","Happiness.Score"]].boxplot();