{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 800100715151 Astronomide Veritabanları #\n",
"\n",
"## Ders - 02 Pandas Paketi'ne Giriş ##\n",
"\n",
"Prof. Dr. Özgür Baştürk
\n",
"Ankara Üniversitesi, Astronomi ve Uzay Bilimleri Bölümü
\n",
"obasturk at ankara.edu.tr
\n",
"http://ozgur.astrotux.org"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas Paketine Giriş #\n",
"\n",
"* [Pandas Modülü](#pandas)\n",
"* [series Nesnesi](#series-Nesnesi)\n",
" * [series Nesnesi Üzerinde İşlemler](#series-Nesnesi-Üzerinde-İşlemler)\n",
" * [pandas Serilerine Yeni Veriler Ekleme](#pandas-Serilerine-Yeni-Veriler-Ekleme)\n",
"* [Veri Çerçeveleri DataFrames](#Veri-Çerçeveleri-DataFrames) \n",
" * [Bir Veri Çerçevesi Oluşturmak](#Bir-Veri-Çerçevesi-Oluşturmak)\n",
" * [Veri Çerçevelerinin Görüntülenmesi](#Veri-Çerçevelerinin-Görüntülenmesi)\n",
" * [Veri Çerçevelerinin Dilimlenmesi ve İndekslenmesi](#Veri-Çerçevelerinin-Dilimlenmesi-ve-İndekslenmesi)\n",
" * [Kullanıcı Tanımlı İndeksler ve Konuma Bağlı İndeksler](#Kullanıcı-Tanımlı-İndeksler-ve-Konuma-Bağlı-İndeksler)\n",
" * [Kullanıcı Tanımlı İndekslerle Seçim ve Dilimleme](#Kullanıcı-Tanımlı-İndekslerle-Seçim-ve-Dilimleme) \n",
" * [Veri Çerçevelerinde Değişiklik Yapmak](#Veri-Çerçevelerinde-Değişiklik-Yapmak)\n",
" * [Veri Çerçevelerine Sütun Eklemek](#Veri-Çerçevelerine-Sütun-Eklemek)\n",
" * [Veri Çerçevelerine Satır Eklemek](#Veri-Çerçevelerine-Satır-Eklemek)\n",
" * [Veri Çerçevelerinden Satır ya da Sütun Silmek](#Veri-Çerçevelerinden-Satır-ya-da-Sütun-Silmek)\n",
"* [Pandas Veri Nesneleri Üzerinde Fonksiyon Kullanımı](#Pandas-Veri-Nesneleri-Üzerinde-Fonksiyon-Kullanımı)\n",
"* [Girilmeyen Verilerin Yönetimi](#Girilmeyen-Verilerin-Yönetimi)\n",
" * [NaN Veri Türü](#NaN-Veri-Türü)\n",
" * [dropna Fonksiyonu](#dropna-Fonksiyonu)\n",
" * [fillna Fonksiyonu](#fillna-Fonksiyonu)\n",
"* [Dosyalardan Veri Almak](#Dosyalardan-Veri-Almak)\n",
"* [Kaynaklar](#Kaynaklar)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# pandas Modülü #\n",
"\n",
"`pandas` Python programlama dili için yazılmış, BSD-lisanslı açık kaynak kodlu, yüksek performanslı, kolay kullanılabilen veri yapıları ve analiz araçları sağlayan bir kütüphanedir ([pandas dokümantasyonu](https://pandas.pydata.org/pandas-docs/stable/index.html)). Üzerine kurulu olduğu, bir yaygın sayfa yapısına benzer, sütunların isimlendirildiği veri çerçevesi nesnesi (ing. `DataFrame`) sayesinde veriyle kolay ve hızlı etkileşim sağlar. \n",
"\n",
"# series Nesnesi #\n",
"\n",
"Seriler (`series`) etiketlendirlmiş bir bir boyutlu (1D) dizilerdir. Yapısı sözlük (dictionary) yapısına benzer, tıpkı $numpy$ dizileri gibi sabit bir uzunluğa sahiptir. Değer almayan ya da 'N/A', 'NaN', '-' gibi nümerik olmayan değerler alan sütunların yönetimine de olanak sağlar. Numpy ya da Python'un standart işlem ya da fonksiyonlarının üzerinde kullanılabildiği bir yapıdır. Örneğin sözlüklerde (dictionary) bu işlem ve fonksiyonların çok büyük bir bölümü kullanılamaz. pandas modülünün üzerine kurulu olduğu `DataFrame` yapısının temelinde pandas serileri vardır. pandas serileri temel olarak veri çerçevelerinin sütunları olarak kullanılabilmekle birlikte kendi başlarına veri yapıları olarak da kullanılabilirler. \n",
"\n",
"İşe bir `pandas.Series` nesnesi oluşturarak başlayalım."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"gzgn_kutleler = pd.Series([0.330, 4.87, 5.97, 0.642, 1898, 568, 86.8, 102], \\\n",
" index=['merkur', 'venus', 'dunya','mars','jupiter', 'saturn', 'uranus', 'neptun'], \\\n",
" name=\"gezegenler\")\n",
"print(gzgn_kutleler)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Görüldüğü gibi gzgn_kutleler pandas serisini oluşturmak üzere bir listeden sağlanan etiketler (`labels` ya da `index`) her bir gezegeni, değerler ise yine bir listeden sağlanan ($10^{24}$ kg cinsinden) kütle değerlerini göstermektedir. Değerleri bir numpy dizisi gibi itere edilebilir (iterable) başka bir değişken türünden de sağlamak mümkündür. Bu anlamda, pandas modülünün `Series` nesnesi serbest olarak indekslenmiş birer `numpy` dizisi gibi de düşünülebilir.\n",
"\n",
"pandas serileri etiketsiz (ya da indekssiz) başlatılabileceği gibi, ki bu durumda indeksler 0'dan başlanarak tam sayılarla numaralandırılır, bir sözlük (dictionary) değişkeni üzerinden de tanımlanabilir. Yapıları nedeniyle Pandas `series` nesnesi, özelleştirilmiş birer `dictionary` (sözlük) nesnesi gibi de düşünülebilir. Her bir indeks söz konusu seride bir satırdaki değere karşılık gelmektedir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"s1 = pd.Series(np.random.randn(5)*10)\n",
"print(s1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"yldz_mV = {'Sirius' : -0.5, 'Vega' : 0.0, 'Proxima' : 13.6}\n",
"print(type(yldz_mV), yldz_mV)\n",
"yldz_mV = pd.Series((yldz_mV))\n",
"print(yldz_mV)\n",
"print(type(yldz_mV))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pd.Series(yldz_mV, index=['Vega', 'Sirius', 'Altair', 'Proxima'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İstendiği takdirde bir pandas serisine isim (name) de atanabilir. Bu amaçla serinin `name` ya da `rename` öznitelikleri kullanılır. Bu isim bu seri, bir tabloya (veri çerçevesine) sütun yapılmak istendiğinde sütun ismi olarak da kullanılabilecektir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(yldz_mV.name)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"yldz_mV.name = \"yildizlar\"\n",
"print(yldz_mV)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## series Nesnesi Üzerinde İşlemler ##"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tıpkı bir numpy dizisi gibi pandas `series` nesnesi üzerinde işlemler yapılabilir ve fonksiyonlar uygulanabilir, indeksleme ve dilimleme özellikleri kullanılabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gzgn_kutleler[::2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gzgn_kutleler > gzgn_kutleler['dunya'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gzgn_kutleler[gzgn_kutleler < gzgn_kutleler['uranus']])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(yldz_mV[1:-1])\n",
"print(\"-----------------\")\n",
"print(yldz_mV[yldz_mV > yldz_mV.median()])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"y1 = 'Vega'\n",
"y2 = 'Proxima'\n",
"print(\"{:s} ile {:s}'nin aki oranlari {:g}.\".\\\n",
" format(y1, y2, 10**(-0.4*(yldz_mV[y1]-yldz_mV[y2]))))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"'Betelgeuse' in yldz_mV"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"Verilen yildizlarin ortalama parlakligi: {:g}, standart sapmasi: {:g}\".\\\n",
" format(yldz_mV.mean(), yldz_mV.std()))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s2 = pd.Series(np.random.randn(5)*2.5)\n",
"print(\"s2: \\n\", s2)\n",
"print(\"s2 + s2: \\n\" , s2 + s2)\n",
"print(\"s2^2: \\n\", s2**2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu işlemlerde her iki tarafta aynı başlıkların (indekslerin ya da etiketlerin) olmaması sorunu da pandas tarafından etkin bir şekilde yönetilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"a = s2[1:]\n",
"print(a)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s2[1:] + s2[:-2]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(yldz_mV.name)\n",
"yldz_mV = yldz_mV.rename('mV')\n",
"print(yldz_mV.name)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## pandas Serilerine Yeni Veriler Ekleme ##\n",
"\n",
"pandas serilerine (series) yeni seriler `append` `concat` fonksiyonuyla eklenir. Veriçerçevelerinin her seferinde tüm verilerin arka arkaya eklenerek yeniden oluşturulması sebebiyle `append` metodu `pandas 1.4.0` versiyonundan itibaren kullanımdan kaldırılmıştır. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pd.__version__"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gzgn_kutleler)\n",
"yeni_cisimler = {'pluto':0.0146, 'ay':0.073}\n",
"print(\"------------\")\n",
"gzgn_kutleler = pd.concat([gzgn_kutleler,pd.Series(yeni_cisimler)],axis=0,sort=False)\n",
"print(gzgn_kutleler)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"Saturn'un kutlesi, {:.4f} Jupiter kutlesidir.\".format(gzgn_kutleler['saturn'] / gzgn_kutleler['jupiter']))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Veri Çerçeveleri DataFrames #\n",
"\n",
"Pandas serileri her ne kadar veri üzerinde çalışmak için etkin ve hızlı bir yol sağlasa da Pandas'ın asıl veri nesnesi veri çerçeveleridir (`DataFrame`). Seriler çoğu zaman hızlı bir şekilde veri çerçeveleri oluşturmak üzere ve veri çerçevelerinin sütunları olarak kullanılırlar ve bir boyutludurlar. Veri çerçeveleri ise tablolar ve yaygın sayfalar (spreadsheet) olarak düşünülebilir. Bu yapıları nedeniyle Pandas `DataFrame` nesnelerini, özelleştirilmiş birer `dictionary` (sözlük) nesnesi olarak da düşünmek mümkündür. Her bir indeks söz konusu veri çerçevesinde bir sütuna karşılık gelir.\n",
"\n",
"## Bir Veri Çerçevesi Oluşturmak #\n",
"\n",
"Bir `DataFrame` pek çok açıdan sütun ve satırların isimlerinin olduğu yaygın sayfalara benzer. Yapıları gereği iki boyutuludur (2D). Pandas'la veri analizi büyük ölçüde veri çerçevesi nesnesi üzerine kurulu olduğundan en sık kullanılan nesneler de `DataFrame` nesneleridir.\n",
"\n",
"Veri çerçeveleri\n",
"\n",
" * 1 boyutlu listeler (list), sözlükler (dictionary), seriler (series),\n",
" * 2 boyutlu numpy dizileri,\n",
" * Yapılandırılmış ndarray nesneleri,\n",
" * ve diğer veri çerçeveleri kullanılarak tanımlanabilir ya da başlatılabilir.\n",
"\n",
"Dolayısı ile Güneş Sistemi gezegenlerinin bazı özelliklerini saklamak istediğimiz `gzgn_kutleler` serisi gibi yapıları saklamak için `DataFrame` daha esnek ve kolay analize olanak sağlayan bir yapı sağlar. Bu seri daha geniş ve gezegenlere ilişkin başka özelliklerin de saklandığı bir `gezegenler` veri çerçevesinin bir sütununu oluşturabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gezegenler = {'Mg' : gzgn_kutleler,\n",
" 'Rg' : pd.Series([2439.5, 6052., 6378., 1737.5, 3396., 71492., 60268., 25559., 24764., 1185.],\\\n",
" index=['merkur','venus','dunya', 'ay', 'mars', 'jupiter', 'saturn', 'uranus', 'neptun','pluto']),\\\n",
" 'Prot' : pd.Series([1407.6, -5832.5, 23.9, 655.7, 24.6, 9.9, 10.7, -17.2, 16.1, -153.3],\\\n",
" index=['merkur','venus','dunya', 'ay', 'mars', 'jupiter', 'saturn', 'uranus', 'neptun','pluto']),\\\n",
" 'Porb' : pd.Series([88.0, 224.7, 365.2, 27.3, 687.0, 4331, 10747, 30589, 59800, 90560], \\\n",
" index=['merkur','venus','dunya', 'ay', 'mars', 'jupiter', 'saturn', 'uranus', 'neptun','pluto'])}\n",
"\n",
"gunes_sistemi = pd.DataFrame(gezegenler)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veri çerçeveleri pandas serileri kullanılarak oluşturulabileceği gibi listelerden, numpy dizilerinden veya sözlüklerden de oluşturulabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Sozlukler uzerinden veri cercevesi olusturma\n",
"veri = {\n",
" 'ogrno' : ['05','12','23','04'],\n",
" 'arasinav' : [35, 72, 60, 100], \n",
" 'final' : [70, 43, 57, 82]\n",
"}\n",
"\n",
"ders1 = pd.DataFrame(veri)\n",
"\n",
"print(ders1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Listeler uzerinden veri cercevesi olusturma\n",
"sehirler = pd.DataFrame(data = [\n",
"['01', 'Adana', 'Kebap'], \n",
"['34', 'Istanbul', 'Kalabalik'], \n",
"['06', 'Ankara', 'Memurlar'], \n",
"['35', 'Izmir', 'Gevrek'], \n",
"['44', 'Malatya', 'Kayisi'], \n",
"['16', 'Bursa', 'Uludag']\n",
"], columns = ['Plaka', 'Sehir', 'Ozellik'])\n",
"\n",
"print(sehirler)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Numpy dizileri uzerinden veri cercevesi olusturma\n",
"tarihler = pd.date_range('20220222', periods=5)\n",
"df = pd.DataFrame(np.random.randn(5, 4), index=tarihler, columns=list('ABCD'))\n",
"print(df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Birden fazla nesne turu kullanarak veri cercevesi olusturma\n",
"df2 = pd.DataFrame({'A': 1.,\n",
" 'B': pd.Timestamp('20220222'),\n",
" 'C': pd.Series(1, index=list(range(4)), dtype='float32'),\n",
" 'D': np.array([3] * 4, dtype='int32'),\n",
" 'E': pd.Categorical([\"AST413\", \"AST415\", \"AST416\", \"AST515\"]),\n",
" 'F': 'Asterosismoloji'})\n",
"\n",
"print(df2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Veri Çerçevelerinin Görüntülenmesi ##\n",
"\n",
"Veri çerçevelerinin tamamını, bir bölümünü, bir sütununu, bir satırını ya da bir elemanını görüntülemek için pek çok fonksiyon bulunduğu gibi listelerde ve dizilerde geçerli dilimleme ve indeksleme seçenekleri de kullanılabilmektedir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"Tun Gunes Sistemi\")\n",
"print(gunes_sistemi)\n",
"print(\"---------------------\")\n",
"print(\"Veri cercevesindeki ilk 5 gezegen\")\n",
"print(gunes_sistemi.head())\n",
"print(\"---------------------\")\n",
"print(\"Veri cercevesindeki son 3 gezegen\")\n",
"print(gunes_sistemi.tail(3))\n",
"print(\"---------------------\")\n",
"print(\"Kutleler : \")\n",
"print(gunes_sistemi['Mg']*1e24)\n",
"print(\"Ortalama Kutle: {:g} kg\".format(gunes_sistemi['Mg'].mean()*1e24))\n",
"print(\"----------------------\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.info()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gunes_sistemi.columns)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cols = [col for col in gunes_sistemi.columns]\n",
"gunes_sistemi[cols].dtypes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`describe` metodu ile veri setinin bazı istatistiksel parametrelerini görmek ve veri seti hakkında hızlı bir yorumda bulunmak da mümkün olabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gunes_sistemi.describe())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veri çerçevesini herhangi bir eksene göre sıralamak için `sort_values` fonksiyonu kullanılır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.sort_values(by='Rg')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Veri Çerçevelerinin Dilimlenmesi ve İndekslenmesi ##\n",
"\n",
"İndeksleme ve dilimleme işlemleri tıpkı `numpy`, `list`, `tuple` nesenlerinde ve `pd.Series` nesnesinde yapıldığı şekliyle yapılabilir. Bunun dışındaki işlemler için:\n",
"\n",
" * Sütın seçme: `df[col]` (ilgili sütundaki seriyi getirir)\n",
" * Satır seçme: `df.loc[label]` (ilgii satırdaki seriyi getirir)\n",
" * Satırı indeks değeri ile seçme: `df.iloc[loc]` (ilgii satırdaki seriyi getirir)\n",
" * Satırda dilimleme: `df[5:10]` (Veri çerçevesinin dilimlenmiş bölümünü getirir)\n",
" * Satırı bir koşulla seçme: `df[kosul]` (Veri çerçevesinin koşula uyan bölümünü)\n",
" \n",
"yapıarı da kullanılabilir. Öncelikle `numpy` dizilerindeki indeksleme tarzı indeksleme seçeneklerini gözden geçirelim."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi[::2]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi[-1:0:-2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Kullanıcı Tanımlı İndeksler ve Konuma Bağlı İndeksler ###\n",
"\n",
"İndekslemede tamsayı indekslere başvurarak verilerin yeri üzerinden yukarıdaki gibi indeksleme yapılabileeği gibi (ing. implicit indexes), `Series` ve `DataFrame` nesnelerinin indeksleri (satır isimleri olarak da düşünülebilir) olduğu düşüncesinden hareketle bu indeksler üzerinden de dilimleme ve indeksleme (ing. explicit indexes) yapılabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi['jupiter':'pluto']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu durumda özellikle tamsayı indeksler seçilerek kullanıcı tarafından oluşturulmuş veri çerçeveleri ve seriler üzerinde çalışılırken, kullanıcının belirlediği indekslerin mi yoksa verinin bulunduğu yerin indekslerinin mi geçerli olduğu gibi bir soru ortaya çıkar. Bunu basit bir örnekle görelim."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"seri_tamindeks = pd.Series(['merkur', 'dunya', 'jupiter'], index=[1, 3, 5])\n",
"#Indeksleme yapilirken kullanici tanimli indeksler kullanilirken\n",
"print(seri_tamindeks[1]) \n",
"print(\"---------------\")\n",
"#Dilimlemede verinin yerine dayali indeksler kullanilir\n",
"print(seri_tamindeks[0:2])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu karışıklığı önlemek için Pandas, bazı dizinleme şemalarını esas alan özel dizin oluşturucu özellikler (`attributes`) sağlar. Bunları pandas nesneleri üzerinde tanımlı fonksiyonlar metotlar (`methods`) olarak değil, o nesneye özel özellikler olarak düşünmek gerekir. \n",
"\n",
"`loc` özniteliği (attribute) her zaman kullanıcı tarafından verilen indekslere referans vermek için kullanılır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# seri_tamindeks uzerinde bu kez kullanici indeksiyle veri secelim\n",
"print(seri_tamindeks.loc[5])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Gunes Sistemi veri cercevesi uzerinde\n",
"# Herhangi satir(lar)i indeksiyle secmek icin\n",
"gunes_sistemi.loc['jupiter']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Kullanıcı Tanımlı İndekslerle Seçim ve Dilimleme ###\n",
"\n",
"Dilimlemede kullanıcı tanımlı indeksler üzerinden dilimleme yapılırken verilen aralığın her iki ucu da (sonu da!) dilimlememey dahil edilirken, numpy dizisi (ya da liste) tarzı, verinin bulunduğu konuma göre yapılan indekslemede verilen aralığın sonu dilimlemeye dahil edilmez (örn. $dizi[1:4]$ şeklinde bir indekslemede dizinin 1, 2 ve 3 numaralı indekslerinde bulunan değerlerden bir dizi dilimi oluşturulur, 4 numaralı indeksteki değer alınmaz!)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Veri cercevesinin sadece bir bolumunu secmek icin\n",
"gunes_sistemi.loc['jupiter':'merkur', ['Mg', 'Rg']]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.loc['ay', ['Prot','Porb']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`loc` kullanılarak sütun ya da satır adıyla seçim yapılabileceği gibi indeks numarası kullanılarak verinin bulundğu konum üzerinden de seçim yapılabilir; bunun için `iloc` özniteliğine başvurulur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# seri_tamindeks serisi uzerinde\n",
"print(seri_tamindeks.iloc[1])\n",
"print(seri_tamindeks.loc[1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# seri_tamindeks serisi uzerinde\n",
"print(seri_tamindeks.iloc[2])\n",
"print(seri_tamindeks.iloc[0:2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.iloc[4]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi['Prot'] = gunes_sistemi['Prot'] / 23.90"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`gunes_sistemi` veriçerçevesindeki nesneleri yörünge dönemine göre sıraladıktan sonra 4. sırada hangi cismin olduğu aşağıdaki örnekte olduğu gibi görülebilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"gunes_sistemi.sort_values('Porb').iloc[3]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.sort_values('Porb').iloc[1:5,1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi.iloc[[4,3,0],-1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Belirli bir deger icin\n",
"print(gunes_sistemi.loc['venus','Rg'])\n",
"print(gunes_sistemi.iloc[-1, -1])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Bu islemi daha hizli yapabilen iki metot at ve iat metotlaridir\n",
"print(gunes_sistemi.at['dunya','Mg'])\n",
"print(gunes_sistemi.iat[1,2]) #1: dunya 2: Porb"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tıpkı numpy dizilerinde olduğu gibi pandas veri çerçevelerinde de bir koşula dayanan dilimleemler yapılabilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gunes_sistemi['Porb'] > 365.25)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gunes_sistemi[gunes_sistemi['Mg'] > 10.00]['Rg'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir koşula göre dilimlemelerde dahi numpy tarzı dilimlemeler ve indekslemelerin dahi pandas tarafından sağlanan `loc`, `iloc`, `at`, `iat`özellikleri (attribute) kullanılması önerilmektedir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(gunes_sistemi.loc[gunes_sistemi['Prot'] < 24.0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Herhangi bir değerin bir sütunda olup olmadığını belirlemek için `isin` fonksiyonu kullanılır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi[gunes_sistemi['Porb'].isin([365.2, 88.00])]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Veri Çerçevelerinde Değişiklik Yapmak ##\n",
"\n",
"### Veri Çerçevelerine Sütun Eklemek ###\n",
"\n",
"Veri çerçevesine bir sütun eklenmek istenirken indeksler (satırların isimleri ya da indeks numaraları) verilmezse satırların sırası takip edilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(df)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"s1 = [1, 2, 3, 4, 5]\n",
"df['E'] = s1\n",
"print(df)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ancak indeksleri vererek yeni bir sütun eklemek daha güvenilir ve tutarlı bir yoldur."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gunes_sistemi['e'] = pd.Series([0.205, 0.007, 0.017, 0.055, 0.094, 0.049, 0.057, 0.046, 0.011, 0.244], \\\n",
" index = ['merkur','venus', 'dunya', 'ay', 'mars', 'jupiter', 'saturn', 'uranus', 'neptun', 'pluto'])\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# g/cm^3 cinsinden hacimleri yeni bir sutuna ekleyelim\n",
"gunes_sistemi['V'] = gunes_sistemi['Mg']*1e27 / (4./3*np.pi*(gunes_sistemi['Rg']*1e5)**3)\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Veri Çerçevelerine Satır Eklemek ###"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi aslında bir cüce gezegen olmasına karşın Ceres'in parametrelerini yeni bir satır olarak veri çerçevemize ekleyelim ama Ceres'in yörünge dönemini ($P_{orb}$) ve dış merkezliliğini ($e$) girmeyi unutmuş olalım. Ayrıca diğer parameterleri de bir miktar \"karışık\" bir sırada verelim. Bunun yanı sıra Ceres'in yarıçapını da Dünya yarıçapı cinsinden ($R = 0.074 R_{\\oplus}$) biliyor olalım. Sona satır ya da sütün ekleme işi `pandas 1.4.0` öncesinde `append` metoduyla yapılabilirken artık bu metod kullanımdan kaldırılmıştır ve `pandas.concat` fonksiyonu bu amaçlarla kullanılmaktadır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ceres = {'Prot' : pd.Series([9.1], index=['ceres']),\\\n",
" 'Rg' : pd.Series([0.074*gunes_sistemi.at['dunya','Rg']], index=['ceres']),\\\n",
" 'Mg': pd.Series([0.94e-3], index=['ceres'])}\n",
"gunes_sistemi = pd.concat([gunes_sistemi,pd.DataFrame(ceres)], axis=0, sort=False)\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ganymede = {'Mg' : 148.2e-3, 'Rg' : 2631., 'e' : 0.001}\n",
"gunes_sistemi = pd.concat([gunes_sistemi,\n",
" pd.DataFrame(ganymede, index=['ganymede'])],\n",
" sort=False)\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İki büyük uydunun (Titan, Triton) parametrelerini daha ekleyelim."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"iki_buyuk_uydu = [{'Mg':134.6e-3, 'Rg':2575, 'Prot':382.7, 'e': 0.029}, \\\n",
" {'Rg':1352.5, 'Prot':-141.0, 'e':0.000, 'Mg':21.5e-3}]\n",
"gunes_sistemi = pd.concat([gunes_sistemi,\n",
" pd.DataFrame(iki_buyuk_uydu, index=['titan','triton'])], \n",
" sort=False)\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi bakınca Ganymede'in dönme dönemini girmediğimizi farketmiş ve girmek istiyor olalım. Uydular için yörünge dönemi gezegenlerinin etrafındaki yörüngelerinin dönemi olduğu için girmemeyi tercih ettik (Ay hariç)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"gunes_sistemi.at['ganymede', 'Prot'] = 171.7\n",
"print(gunes_sistemi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Veri Çerçevelerinden Satır ya da Sütun Silmek ###\n",
"\n",
"Veri çerçevelerinden sütun silmek için `del` komutu (zira bir veri çerçevesi değiştirilemez (ing. immutable) bir nesnedir), satır silmek için ise `drop` metodu kullanılır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(sehirler)\n",
"sehirler['Bolge'] = ['Akdeniz', 'Marmara', 'Ic Anadolu', 'Ege', 'Guneydogu Anadolu', 'Marmara']\n",
"print(sehirler)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"del sehirler['Ozellik']\n",
"print(sehirler)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sehirler.drop(4, axis=0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(sehirler)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu durumu kalıcı hale getirmek için `drop` metodunun `inplace` anahtarına $True$ değeri atanmalıdır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"sehirler.drop(4, axis=0, inplace=True)\n",
"sehirler"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Pandas Veri Nesneleri Üzerinde Fonksiyon Kullanımı #\n",
"\n",
"Pandas özünde numpy dizileriyle de birlikte çalışmak üzere tasarlanmış (vektörleştirilmiş) bir veri yönetim paketi olduğu için diziler üzerinde çalışabilen ön tanımlı (built-in) ya da kullanıcı tanımlı fonksiyonlar Pandas veri nesneleri üzerinde çallışır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"rstglvr = np.random.RandomState(42)\n",
"rstglsr = pd.Series(rstglvr.randint(0, 20, 5))\n",
"rstglsr"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"rstgldf = pd.DataFrame(rstglvr.randint(0, 20, (4, 5)),\n",
"columns=['A', 'B', 'C', 'D', 'E'])\n",
"rstgldf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(np.sin(rstgldf/16. + np.pi / 2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Herhangi bir fonksiyon ya da aritmetik işlem birden fazla seri ya da veri çerçevesi arasında uygulanmak istendiğinde Pandas iki veri nesnesinin indekslerini hizalar. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"yuzolcum = pd.Series({'Birlesik Krallik': 242495, 'Fransa': 551695, 'Almanya': 357386, \n",
"'Ispanya': 498511, 'Turkiye': 783562}, name='yuzolcum')\n",
"nufus = pd.Series({'Turkiye': 84200851, 'Ispanya': 46767543, 'Birlesik Krallik': 67803450,\n",
"'Almanya': 83792987, 'Fransa': 65227357}, name='yuzolcum')\n",
"nufus_yogunlugu = nufus / yuzolcum\n",
"print(nufus_yogunlugu)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"gdp = pd.Series({'Almanya': 3863344, 'Fransa': 2707074, 'Italya': 1988636, \n",
"'Izlanda': 24280, 'Turkiye': 743708}, name='yuzolcum')\n",
"gdp_kisibasi = gdp / nufus\n",
"print(gdp_kisibasi*1e6)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bir veri çerçevesi ile bir seri arasında işlem yaparken işlem varsayılan olarak satırda gerçekleşir ve indeksler hizalanır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"A = rstglvr.randint(20, size=(4, 5))\n",
"dfA = pd.DataFrame(A, columns=list('XYZTW'))\n",
"dfA - dfA.iloc[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"İşlem sütun üzerinde yapılmak istendiğinde `axis` anahtarı işlemin sütun üzerinden yapılacağını belirtmek üzere $0$ 'a eşitlenir"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(dfA)\n",
"dfA.subtract(dfA['Z'], axis=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Apply Metodu ##\n",
"\n",
"`apply` metodu herhangi bir fonksiyonun tüm veriçerçevesi ya da seri üzerine uygulanmasını sağlar."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"rstglvr = np.random.RandomState(42)\n",
"print(rstglvr)\n",
"A = rstglvr.randn(20)\n",
"dfA = pd.DataFrame(A.reshape((4,5)), columns=list('XYZTW'))\n",
"print(dfA)\n",
"print(dfA.apply(np.cumsum))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Girilmeyen Verilerin Yönetimi #\n",
"\n",
"Bir veri tablosuna ya da pandas diliyle veri çerçevesinde karşılığı bulunmayan bir verinin nasıl girileceği tartışmalı bir konu olup, tek bir çözümü de yoktur. Veri türüne bağlı olarak bazı durumlarda $-1$, $9.9999$, $-99999$ gibi \"nöbetçi değer\" (ing. sentinel) kullanılabileceği gibi, boş bırakmak, '-', 'NA', 'N/A'gibi belirteçler kullanmak da tercih edilebilmektedir. Bu çözümlerin her birinin avantaj ve dezavantajları bulunur. Örneğin tüm verilerin pozitif olarak girileceği bir sütunda değeri olmayanların yerine $-1$ girmek sütunlar üzerinde matematiksel işlemler yapılırken bu sütunun da dikkate alınması ve CPU'ya bu nedenle ek yük binmesi anlamına gelir. \n",
"\n",
"Pandas, bir veri çerçevesi ya da seride bulunmayacak verilerin yerine $None$ ve $NaN$ nesnelerini kullanır. Ancak $None$ kullanıldığına veri tipi de nesne ($object$) olur ki bu işlemlerin daha kısa sürede yapılmasına olanak sağlayan $NaN$ seçeneğine göre dezavantajlıdır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for dtype in ['object', 'int']:\n",
" print(\"dtype =\", dtype)\n",
" %timeit np.arange(1E6, dtype=dtype).sum()\n",
" print()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### NaN Veri Türü ###\n",
"\n",
"$NaN$ veri türü IEEE kayan noktalı sayı standartları arasında tanımlanmış ve tüm programlama dilleri ve dijital işlemlerde kullanılan bir veri türüdür. $NaN$ veri türü ile yapılan tüm işlemler sonuç döndürür."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"x = np.array([1, np.nan, 3, 4])\n",
"print(\"1 + x = \", 1 + x)\n",
"print(\"0x = \", 0*x)\n",
"print(\"ln(x) = \", np.log(x))\n",
"print(\"min(x) = \", np.min(x))\n",
"print(\"nanmax(x) = \", np.nanmax(x))\n",
"print(\"SIGMA(x) = \", np.sum(x))\n",
"print(\"nansum(x) = \", np.nansum(x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pandas modülünde girilmeyen ya da `NaN` (ing. Not a Number) veya `None` olarak girilen verileri (Null) yönetmek üzere de özel fonksiyonlar (`isnull`, `notnull`,`dropna`,`fillna`) bulunmaktadır. "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"veri2 = {\n",
" 'ogrno' : ['08','16','32','74'],\n",
" 'odev' : [56, 72, 60, 84], \n",
" 'proje' : [70, 43, 57, 71]\n",
"}\n",
"ders2 = pd.DataFrame(veri2)\n",
"ders2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2 = pd.concat([ders2,pd.DataFrame({'ogrno' : 18, 'proje' : 37}, index=[4])], \n",
" sort=True)\n",
"ders2"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2 = pd.concat([ders2,pd.DataFrame({'ogrno' : 24, 'proje' : 65}, index=[5])], \n",
" sort=True)\n",
"ders2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`Nan` olan değerlerin tablodaki yerini `isna` fonksiyonuyla görebiliriz."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# isna fonksiyonu Null degeri veren elemanlari True\n",
"# digerlerini False isaretleyerek bir maske (mask) olusturur \n",
"pd.isna(ders2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### dropna Fonksiyonu ###\n",
"\n",
"`dropna` $NaN$ değer bulunan satır (varsayılan) ya da sütunları silmek için kullanılır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2.dropna(subset=['odev'])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Varsayılan davranışında satır silen `drop` fonksiyonu `NaN` sütunları silmek için de kullanılabilir. $axis = 1$ ya da $axis = columns$ verilerek `NaN` barındıran tüm sütunlar silinebilir."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2.dropna(axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`dropna` fonksiyonunun `how` parametresi en az bir değeri ($how = 'any'$) veya tüm değerleri ($how = 'all'$) `NaN` olan, satır veya sütunun veri çerçevesinden kaldırılıp kaldırılmayacağını belirler."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2.dropna(how='any',axis=1)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2.dropna(how='all',axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### fillna Fonksiyonu ###\n",
"\n",
"Bazen $NA$ değerlerini silmek yerine, geçerli bir değerle değiştirmek tercih edilebilir. Bu değer, sıfır gibi tek bir sayı olabilir veya çevredeki değerler kullanılarak yapılabilecek bir interpolasyon sonucu elde edilen değer olabilir. Aslında bu işlem `isnull` fonksiyonu ile bir maske (ing. mask) üretilerek $NaN$ değerler belirlendikten sonra istenen değerlerle değiştirilerek de yapılabilir. Ancak bu çok sık kullanılan işlem olduğu için Pandas dizinin bir kopyasını $null$ değerlerle değiştiren `fillna` metodunu sağlamıştır."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"veri = pd.Series([1, np.nan, 2, None, 3, np.nan], index=list('PQRSTU'))\n",
"veri"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# NaN degerleri 0 ile degistir\n",
"veri.fillna(0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Nan degerleri bir sonraki deger ile degistir\n",
"veri.fillna(method='ffill')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Nan degerleri bir onceki deger ile degistir\n",
"veri.fillna(method='bfill')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"ders2.fillna(0, axis=1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Dosyalardan Veri Almak #\n",
"\n",
"Pandas modülünden tablo yapısındaki ascii (salt metin), sütunlardaki değerleri virgülle ayrılan (csv), yaygın sayfa programlarıyla oluşturulan pek çok formattaki dosyadan veri çekilip, üzerinde işlemler yapılabilir. Öncelikle sütunlardaki değerleri virgülle ayrılmış bir tablo yapısı (csv) üzerinde bir örnekle çalışalım. [ders_notlar.csv](ders_notlar.csv) dosyasında bir derste öğrencilerin aldığı notlar (iki ödev, bir arasınav ve bir final olmak üzere) verilmiştir. Öncelikle bu dosyadaki veriyi alıp, bir veri çerçevesine aktaralım. Sonrasında buradaki verinin üzerinde işlemler yapabilir ve analiz edebiliriz.\n",
"\n",
"Pandas modülünün `csv` fonksiyonu metin değişkenlere aktarılan sütun değerlerinin başında boşluk varsa (`whitespace`) bunları da metne dahil ettiğinden bu davranışı değiştirmek üzere `skipinitialspace` parametresi True değerine ayarlanmalıdır.\n",
"\n",
"Pandas `read_csv` fonksiyonu virgülle ayrılmış olmasalar dahi belirli bir karakterle ayrılmış (delimited) dosyaları veriçerçevelerine dönüştürebilir. Pek çok başka formattaki veri dosyasını da `read_excel()`, `read_json()`, `read_html()` ve `read_sql_table()` gibi fonksiyonlar yardımıyla veriçerçevelerine transfer etmek mümkündür. Herhangi bir programdan (excel, emacs, notepad vs.) kopyalanan bir veriyi dahi `read_clipboard()` kullanarak veriçerçevesine transfer edebilirsiniz."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci37 | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum\n",
"ad \n",
"ogrenci1 100 0 NaN NaN W\n",
"ogrenci2 80 92 64.0 78.0 NaN\n",
"ogrenci3 95 100 71.0 88.0 NaN\n",
"ogrenci4 100 100 54.0 40.0 NaN\n",
"ogrenci5 97 0 NaN NaN W\n",
"ogrenci6 100 100 55.0 66.0 NaN\n",
"ogrenci7 100 100 91.0 87.0 NaN\n",
"ogrenci8 97 100 86.0 78.0 NaN\n",
"ogrenci9 75 0 68.0 NaN W\n",
"ogrenci10 95 0 85.0 NaN W\n",
"ogrenci11 100 100 75.0 76.0 NaN\n",
"ogrenci12 90 100 75.0 92.0 NaN\n",
"ogrenci13 95 100 72.0 77.0 NaN\n",
"ogrenci14 95 100 50.0 44.0 NaN\n",
"ogrenci15 100 100 91.0 98.0 NaN\n",
"ogrenci16 90 100 75.0 86.0 NaN\n",
"ogrenci17 95 100 63.0 67.0 NaN\n",
"ogrenci18 100 100 88.0 96.0 NaN\n",
"ogrenci19 70 98 59.0 76.0 NaN\n",
"ogrenci20 100 100 81.0 94.0 NaN\n",
"ogrenci21 95 97 75.0 83.0 NaN\n",
"ogrenci22 100 100 85.0 100.0 NaN\n",
"ogrenci23 90 100 79.0 70.0 NaN\n",
"ogrenci24 90 0 NaN NaN W\n",
"ogrenci25 0 75 50.0 74.0 NaN\n",
"ogrenci26 100 100 68.0 75.0 NaN\n",
"ogrenci27 92 97 63.0 59.0 NaN\n",
"ogrenci28 100 100 81.0 76.0 NaN\n",
"ogrenci29 100 97 52.0 69.0 NaN\n",
"ogrenci30 92 0 86.0 NaN W\n",
"ogrenci31 87 100 59.0 82.0 NaN\n",
"ogrenci32 100 100 92.0 89.0 NaN\n",
"ogrenci33 100 100 92.0 100.0 NaN\n",
"ogrenci34 95 100 53.0 69.0 NaN\n",
"ogrenci35 100 100 94.0 83.0 NaN\n",
"ogrenci36 95 0 76.0 79.0 NaN\n",
"ogrenci37 78 0 47.0 23.0 NaN"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"notlar = pd.read_csv('ders_notlar.csv', index_col=\"ad\", skipinitialspace=True)\n",
"notlar"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"pandas.core.frame.DataFrame"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(notlar)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eğer ders_notlar.csv dosyasını bir metin editörle açacak olursanız hem `NaN` olarak girilen değerler (sınava girmeyenler için), hem de boş bırakılan değerler (durum sütununda henüz durumu belirlenmemiş öğrenciler; W: dersten çekilenleri göstermektedir) göreceksiniz. Pandas boş bırakılan değerleri de `NaN` olarak yorumlamaktadır. Tüm sütun isimleri veri dosyasından çekilirken ad sütunu indeks olarak işaretlenmiştir. Başlığı olmayan ya da atlanmak istenen veri dosyaları için `csv` fonksiyonunun `header` parametresinde çeşitli seçenekler tanımlanmıştır."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Index(['ogrenci1', 'ogrenci2', 'ogrenci3', 'ogrenci4', 'ogrenci5', 'ogrenci6',\n",
" 'ogrenci7', 'ogrenci8', 'ogrenci9', 'ogrenci10', 'ogrenci11',\n",
" 'ogrenci12', 'ogrenci13', 'ogrenci14', 'ogrenci15', 'ogrenci16',\n",
" 'ogrenci17', 'ogrenci18', 'ogrenci19', 'ogrenci20', 'ogrenci21',\n",
" 'ogrenci22', 'ogrenci23', 'ogrenci24', 'ogrenci25', 'ogrenci26',\n",
" 'ogrenci27', 'ogrenci28', 'ogrenci29', 'ogrenci30', 'ogrenci31',\n",
" 'ogrenci32', 'ogrenci33', 'ogrenci34', 'ogrenci35', 'ogrenci36',\n",
" 'ogrenci37'],\n",
" dtype='object', name='ad')\n",
"-----------------\n",
"Index(['odev1', 'odev2', 'arasinav', 'final', 'durum'], dtype='object')\n",
"-----------------\n",
"odev1 100\n",
"odev2 100\n",
"arasinav 81.0\n",
"final 76.0\n",
"durum NaN\n",
"Name: ogrenci28, dtype: object\n",
"-----------------\n",
"ad\n",
"ogrenci1 NaN\n",
"ogrenci2 64.0\n",
"ogrenci3 71.0\n",
"ogrenci4 54.0\n",
"ogrenci5 NaN\n",
"ogrenci6 55.0\n",
"ogrenci7 91.0\n",
"ogrenci8 86.0\n",
"ogrenci9 68.0\n",
"ogrenci10 85.0\n",
"ogrenci11 75.0\n",
"ogrenci12 75.0\n",
"ogrenci13 72.0\n",
"ogrenci14 50.0\n",
"ogrenci15 91.0\n",
"ogrenci16 75.0\n",
"ogrenci17 63.0\n",
"ogrenci18 88.0\n",
"ogrenci19 59.0\n",
"ogrenci20 81.0\n",
"ogrenci21 75.0\n",
"ogrenci22 85.0\n",
"ogrenci23 79.0\n",
"ogrenci24 NaN\n",
"ogrenci25 50.0\n",
"ogrenci26 68.0\n",
"ogrenci27 63.0\n",
"ogrenci28 81.0\n",
"ogrenci29 52.0\n",
"ogrenci30 86.0\n",
"ogrenci31 59.0\n",
"ogrenci32 92.0\n",
"ogrenci33 92.0\n",
"ogrenci34 53.0\n",
"ogrenci35 94.0\n",
"ogrenci36 76.0\n",
"ogrenci37 47.0\n",
"Name: arasinav, dtype: float64\n"
]
}
],
"source": [
"# indekslenen sutun\n",
"print(notlar.index)\n",
"print(\"-----------------\")\n",
"# tüm sutunlar\n",
"print(notlar.columns)\n",
"print(\"-----------------\")\n",
"# Herhangi bir ogrencinin butun notlari\n",
"print(notlar.loc['ogrenci28'])\n",
"print(\"-----------------\")\n",
"# Tum arasinav notlari\n",
"print(notlar['arasinav'])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" NaN | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" NaN | \n",
" W | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" NaN | \n",
"
\n",
" \n",
" | mehmet | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum\n",
"ad \n",
"ogrenci1 100 0 NaN NaN W\n",
"ogrenci2 80 92 64.0 78.0 NaN\n",
"ogrenci3 95 100 71.0 88.0 NaN\n",
"ogrenci4 100 100 54.0 40.0 NaN\n",
"ogrenci5 97 0 NaN NaN W\n",
"ogrenci6 100 100 55.0 66.0 NaN\n",
"ogrenci7 100 100 91.0 87.0 NaN\n",
"ogrenci8 97 100 86.0 78.0 NaN\n",
"ogrenci9 75 0 68.0 NaN W\n",
"ogrenci10 95 0 85.0 NaN W\n",
"ogrenci11 100 100 75.0 76.0 NaN\n",
"ogrenci12 90 100 75.0 92.0 NaN\n",
"ogrenci13 95 100 72.0 77.0 NaN\n",
"ogrenci14 95 100 50.0 44.0 NaN\n",
"ogrenci15 100 100 91.0 98.0 NaN\n",
"ogrenci16 90 100 75.0 86.0 NaN\n",
"ogrenci17 95 100 63.0 67.0 NaN\n",
"ogrenci18 100 100 88.0 96.0 NaN\n",
"ogrenci19 70 98 59.0 76.0 NaN\n",
"ogrenci20 100 100 81.0 94.0 NaN\n",
"ogrenci21 95 97 75.0 83.0 NaN\n",
"ogrenci22 100 100 85.0 100.0 NaN\n",
"ogrenci23 90 100 79.0 70.0 NaN\n",
"ogrenci24 90 0 NaN NaN W\n",
"ogrenci25 0 75 50.0 74.0 NaN\n",
"ogrenci26 100 100 68.0 75.0 NaN\n",
"ogrenci27 92 97 63.0 59.0 NaN\n",
"ogrenci28 100 100 81.0 76.0 NaN\n",
"ogrenci29 100 97 52.0 69.0 NaN\n",
"ogrenci30 92 0 86.0 NaN W\n",
"ogrenci31 87 100 59.0 82.0 NaN\n",
"ogrenci32 100 100 92.0 89.0 NaN\n",
"ogrenci33 100 100 92.0 100.0 NaN\n",
"ogrenci34 95 100 53.0 69.0 NaN\n",
"ogrenci35 100 100 94.0 83.0 NaN\n",
"ogrenci36 95 0 76.0 79.0 NaN\n",
"mehmet 78 0 47.0 23.0 NaN"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar.rename(index={\"ogrenci37\":\"mehmet\"},inplace=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Şimdi bir analiz işlemi yapabiliriz. Örneğin aldığı tüm notlardan öğrencinin ağırlıklı genel ortalamasını çıkarabiliriz. Bu ders için her iki ödevin %10'ar (toplamda %20), arasınavın %30, finalin ise %50 ağırlığının olduğunu varsayalım"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ad\n",
"ogrenci1 NaN\n",
"ogrenci2 75.4\n",
"ogrenci3 84.8\n",
"ogrenci4 56.2\n",
"ogrenci5 NaN\n",
"ogrenci6 69.5\n",
"ogrenci7 90.8\n",
"ogrenci8 84.5\n",
"ogrenci9 NaN\n",
"ogrenci10 NaN\n",
"ogrenci11 80.5\n",
"ogrenci12 87.5\n",
"ogrenci13 79.6\n",
"ogrenci14 56.5\n",
"ogrenci15 96.3\n",
"ogrenci16 84.5\n",
"ogrenci17 71.9\n",
"ogrenci18 94.4\n",
"ogrenci19 72.5\n",
"ogrenci20 91.3\n",
"ogrenci21 83.2\n",
"ogrenci22 95.5\n",
"ogrenci23 77.7\n",
"ogrenci24 NaN\n",
"ogrenci25 59.5\n",
"ogrenci26 77.9\n",
"ogrenci27 67.3\n",
"ogrenci28 82.3\n",
"ogrenci29 69.8\n",
"ogrenci30 NaN\n",
"ogrenci31 77.4\n",
"ogrenci32 92.1\n",
"ogrenci33 97.6\n",
"ogrenci34 69.9\n",
"ogrenci35 89.7\n",
"ogrenci36 71.8\n",
"ogrenci37 33.4\n",
"Name: genel_ortalama, dtype: float64"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar['genel_ortalama'] = notlar['odev1']*0.1 + notlar['odev2']*0.1 + notlar['arasinav']*0.3 + notlar['final']*0.5\n",
"notlar['genel_ortalama']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu ortalamalar hesaplanırken önemli bir şansımız arasınava girmeyen tüm öğrencilerin finale de girmemiş olması ve finale girmeyen tüm öğrencilerin de dersten çekilmiş (durum: W) olmalarıdır. Durumun bu olması zorunlu değildir. Örneğin bir öğrenci arasınava girmeyip derse devam etmiş, finale girmiş olabilir. Bu durumda arasınav notunu 0 yapmak gerekir. Bu tür ayarlamalar koşul yapılarıyla (`if` - `elif` - `else`) kontrol edilebilir. Ayrıca pandas bu tür kontroller için pratik fonksiyonlar da sağlamaktadır. Örneğin her öğrenci için ağırlıklı ortalama çıkarmak bakımından arasınav ve finale girmeyenlerin notlarını 0 varsaymak iyi bir fikir olacaktır. Öğrencinin dersten çekilip çekilmediği durum sütununda kontrol edilebildiği için (W) bu önemli bir avantaj sağlayacaktır. Bu amaçla veri çerçeveleri üzerine tanımlı `fillna` metodu kullanılabilir."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
" genel_ortalama | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 10.0 | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" 0 | \n",
" 75.4 | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" 0 | \n",
" 84.8 | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" 0 | \n",
" 56.2 | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.7 | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" 0 | \n",
" 69.5 | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" 0 | \n",
" 90.8 | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" 0 | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" 0.0 | \n",
" W | \n",
" 27.9 | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 80.5 | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" 0 | \n",
" 87.5 | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" 0 | \n",
" 79.6 | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" 0 | \n",
" 56.5 | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" 0 | \n",
" 96.3 | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" 0 | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" 0 | \n",
" 71.9 | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" 0 | \n",
" 94.4 | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 72.5 | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" 0 | \n",
" 91.3 | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" 0 | \n",
" 83.2 | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" 0 | \n",
" 95.5 | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" 0 | \n",
" 77.7 | \n",
"
\n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.0 | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" 0 | \n",
" 59.5 | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" 0 | \n",
" 77.9 | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" 0 | \n",
" 67.3 | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 82.3 | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" 0 | \n",
" 69.8 | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" 0 | \n",
" 77.4 | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" 0 | \n",
" 92.1 | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" 0 | \n",
" 97.6 | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" 0 | \n",
" 69.9 | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" 0 | \n",
" 89.7 | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" 0 | \n",
" 71.8 | \n",
"
\n",
" \n",
" | ogrenci37 | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" 0 | \n",
" 33.4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum genel_ortalama\n",
"ad \n",
"ogrenci1 100 0 0.0 0.0 W 10.0\n",
"ogrenci2 80 92 64.0 78.0 0 75.4\n",
"ogrenci3 95 100 71.0 88.0 0 84.8\n",
"ogrenci4 100 100 54.0 40.0 0 56.2\n",
"ogrenci5 97 0 0.0 0.0 W 9.7\n",
"ogrenci6 100 100 55.0 66.0 0 69.5\n",
"ogrenci7 100 100 91.0 87.0 0 90.8\n",
"ogrenci8 97 100 86.0 78.0 0 84.5\n",
"ogrenci9 75 0 68.0 0.0 W 27.9\n",
"ogrenci10 95 0 85.0 0.0 W 35.0\n",
"ogrenci11 100 100 75.0 76.0 0 80.5\n",
"ogrenci12 90 100 75.0 92.0 0 87.5\n",
"ogrenci13 95 100 72.0 77.0 0 79.6\n",
"ogrenci14 95 100 50.0 44.0 0 56.5\n",
"ogrenci15 100 100 91.0 98.0 0 96.3\n",
"ogrenci16 90 100 75.0 86.0 0 84.5\n",
"ogrenci17 95 100 63.0 67.0 0 71.9\n",
"ogrenci18 100 100 88.0 96.0 0 94.4\n",
"ogrenci19 70 98 59.0 76.0 0 72.5\n",
"ogrenci20 100 100 81.0 94.0 0 91.3\n",
"ogrenci21 95 97 75.0 83.0 0 83.2\n",
"ogrenci22 100 100 85.0 100.0 0 95.5\n",
"ogrenci23 90 100 79.0 70.0 0 77.7\n",
"ogrenci24 90 0 0.0 0.0 W 9.0\n",
"ogrenci25 0 75 50.0 74.0 0 59.5\n",
"ogrenci26 100 100 68.0 75.0 0 77.9\n",
"ogrenci27 92 97 63.0 59.0 0 67.3\n",
"ogrenci28 100 100 81.0 76.0 0 82.3\n",
"ogrenci29 100 97 52.0 69.0 0 69.8\n",
"ogrenci30 92 0 86.0 0.0 W 35.0\n",
"ogrenci31 87 100 59.0 82.0 0 77.4\n",
"ogrenci32 100 100 92.0 89.0 0 92.1\n",
"ogrenci33 100 100 92.0 100.0 0 97.6\n",
"ogrenci34 95 100 53.0 69.0 0 69.9\n",
"ogrenci35 100 100 94.0 83.0 0 89.7\n",
"ogrenci36 95 0 76.0 79.0 0 71.8\n",
"ogrenci37 78 0 47.0 23.0 0 33.4"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar = notlar.fillna(0)\n",
"notlar['genel_ortalama'] = notlar['odev1']*0.1 + notlar['odev2']*0.1 + notlar['arasinav']*0.3 + notlar['final']*0.5\n",
"notlar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu durumda durum sütununda da W olmayan satırlar 0 ile doldurulmuştur. Ayrıca arasınav ya da finale girmeyen öğrencilerin genel ortalaması `NaN` olarak belirlenmiş olduğu için onlar da 0'a dönüştürülmüştür. Bu nedenle genel_ortalama sütununu tekrar hesaplamakta yarar görülmüştür. Şimdi, durum sütunu ortalama notlarına bağlı olarak verilecek olan harf notları ile güncellenebilir."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['ogrenci1' 'ogrenci2' 'ogrenci3' 'ogrenci4' 'ogrenci5' 'ogrenci6'\n",
" 'ogrenci7' 'ogrenci8' 'ogrenci9' 'ogrenci10' 'ogrenci11' 'ogrenci12'\n",
" 'ogrenci13' 'ogrenci14' 'ogrenci15' 'ogrenci16' 'ogrenci17' 'ogrenci18'\n",
" 'ogrenci19' 'ogrenci20' 'ogrenci21' 'ogrenci22' 'ogrenci23' 'ogrenci24'\n",
" 'ogrenci25' 'ogrenci26' 'ogrenci27' 'ogrenci28' 'ogrenci29' 'ogrenci30'\n",
" 'ogrenci31' 'ogrenci32' 'ogrenci33' 'ogrenci34' 'ogrenci35' 'ogrenci36'\n",
" 'ogrenci37']\n"
]
},
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
" genel_ortalama | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 10.0 | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" 0 | \n",
" 75.4 | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" 0 | \n",
" 84.8 | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" 0 | \n",
" 56.2 | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.7 | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" 0 | \n",
" 69.5 | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" A | \n",
" 90.8 | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" 0 | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" 0.0 | \n",
" W | \n",
" 27.9 | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 80.5 | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" 0 | \n",
" 87.5 | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" 0 | \n",
" 79.6 | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" 0 | \n",
" 56.5 | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" A | \n",
" 96.3 | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" 0 | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" 0 | \n",
" 71.9 | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" A | \n",
" 94.4 | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 72.5 | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" A | \n",
" 91.3 | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" 0 | \n",
" 83.2 | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" A | \n",
" 95.5 | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" 0 | \n",
" 77.7 | \n",
"
\n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.0 | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" 0 | \n",
" 59.5 | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" 0 | \n",
" 77.9 | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" 0 | \n",
" 67.3 | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" 0 | \n",
" 82.3 | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" 0 | \n",
" 69.8 | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" 0 | \n",
" 77.4 | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" A | \n",
" 92.1 | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" A | \n",
" 97.6 | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" 0 | \n",
" 69.9 | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" A | \n",
" 89.7 | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" 0 | \n",
" 71.8 | \n",
"
\n",
" \n",
" | ogrenci37 | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" 0 | \n",
" 33.4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum genel_ortalama\n",
"ad \n",
"ogrenci1 100 0 0.0 0.0 W 10.0\n",
"ogrenci2 80 92 64.0 78.0 0 75.4\n",
"ogrenci3 95 100 71.0 88.0 0 84.8\n",
"ogrenci4 100 100 54.0 40.0 0 56.2\n",
"ogrenci5 97 0 0.0 0.0 W 9.7\n",
"ogrenci6 100 100 55.0 66.0 0 69.5\n",
"ogrenci7 100 100 91.0 87.0 A 90.8\n",
"ogrenci8 97 100 86.0 78.0 0 84.5\n",
"ogrenci9 75 0 68.0 0.0 W 27.9\n",
"ogrenci10 95 0 85.0 0.0 W 35.0\n",
"ogrenci11 100 100 75.0 76.0 0 80.5\n",
"ogrenci12 90 100 75.0 92.0 0 87.5\n",
"ogrenci13 95 100 72.0 77.0 0 79.6\n",
"ogrenci14 95 100 50.0 44.0 0 56.5\n",
"ogrenci15 100 100 91.0 98.0 A 96.3\n",
"ogrenci16 90 100 75.0 86.0 0 84.5\n",
"ogrenci17 95 100 63.0 67.0 0 71.9\n",
"ogrenci18 100 100 88.0 96.0 A 94.4\n",
"ogrenci19 70 98 59.0 76.0 0 72.5\n",
"ogrenci20 100 100 81.0 94.0 A 91.3\n",
"ogrenci21 95 97 75.0 83.0 0 83.2\n",
"ogrenci22 100 100 85.0 100.0 A 95.5\n",
"ogrenci23 90 100 79.0 70.0 0 77.7\n",
"ogrenci24 90 0 0.0 0.0 W 9.0\n",
"ogrenci25 0 75 50.0 74.0 0 59.5\n",
"ogrenci26 100 100 68.0 75.0 0 77.9\n",
"ogrenci27 92 97 63.0 59.0 0 67.3\n",
"ogrenci28 100 100 81.0 76.0 0 82.3\n",
"ogrenci29 100 97 52.0 69.0 0 69.8\n",
"ogrenci30 92 0 86.0 0.0 W 35.0\n",
"ogrenci31 87 100 59.0 82.0 0 77.4\n",
"ogrenci32 100 100 92.0 89.0 A 92.1\n",
"ogrenci33 100 100 92.0 100.0 A 97.6\n",
"ogrenci34 95 100 53.0 69.0 0 69.9\n",
"ogrenci35 100 100 94.0 83.0 A 89.7\n",
"ogrenci36 95 0 76.0 79.0 0 71.8\n",
"ogrenci37 78 0 47.0 23.0 0 33.4"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ogrenciler = notlar.index.values\n",
"print(ogrenciler)\n",
"for i, ortalama in enumerate(notlar['genel_ortalama']):\n",
" if ortalama > 89.500:\n",
" notlar.at[ogrenciler[i], 'durum'] = 'A'\n",
"notlar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Aynı sonucu dilimleme için koşul kullanmak suretiyle de almak mümkündür. Veri çerçeveleri üzerinde tanımlı `loc` metodu herhangi bir veya birden fazla sütunda istenen koşulu sağlayan satırları seçmek için kullanılablir. Bu satırlar seçildikten sonra bu koşulların sağlandığı satırda yer alan istenen sütun(lar) yeni değerleri ile güncellenebilir. Bu noktada birden fazla koşulun `and` ya da `or` gibi bir bağlaçla bağlanarak kombine koşullar oluşturulması mümkün olmakla birlikte pandas'ın `and` ve `or` yerine bitwise boolean operatörlerini ( `&` ve `|`) kullanıyor olmasına dikkat etmek gerekir."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"notlar.loc[(notlar['genel_ortalama'] >= 87.500) & (notlar['genel_ortalama'] < 89.500), ['durum']] = 'A-'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 84.000) & (notlar['genel_ortalama'] < 87.500), ['durum']] = 'B+'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 79.500) & (notlar['genel_ortalama'] < 84.500), ['durum']] = 'B'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 76.500) & (notlar['genel_ortalama'] < 79.500), ['durum']] = 'B-'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 72.500) & (notlar['genel_ortalama'] < 76.500), ['durum']] = 'C+'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 69.500) & (notlar['genel_ortalama'] < 72.500), ['durum']] = 'C'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 64.500) & (notlar['genel_ortalama'] < 69.500), ['durum']] = 'C-'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 59.500) & (notlar['genel_ortalama'] < 64.500), ['durum']] = 'D+'\n",
"notlar.loc[(notlar['genel_ortalama'] >= 54.500) & (notlar['genel_ortalama'] < 59.500), ['durum']] = 'D'\n",
"notlar.loc[(notlar['genel_ortalama'] < 54.500) & (notlar['durum'] != 'W'), ['durum']] = 'F'"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
" genel_ortalama | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 10.0 | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" C+ | \n",
" 75.4 | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" B+ | \n",
" 84.8 | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" D | \n",
" 56.2 | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.7 | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" C | \n",
" 69.5 | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" A | \n",
" 90.8 | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" B+ | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" 0.0 | \n",
" W | \n",
" 27.9 | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" B | \n",
" 80.5 | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" A- | \n",
" 87.5 | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" B | \n",
" 79.6 | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" D | \n",
" 56.5 | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" A | \n",
" 96.3 | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" B+ | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" C | \n",
" 71.9 | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" A | \n",
" 94.4 | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" C+ | \n",
" 72.5 | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" A | \n",
" 91.3 | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" B | \n",
" 83.2 | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" A | \n",
" 95.5 | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" B- | \n",
" 77.7 | \n",
"
\n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.0 | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" D+ | \n",
" 59.5 | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" B- | \n",
" 77.9 | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" C- | \n",
" 67.3 | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" B | \n",
" 82.3 | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" C | \n",
" 69.8 | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" B- | \n",
" 77.4 | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" A | \n",
" 92.1 | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" A | \n",
" 97.6 | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" C | \n",
" 69.9 | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" A | \n",
" 89.7 | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" C | \n",
" 71.8 | \n",
"
\n",
" \n",
" | ogrenci37 | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" F | \n",
" 33.4 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum genel_ortalama\n",
"ad \n",
"ogrenci1 100 0 0.0 0.0 W 10.0\n",
"ogrenci2 80 92 64.0 78.0 C+ 75.4\n",
"ogrenci3 95 100 71.0 88.0 B+ 84.8\n",
"ogrenci4 100 100 54.0 40.0 D 56.2\n",
"ogrenci5 97 0 0.0 0.0 W 9.7\n",
"ogrenci6 100 100 55.0 66.0 C 69.5\n",
"ogrenci7 100 100 91.0 87.0 A 90.8\n",
"ogrenci8 97 100 86.0 78.0 B+ 84.5\n",
"ogrenci9 75 0 68.0 0.0 W 27.9\n",
"ogrenci10 95 0 85.0 0.0 W 35.0\n",
"ogrenci11 100 100 75.0 76.0 B 80.5\n",
"ogrenci12 90 100 75.0 92.0 A- 87.5\n",
"ogrenci13 95 100 72.0 77.0 B 79.6\n",
"ogrenci14 95 100 50.0 44.0 D 56.5\n",
"ogrenci15 100 100 91.0 98.0 A 96.3\n",
"ogrenci16 90 100 75.0 86.0 B+ 84.5\n",
"ogrenci17 95 100 63.0 67.0 C 71.9\n",
"ogrenci18 100 100 88.0 96.0 A 94.4\n",
"ogrenci19 70 98 59.0 76.0 C+ 72.5\n",
"ogrenci20 100 100 81.0 94.0 A 91.3\n",
"ogrenci21 95 97 75.0 83.0 B 83.2\n",
"ogrenci22 100 100 85.0 100.0 A 95.5\n",
"ogrenci23 90 100 79.0 70.0 B- 77.7\n",
"ogrenci24 90 0 0.0 0.0 W 9.0\n",
"ogrenci25 0 75 50.0 74.0 D+ 59.5\n",
"ogrenci26 100 100 68.0 75.0 B- 77.9\n",
"ogrenci27 92 97 63.0 59.0 C- 67.3\n",
"ogrenci28 100 100 81.0 76.0 B 82.3\n",
"ogrenci29 100 97 52.0 69.0 C 69.8\n",
"ogrenci30 92 0 86.0 0.0 W 35.0\n",
"ogrenci31 87 100 59.0 82.0 B- 77.4\n",
"ogrenci32 100 100 92.0 89.0 A 92.1\n",
"ogrenci33 100 100 92.0 100.0 A 97.6\n",
"ogrenci34 95 100 53.0 69.0 C 69.9\n",
"ogrenci35 100 100 94.0 83.0 A 89.7\n",
"ogrenci36 95 0 76.0 79.0 C 71.8\n",
"ogrenci37 78 0 47.0 23.0 F 33.4"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pandas'ın istatistiki analize yönelik pek çok fonksiyonu bulunmaktadır. Bunlardan bazılarını örnekleyelim."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" genel_ortalama | \n",
"
\n",
" \n",
" \n",
" \n",
" | count | \n",
" 37.000000 | \n",
" 37.000000 | \n",
" 37.000000 | \n",
" 37.000000 | \n",
" 37.000000 | \n",
"
\n",
" \n",
" | mean | \n",
" 91.567568 | \n",
" 77.189189 | \n",
" 66.351351 | \n",
" 64.162162 | \n",
" 68.862162 | \n",
"
\n",
" \n",
" | std | \n",
" 17.234559 | \n",
" 41.321126 | \n",
" 24.261556 | \n",
" 32.707044 | \n",
" 25.339926 | \n",
"
\n",
" \n",
" | min | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 9.000000 | \n",
"
\n",
" \n",
" | 25% | \n",
" 90.000000 | \n",
" 92.000000 | \n",
" 55.000000 | \n",
" 59.000000 | \n",
" 59.500000 | \n",
"
\n",
" \n",
" | 50% | \n",
" 95.000000 | \n",
" 100.000000 | \n",
" 72.000000 | \n",
" 76.000000 | \n",
" 77.400000 | \n",
"
\n",
" \n",
" | 75% | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 85.000000 | \n",
" 86.000000 | \n",
" 84.800000 | \n",
"
\n",
" \n",
" | max | \n",
" 100.000000 | \n",
" 100.000000 | \n",
" 94.000000 | \n",
" 100.000000 | \n",
" 97.600000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final genel_ortalama\n",
"count 37.000000 37.000000 37.000000 37.000000 37.000000\n",
"mean 91.567568 77.189189 66.351351 64.162162 68.862162\n",
"std 17.234559 41.321126 24.261556 32.707044 25.339926\n",
"min 0.000000 0.000000 0.000000 0.000000 9.000000\n",
"25% 90.000000 92.000000 55.000000 59.000000 59.500000\n",
"50% 95.000000 100.000000 72.000000 76.000000 77.400000\n",
"75% 100.000000 100.000000 85.000000 86.000000 84.800000\n",
"max 100.000000 100.000000 94.000000 100.000000 97.600000"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar.describe()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"count 37\n",
"unique 12\n",
"top A\n",
"freq 8\n",
"Name: durum, dtype: object"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar['durum'].describe()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" odev1 | \n",
" odev2 | \n",
" arasinav | \n",
" final | \n",
" durum | \n",
" genel_ortalama | \n",
"
\n",
" \n",
" | ad | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | ogrenci24 | \n",
" 90 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.0 | \n",
"
\n",
" \n",
" | ogrenci5 | \n",
" 97 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 9.7 | \n",
"
\n",
" \n",
" | ogrenci1 | \n",
" 100 | \n",
" 0 | \n",
" 0.0 | \n",
" 0.0 | \n",
" W | \n",
" 10.0 | \n",
"
\n",
" \n",
" | ogrenci9 | \n",
" 75 | \n",
" 0 | \n",
" 68.0 | \n",
" 0.0 | \n",
" W | \n",
" 27.9 | \n",
"
\n",
" \n",
" | ogrenci10 | \n",
" 95 | \n",
" 0 | \n",
" 85.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci30 | \n",
" 92 | \n",
" 0 | \n",
" 86.0 | \n",
" 0.0 | \n",
" W | \n",
" 35.0 | \n",
"
\n",
" \n",
" | ogrenci37 | \n",
" 78 | \n",
" 0 | \n",
" 47.0 | \n",
" 23.0 | \n",
" F | \n",
" 33.4 | \n",
"
\n",
" \n",
" | ogrenci4 | \n",
" 100 | \n",
" 100 | \n",
" 54.0 | \n",
" 40.0 | \n",
" D | \n",
" 56.2 | \n",
"
\n",
" \n",
" | ogrenci14 | \n",
" 95 | \n",
" 100 | \n",
" 50.0 | \n",
" 44.0 | \n",
" D | \n",
" 56.5 | \n",
"
\n",
" \n",
" | ogrenci27 | \n",
" 92 | \n",
" 97 | \n",
" 63.0 | \n",
" 59.0 | \n",
" C- | \n",
" 67.3 | \n",
"
\n",
" \n",
" | ogrenci6 | \n",
" 100 | \n",
" 100 | \n",
" 55.0 | \n",
" 66.0 | \n",
" C | \n",
" 69.5 | \n",
"
\n",
" \n",
" | ogrenci17 | \n",
" 95 | \n",
" 100 | \n",
" 63.0 | \n",
" 67.0 | \n",
" C | \n",
" 71.9 | \n",
"
\n",
" \n",
" | ogrenci29 | \n",
" 100 | \n",
" 97 | \n",
" 52.0 | \n",
" 69.0 | \n",
" C | \n",
" 69.8 | \n",
"
\n",
" \n",
" | ogrenci34 | \n",
" 95 | \n",
" 100 | \n",
" 53.0 | \n",
" 69.0 | \n",
" C | \n",
" 69.9 | \n",
"
\n",
" \n",
" | ogrenci23 | \n",
" 90 | \n",
" 100 | \n",
" 79.0 | \n",
" 70.0 | \n",
" B- | \n",
" 77.7 | \n",
"
\n",
" \n",
" | ogrenci25 | \n",
" 0 | \n",
" 75 | \n",
" 50.0 | \n",
" 74.0 | \n",
" D+ | \n",
" 59.5 | \n",
"
\n",
" \n",
" | ogrenci26 | \n",
" 100 | \n",
" 100 | \n",
" 68.0 | \n",
" 75.0 | \n",
" B- | \n",
" 77.9 | \n",
"
\n",
" \n",
" | ogrenci19 | \n",
" 70 | \n",
" 98 | \n",
" 59.0 | \n",
" 76.0 | \n",
" C+ | \n",
" 72.5 | \n",
"
\n",
" \n",
" | ogrenci11 | \n",
" 100 | \n",
" 100 | \n",
" 75.0 | \n",
" 76.0 | \n",
" B | \n",
" 80.5 | \n",
"
\n",
" \n",
" | ogrenci28 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 76.0 | \n",
" B | \n",
" 82.3 | \n",
"
\n",
" \n",
" | ogrenci13 | \n",
" 95 | \n",
" 100 | \n",
" 72.0 | \n",
" 77.0 | \n",
" B | \n",
" 79.6 | \n",
"
\n",
" \n",
" | ogrenci2 | \n",
" 80 | \n",
" 92 | \n",
" 64.0 | \n",
" 78.0 | \n",
" C+ | \n",
" 75.4 | \n",
"
\n",
" \n",
" | ogrenci8 | \n",
" 97 | \n",
" 100 | \n",
" 86.0 | \n",
" 78.0 | \n",
" B+ | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci36 | \n",
" 95 | \n",
" 0 | \n",
" 76.0 | \n",
" 79.0 | \n",
" C | \n",
" 71.8 | \n",
"
\n",
" \n",
" | ogrenci31 | \n",
" 87 | \n",
" 100 | \n",
" 59.0 | \n",
" 82.0 | \n",
" B- | \n",
" 77.4 | \n",
"
\n",
" \n",
" | ogrenci21 | \n",
" 95 | \n",
" 97 | \n",
" 75.0 | \n",
" 83.0 | \n",
" B | \n",
" 83.2 | \n",
"
\n",
" \n",
" | ogrenci35 | \n",
" 100 | \n",
" 100 | \n",
" 94.0 | \n",
" 83.0 | \n",
" A | \n",
" 89.7 | \n",
"
\n",
" \n",
" | ogrenci16 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 86.0 | \n",
" B+ | \n",
" 84.5 | \n",
"
\n",
" \n",
" | ogrenci7 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 87.0 | \n",
" A | \n",
" 90.8 | \n",
"
\n",
" \n",
" | ogrenci3 | \n",
" 95 | \n",
" 100 | \n",
" 71.0 | \n",
" 88.0 | \n",
" B+ | \n",
" 84.8 | \n",
"
\n",
" \n",
" | ogrenci32 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 89.0 | \n",
" A | \n",
" 92.1 | \n",
"
\n",
" \n",
" | ogrenci12 | \n",
" 90 | \n",
" 100 | \n",
" 75.0 | \n",
" 92.0 | \n",
" A- | \n",
" 87.5 | \n",
"
\n",
" \n",
" | ogrenci20 | \n",
" 100 | \n",
" 100 | \n",
" 81.0 | \n",
" 94.0 | \n",
" A | \n",
" 91.3 | \n",
"
\n",
" \n",
" | ogrenci18 | \n",
" 100 | \n",
" 100 | \n",
" 88.0 | \n",
" 96.0 | \n",
" A | \n",
" 94.4 | \n",
"
\n",
" \n",
" | ogrenci15 | \n",
" 100 | \n",
" 100 | \n",
" 91.0 | \n",
" 98.0 | \n",
" A | \n",
" 96.3 | \n",
"
\n",
" \n",
" | ogrenci22 | \n",
" 100 | \n",
" 100 | \n",
" 85.0 | \n",
" 100.0 | \n",
" A | \n",
" 95.5 | \n",
"
\n",
" \n",
" | ogrenci33 | \n",
" 100 | \n",
" 100 | \n",
" 92.0 | \n",
" 100.0 | \n",
" A | \n",
" 97.6 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" odev1 odev2 arasinav final durum genel_ortalama\n",
"ad \n",
"ogrenci24 90 0 0.0 0.0 W 9.0\n",
"ogrenci5 97 0 0.0 0.0 W 9.7\n",
"ogrenci1 100 0 0.0 0.0 W 10.0\n",
"ogrenci9 75 0 68.0 0.0 W 27.9\n",
"ogrenci10 95 0 85.0 0.0 W 35.0\n",
"ogrenci30 92 0 86.0 0.0 W 35.0\n",
"ogrenci37 78 0 47.0 23.0 F 33.4\n",
"ogrenci4 100 100 54.0 40.0 D 56.2\n",
"ogrenci14 95 100 50.0 44.0 D 56.5\n",
"ogrenci27 92 97 63.0 59.0 C- 67.3\n",
"ogrenci6 100 100 55.0 66.0 C 69.5\n",
"ogrenci17 95 100 63.0 67.0 C 71.9\n",
"ogrenci29 100 97 52.0 69.0 C 69.8\n",
"ogrenci34 95 100 53.0 69.0 C 69.9\n",
"ogrenci23 90 100 79.0 70.0 B- 77.7\n",
"ogrenci25 0 75 50.0 74.0 D+ 59.5\n",
"ogrenci26 100 100 68.0 75.0 B- 77.9\n",
"ogrenci19 70 98 59.0 76.0 C+ 72.5\n",
"ogrenci11 100 100 75.0 76.0 B 80.5\n",
"ogrenci28 100 100 81.0 76.0 B 82.3\n",
"ogrenci13 95 100 72.0 77.0 B 79.6\n",
"ogrenci2 80 92 64.0 78.0 C+ 75.4\n",
"ogrenci8 97 100 86.0 78.0 B+ 84.5\n",
"ogrenci36 95 0 76.0 79.0 C 71.8\n",
"ogrenci31 87 100 59.0 82.0 B- 77.4\n",
"ogrenci21 95 97 75.0 83.0 B 83.2\n",
"ogrenci35 100 100 94.0 83.0 A 89.7\n",
"ogrenci16 90 100 75.0 86.0 B+ 84.5\n",
"ogrenci7 100 100 91.0 87.0 A 90.8\n",
"ogrenci3 95 100 71.0 88.0 B+ 84.8\n",
"ogrenci32 100 100 92.0 89.0 A 92.1\n",
"ogrenci12 90 100 75.0 92.0 A- 87.5\n",
"ogrenci20 100 100 81.0 94.0 A 91.3\n",
"ogrenci18 100 100 88.0 96.0 A 94.4\n",
"ogrenci15 100 100 91.0 98.0 A 96.3\n",
"ogrenci22 100 100 85.0 100.0 A 95.5\n",
"ogrenci33 100 100 92.0 100.0 A 97.6"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar.sort_values(by=[\"final\",\"genel_ortalama\"])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"`pandas` 'ın yeni versiyonlarında istatistiksel işlemler yapılmak istenen sütunlarının bu işleme uygun yapıda olup olmadığı da değerlendirildiğinden, sadece yapılmak istenen uygun sütunların seçilerek ilgili fonksiyon ya da metodun üzerine uygulanması gerekmektedir. Bu nedenle aşağıda ortalaması `mean` metoduyla alınmak istenen sütunlar önce `select_dtypes(include=np.number)` metoduyla belirlenmiş, sonra `mean()` metodu uygulanmıştır."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"odev1 91.567568\n",
"odev2 77.189189\n",
"arasinav 66.351351\n",
"final 64.162162\n",
"genel_ortalama 68.862162\n",
"dtype: float64"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"notlar.select_dtypes(include=np.number).mean()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"odev1 95.0\n",
"odev2 100.0\n",
"arasinav 72.0\n",
"final 76.0\n",
"genel_ortalama 77.4\n",
"dtype: float64"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar[['odev1','odev2','arasinav','final','genel_ortalama']].median()"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"odev1 100.0\n",
"odev2 100.0\n",
"arasinav 94.0\n",
"final 100.0\n",
"genel_ortalama 97.6\n",
"dtype: float64"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar.select_dtypes(include=np.number).max()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Biraz da analiz yapmak üzere derste alınan notları inceleyelim."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"A 8\n",
"W 6\n",
"C 5\n",
"B 4\n",
"B+ 3\n",
"B- 3\n",
"C+ 2\n",
"D 2\n",
"A- 1\n",
"D+ 1\n",
"C- 1\n",
"F 1\n",
"Name: durum, dtype: int64"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar[\"durum\"].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Her ne kadar örnekteki veri dosyasyının büyük olmadığından ondan oluşturulan veriçerçevesi üzerindeki işlemler çok hızlı gerçekleşse de string nesneleri işlemleri oldukça yavaşlatır. `pandas` string nesneleri gibi nümerik olmayan, heterojen yapıdaki serileri `object` nesnesi olarak saklar. Bu veriler hem çok yer kaplar, hem de işlemleri yavaşlatır. Sadece belirli string değerlerini alan `object` türündeki veri `category` türüne dönüştürülerek hem yerden, hem işlem hızından kazanılabilir."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"CategoricalDtype(categories=['A', 'A-', 'B', 'B+', 'B-', 'C', 'C+', 'C-', 'D', 'D+', 'F',\n",
" 'W'],\n",
", ordered=False)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"notlar = notlar.astype({\"durum\":'category'})\n",
"notlar['durum'].dtype"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Bu veriçerçevesi kategorik veri taşıdığı için doğrudan `hist` fonksiyonunu kullanamasak da bir histogram görmek için `plot` fonksiyonunun `bar` seçeneğini kullanabiliriz."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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UPTo0SNOOOGEeOihh1LPBQCUoYLD4o477ohvfOMb8a1vfSseeeSROPXUU6Ouri62bt3aHfMBAGWk4LC47rrr4stf/nJ85StfiWOPPTbmzJkTtbW1MXfu3O6YDwAoI1WFrPzGG2/E2rVrY8aMGe2eHzt2bPzmN7/pcJuWlpZoaWlpe9zU1BQREc3Nze+5v9aWVwsZ7315P/stRDnMGJF+znKYMcLPO5VymDHCzzuVcpgxws87lfc749vrZVm25xWzAjz77LNZRGS//vWv2z0/a9asbMiQIR1uc80112QRYbFYLBaLZT9YGhsb99gKBR2xeFsul2v3OMuy3Z57W319fUyfPr3tcWtra7z44ovRp0+fTrcpRHNzc9TW1kZjY2PU1NTs9ft1l3KY04zplMOcZkynHOY0YzrlMGd3zJhlWezYsSP69++/x/UKCosPf/jDUVlZGc8991y7559//vk47LDDOtwmn89HPp9v99yHPvShQnb7vtTU1JTsD/idymFOM6ZTDnOaMZ1ymNOM6ZTDnKln7NWr13uuU9DJmwceeGCccMIJcd9997V7/r777ouTTz65sOkAgP1OwR+FTJ8+PS688MI48cQTY9SoUXHTTTfF1q1b42tf+1p3zAcAlJGCw+Lcc8+NF154Ib773e/Gn/70pxg+fHjcc889MWDAgO6Y7z3l8/m45pprdvu4pdSUw5xmTKcc5jRjOuUwpxnTKYc5izljLnvP60YAAN4f9woBAJIRFgBAMsICAEhGWAAAyexXYfHoo48We4TYtGlTsUcAgKIp+7BoamqKG264IY4//vg44YQTij1ODBkyJGpra+Oiiy6KBQsWxObNm4s9UoeWL18eQ4cO7fDmM01NTTFs2LB46KGHijAZkNrs2bPj5ZdfLvYYdJOnn376vW8Mtg+VbVgsX748LrjggujXr19cf/31MW7cuFizZk2xx4qVK1fG5MmTY9u2bTF16tQ46qijYtCgQfHlL385Fi5cGM8++2yxR4yIiDlz5sRXv/rVDr/qtVevXjF58uS47rrrijBZx1544YW2/25sbIyrr746rrjiCvFDUbS2tsb8+fNjwoQJMXz48BgxYkScddZZcdttt5XUH/Bvu/baa+PFF18s9hjvqaamJp5++ulij1F2Bg8eHP/zP//T9vjcc8+N7du3F2+gQu5uWmyNjY3Z9773vWzQoEFZ3759s6lTp2ZVVVXZ448/XuzROvTGG29kK1euzGbOnJmNGTMmO+igg7KKiopO7wS7Lx155JHZE0880enrGzduzGpra/fhRB1bv359NmDAgKyioiI7+uijs0ceeSQ77LDDsp49e2Y1NTVZZWVltnTp0mKPWZaGDx+ebd26tdhj7FF1dXX2hz/8odhjtNPa2pqNHz8+y+Vy2XHHHZedd9552bnnnpuNHDkyy+Vy2dlnn13sEXfTs2fPkvt17Ei5zFlqcrlctn379rbHxf51LJsjFuPGjYuhQ4fGE088Eddff31s27Ytrr/++mKPtUcHHHBAnHbaaXHFFVdEfX19XHbZZdGzZ8+SOA9j+/btccABB3T6elVVVbsCLpa///u/jxEjRsTKlStj9OjRMWHChBg3blw0NTXFSy+9FJMnT47Zs2cXe8zdjBgxIhobG4s9xh5t3rw5/u///q/YY+xRVoL/+r/lllviwQcfjF/+8pfxyCOPxKJFi2Lx4sWxbt26uP/++2P58uVx2223FXvMPSqF89HKmSMre1Y2YfGf//mf8ZWvfCVmzpwZ48ePj8rKymKP1KnXX389li9fHt/5znfi1FNPjd69e8fll18er7zySsydOze2bt1a7BHjIx/5SGzYsKHT19evXx/9+vXbhxN1bPXq1TFr1qw45ZRT4gc/+EFs27YtLrvssqioqIiKioqYNm1aPPnkk8Ueczfl8Jc2XbNo0aK46qqrYsyYMbu9dsYZZ8SMGTPiX//1X4swWeeeeOKJ6NWrV0mdj9aRCy64oOTvFhpResGby+Uil8vt9lyxFHyvkGJ56KGHYv78+XHiiSfGMcccExdeeGGce+65xR5rN6effnqsXr06jjrqqDjttNNi2rRpcfrpp3d6W/liGTduXFx99dVRV1cXPXr0aPfaa6+9Ftdcc01MmDChSNP92YsvvhiHH354RET07NkzDj744DjkkEPaXu/du3fs2LGjWOOVtVNPPTUOOuigYo/RzrujO8uy2LZtW1RV/fmPqiOPPHJfj9XO+vXr45/+6Z86fb2uri5+9KMf7cOJ9mz58uUxf/78WLJkSQwYMCA+97nPxbx584o9VixfvjymTp0aq1ataouJuXPnRsRbJ5CffPLJceONN8app55azDHLQpZl8aUvfantviCvv/56fO1rX4uDDz643XpLlizZJ/OU3b1CXn311Vi8eHHMnz8/fvvb38auXbviuuuui0suuSSqq6uLPV4ccMAB0a9fvzjnnHNi9OjRcdppp8WHP/zhYo+1m+3bt8fxxx8flZWVMXXq1Dj66KMjl8vFxo0b4yc/+Uns2rUrHn744aIHUUVFRWzfvj0OPfTQiIiorq6O9evXx6BBgyLirf8d/fv3j127dhVzzN28e85S8cILL0SfPn0i4q2/xP/5n/85XnvttTjrrLNK4g/wioqKyOVynf6LMJfLFf1nfeCBB8aWLVs6PaK3bdu2GDRoULS0tOzjyf7sj3/8Y9xyyy0xf/782LlzZ/zt3/5t3HjjjbFu3boYOnRo0eZ6p7POOivGjBkT3/zmNzt8/Uc/+lE88MADsXTp0n082e7eHbxDhw6NZcuWtYvcYgbvxRdf/L7WW7BgQTdP8v8V7eyOBJ588snsiiuuyA4//PCsR48e2cSJE4s9UvbKK69k9957b3bllVdmf/mXf5kdeOCB2fDhw7MpU6ZkP/vZz7Lnn3++2CO22bx5c1ZXV5dVVFRkuVwuy+VyWUVFRVZXV5c988wzxR4vy7K3TkoaN25c9tnPfjb77Gc/m1VVVWVjx45tezxu3LisoqKi2GO2/dp1tLz9WjGV60mwxT4JrSMVFRV7/H383HPPFfXnXVdXl1VXV2fnn39+9otf/CJ78803syzLSu5E93I5gTzL/vz7++0/J9+9FPv3d6kpuyMWHdm1a1f8/Oc/j/nz58ddd91V7HHa2bFjR/zqV7+KBx54IFasWBHr1q2LwYMHx2OPPVbs0dq89NJLsWnTpsiyLAYPHhy9e/cu9khtSq7EO7Fly5a2/86yLIYPHx733HNPDBgwoO35d/73vlZXVxdVVVVx5ZVXxsKFC+MXv/hFnHnmmW2HxKdNmxZr166NVatWFW3GjlRXV8e6deviox/9aLFHaVNRURF1dXWd3o66paUlli1bVrQjK1VVVXH55ZfHpZdeGoMHD257/oADDiipIxY9evSIxx57LD72sY91+PqmTZtixIgR8dprr+3jyd5bKf7/spSUzTkWe1JZWRnnnHNOnHPOOcUeZTdvnxNwyCGHRO/evaOqqio2btxY7LHa6d27d5x00knFHqNDxQ6G9+vd0ZDL5eKII44oaky80+rVq2P58uUxcuTIOO644+Kmm26KKVOmREXFW+dvT5s2LT75yU8WecryMGnSpPdc56KLLtoHk3SsXM5He/sE8s7ColROIKdw+0VYlJLW1tZYs2ZNrFixIh544IH49a9/HTt37oyPfOQjMWbMmPjJT37S4dnk0J3K9STYUjzBtNRjd9SoUTFq1Kj44Q9/2HY+2vTp06O1tTXuu+++qK2tLYnz0crlBHIKt198FFJKampqYufOndGvX78YPXp0jB49OsaMGRNHHXVUsUdjHxo+fHjce++9UVtbW+xRIqJ8T4IljaeeeirmzZsX//Iv/xIvv/xynHnmmUX/2LhcTiDvyLhx42LevHmOqHRCWCT205/+NMaMGRNDhgwp9ijQ5t3nBfz85z+PM844o+1ytGKfFxDR8eWHb3P5YRqldj7ali1b4tJLL43/+I//aLsSKJfLxd/8zd/EDTfcEAMHDizugHSJsIBE3nkpZ2NjY9x8880lcylnOZwEW06XH5JWKZ9AHvHWR9y33HJLLFmyJDZv3hy5XC4GDRoUn//85+PCCy8s6pdRlSJhAXtpw4YNMXHixGhsbIzBgwfH4sWL4zOf+Uzs3LkzKioqYufOnfFv//ZvJXlycSkZMGBALFu2LI499tgOX3/yySdj7NixJfHNtXxwZFkWEydOjHvuuSc+/vGPxzHHHBNZlsXGjRtjw4YNcdZZZ8Wdd95Z7DFLStl8pTeUqnK9n0mpKZf71/DBsj/cG2ZfExawl8r1fialplzuX8MHSzneG6bYhAXspXK9lLPUvH354euvv77bay4/pFjWr18fn/nMZzp9va6uLtatW7cPJyp9vscCEiilOwuWq29/+9uxZMmSGDJkSKeXH37rW98q9ph8wLz44ot7vOT1sMMOi5deemkfTlT6hAUksKc7CxbzZlTl5LDDDovf/OY3cemll0Z9fX2Hlx+W4ncasH/btWtXu7vrvltlZWW8+eab+3Ci0ueqENhL5XApZ7kp9csP+eAo9XvDlCJhAQCd8A+HwgkLACAZV4UAAMkICwAgGWEBACQjLACAZIQFAJCMsAAAkhEWAEAy/w8sak72cb9HDgAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"from matplotlib import pyplot as plt\n",
"notlar['durum'].value_counts().plot(kind='bar')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veri çerçevesi nesnelerinin üzerinde çizim fonksiyounu (`plot`) da tanımlıdır. Bunun için ayrıca matplotlib kütüphanesi çağırmaya gerek yoktur, çünkü çizim fonksiyonu matplotlib'i kendi çağırır."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAGwCAYAAACD0J42AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1R0lEQVR4nO3de3hU1b3/8c8khEmCycjFZBKIEASVEC8ol4JUUATRSlur9FSkxZb6IKglUoVy6Cng04YCltoWpYUq2lIvPfagxQtKxWIVNQikGlCsGAQh+UUunQQkFzLr90c6Q4ZkQibMZc/s9+t55tHs+c5kfWfv7Pmy1l5rO4wxRgAAABaSFOsGAAAAnIoCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMvpFOsGdITX69WBAweUkZEhh8MR6+YAAIB2MMaopqZGubm5Skpqu48kLguUAwcOKC8vL9bNAAAAHbBv3z716tWrzZi4LFAyMjIkNSWYmZkZ49YAAID2qK6uVl5env97vC1xWaD4hnUyMzMpUAAAiDPtuTyDi2QBAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5cTlSrIAEE2NXqOS8sOqqqlVVkaqhuZ3U3ISNypFII6T8Aq5B+X111/XhAkTlJubK4fDoWeffTbgeWOMFixYoNzcXKWlpWn06NHasWNHQExdXZ3uvvtu9ejRQ126dNFXv/pVffbZZ2eUCABEwvqyCo1cvFG3rHpbM58q1S2r3tbIxRu1vqwi1k2DhXCchF/IBcqxY8d0ySWXaPny5a0+v2TJEi1btkzLly/Xli1b5Ha7NXbsWNXU1PhjioqKtHbtWj311FN64403dPToUd1www1qbGzseCYAEGbryyo0fc02VXhqA7ZXemo1fc02vnwgieMkUhzGGNPhFzscWrt2rb7+9a9Lauo9yc3NVVFRkebMmSOpqbckOztbixcv1rRp0+TxeHTOOefoj3/8o/7rv/5LknTgwAHl5eXpxRdf1LXXXnva31tdXS2XyyWPx8PNAgFERKPXaOTijS2+dHwcktyuVL0x52q68W2M4yQ0oXx/h/Ui2fLyclVWVmrcuHH+bU6nU6NGjdLmzZslSVu3blVDQ0NATG5urgoLC/0xp6qrq1N1dXXAAwAiqaT8cNAvHUkykio8tSopPxy9RsFyOE4iJ6wFSmVlpSQpOzs7YHt2drb/ucrKSnXu3Fldu3YNGnOqRYsWyeVy+R95eXnhbDYAtFBVE/xLpyNxSEwcJ5ETkWnGDkdgN5YxpsW2U7UVM3fuXHk8Hv9j3759YWsrALQmKyM1rHFITBwnkRPWAsXtdktSi56Qqqoqf6+K2+1WfX29jhw5EjTmVE6nU5mZmQEPACc1eo3e2n1Iz5Xu11u7D6nR2+FLy/AfQ/O7KceVqmD/tHJIynE1TSWFfXGcRE5YC5T8/Hy53W5t2LDBv62+vl6bNm3SiBEjJEmXX365UlJSAmIqKipUVlbmjwHQfkxvjIzkJIfmTyiQpBZfPr6f508o4MJHm+M4iZyQC5SjR4+qtLRUpaWlkpoujC0tLdXevXvlcDhUVFSk4uJirV27VmVlZbrtttuUnp6uSZMmSZJcLpemTp2qH/7wh3r11Ve1fft2TZ48WRdddJGuueaasCYHJDqmN0bW+MIcrZh8mdyuwO55tytVKyZfpvGFOTFqGayE4yQyQp5m/Pe//11XXXVVi+1TpkzRY489JmOMFi5cqN/97nc6cuSIhg0bpoceekiFhYX+2NraWt1333164okndPz4cY0ZM0YPP/xwuy9+ZZoxwPTGaGKFULQHx8nphfL9fUbroMQKBQogvbX7kG5Z9fZp4568/Usafl73KLQIANoWs3VQAEQP0xsBJDJuFgjEqXiY3kiXN4COokAB4pRvemOlp1atjdP6rkGJ1fTG9WUVWrhuZ8A1MjmuVM2fUMBFgwBOiyEeIE5ZeXojs4sAnCkKFCCOWXF6Y6PXaOG6na326vi2LVy3k8XkALSJIR4gzo0vzNHYArdlrvUI5eZpzC4CEAwFCpAAkpMclvmyZ3YRgHBgiAdAWMXD7CIA1kcPCoCwivbsIqYyA4mJAgVAWPlmF01fs00OKaBICffsIqYyA4mLIR4AYReN2UVMZQYSGz0oACIikrOLTjeV2aGmqcxjC9wM9wBxigIFQMREanYRU5mBxMcQD4C4w1RmIPFRoACIO0xlBhIfQzxAiJjWGntWv1EigDNHgQKEgGmt1hDNqcwAYoMhHqCdmNZqLVa8USKA8KEHBWgHprVak9VulAggfChQgHZgWqt1WelGiQDChyEeoB2Y1goA0UWBArQD01oBILooUIB28E1rDXZlg0NNs3mY1goA4UGBArSDb1qrpBZFCtNaASD8KFCAdmJaKwBED7N4gBAwrRWwB1aMjj0KFCBETGsFEhsrRlsDQzwAAPwHK0ZbBwVKlDV6jd7afUjPle7XW7sPqdHb2tqkAIBoO92K0VLTitGct6ODIZ4ootsQAKyLFaOthR6UKKHbEACsjRWjrYUCJQroNgQA62PFaGuhQImCULoN4wXX0gBINKwYbS1cgxIFidZtyLU0ABKRb8Xo6Wu2ySEF9HqzYnT00YMSBYnUbci1NAASGStGWwc9KFHg6zas9NS2eh2KQ00Hv9W7DU93LY1DTdfSjC1w8y+MOMBKmUDrWDHaGihQoiBRug2Zgpc4GKYD2saK0bHHEE+UJEK3YaJdS2NXDNMBiAf0oERRvHcbJtK1NHbFMB2AeEGBEmXx3G2YKNfS2BnDdADiBUM8aDfftTSSWqwTEE/X0tgZw3QA4gUFCkKSCNfS2BnDdADiBUM8CFm8X0tjZwzTAYgXFCjokHi+lsbOEmXKO4DExxAPYDMM0wGIB/SgADZk52E6VtBFPLPT8UuBAtiUHYfpWEEX8cxuxy9DPABsgRV0Ec/sePxSoABIeKdbQVdqWkG30dtaBBJBo9ford2H9Fzpfr21+1Bc7Wu7Hr8M8QBIeKyga2/xPjRi1+OXHhQACY8VdO0rEYZG7Hr8UqAASHisoGtPiTI0YtfjlwIFQMLzraAbbDKmQ01d/qygm1hCGRqxMrsevxQoABIeN7q0p0QZGrHr8UuBAsAWWEHXfhJpaMSOxy+zeADYhp1X0LWjRLs5pt2OXwoUALZixxV07SoRb45pp+M37EM8J06c0I9//GPl5+crLS1Nffv21f333y+v1+uPMcZowYIFys3NVVpamkaPHq0dO3aEuykAAJuz49BIogh7D8rixYv129/+Vo8//rgGDhyod999V9/97nflcrk0c+ZMSdKSJUu0bNkyPfbYYzr//PP105/+VGPHjtWuXbuUkZER7iYBAGzMbkMjzcXzzQUdxpiwTgC/4YYblJ2drUceecS/7aabblJ6err++Mc/yhij3NxcFRUVac6cOZKkuro6ZWdna/HixZo2bVqL96yrq1NdXZ3/5+rqauXl5cnj8SgzMzOczQcAICFYcQXd6upquVyudn1/h32IZ+TIkXr11Vf10UcfSZL++c9/6o033tD1118vSSovL1dlZaXGjRvnf43T6dSoUaO0efPmVt9z0aJFcrlc/kdeXl64mw0AQMJIhBV0w16gzJkzR7fccosuvPBCpaSkaNCgQSoqKtItt9wiSaqsrJQkZWdnB7wuOzvb/9yp5s6dK4/H43/s27cv3M0GACAhJMoKumG/BuXpp5/WmjVr9MQTT2jgwIEqLS1VUVGRcnNzNWXKFH+cwxE4BmaMabHNx+l0yul0hrupZyyex/Zigc8LACIvUW4uGPYC5b777tOPfvQjfetb35IkXXTRRfr000+1aNEiTZkyRW63W1JTT0pOzskxsKqqqha9KlZmxbE9K+PzAoDoSJQVdMM+xPPFF18oKSnwbZOTk/3TjPPz8+V2u7Vhwwb/8/X19dq0aZNGjBgR7uZERCKM7UUTnxcARE+irKAb9gJlwoQJ+tnPfqYXXnhBe/bs0dq1a7Vs2TLdeOONkpqGdoqKilRcXKy1a9eqrKxMt912m9LT0zVp0qRwNyfsEmVsL1r4vJo+g7d2H9Jzpfv11u5DCZ0rgNhLlJsLhn2I5ze/+Y3+53/+RzNmzFBVVZVyc3M1bdo0/eQnP/HHzJ49W8ePH9eMGTN05MgRDRs2TK+88kpcrIGSKGN70WL3z4uhLQDRligr6IZ9HZRoCGUedbg9V7pfM58qPW3cr751qb52ac/IN8ji7Px5+Ya2Tv0D850SWMUSQCRZ8R9IoXx/cy+eECXK2F602PXzOt3QlkNNQ1tjC9yW/1cMgPgU7yvoUqCEKNHujhlpVv+8IjX12e5DWx3FVPT4xz60lni+uSAFSogSZWwvWqz8eUWy+zNRpvlFkxW7oxEa9iHCKeyzeOyAu2OGxoqfV6SnPtt1aKujmIoe/9iHCLe4vkj2wOcHWr3IJjkpWamdTp74j9UfC/peSY4kpaWkdSi2pu6Ytuw5pM9r6nROhlODe5/synQ4HEpPSffHftHwhYJ91KfGHm84Lq/xBm1Hl85dOhRbe6JWjd7GsMSmp6T7V/6tO1GnE94Tp41t9Bq98XGFKquPtfi8fNJS0pTkaKqb6xvr1dDYEPR9Q4lN7ZSq5KRkSdLxhjqNWrpBldV1rcYmKUU5ri56Y87V8poTqm+sD/q+zk5OdUpq6ohsaGzwxzZ6ja5Z9nf9v+o6f6+RQylyKPk/PzUqKzNJf5s1utXeo87JnZWSnCJJOuE9oboTrbf11NhGb6NqTwTvlUlJTlHn5M4hx3qNV8cbjocltlNSJzk7Na0MbYxRTd0xXbPs763uD4eSlaQUuV2p+sfsq1TXGPx9Q/m7j9Y5IpS/+2icIxq9Ru9+ejjgnJWZepY/tqPnCN/x3nwfOuSUw99P2qCszE5Bj/dQzifROEeEEtv87741wc4Rp4sN5e8+ns4RtrlINvcXuVIr/wC9vv/1emHSC/6fsx7I0hcNX7T6HqN6j9Lfb/u7/+c+v+qjg18cbDV2cO5gbbl9i//ni1YM1KeeT1uNLTinQDtm7PD/PGTVEO38fGersb1dvbWnaI//5ysfu1LvHni31dge6T30+X2f+3++7k/XadOnm1qNTU9J17H/PnkyvenPN+nFf73YaqwkmfknT47fXvttPbPzmaCxR+ce9Z+spj0/TY//8/GgsVX3VumcLucoOcmhP//rZ3r43YeDxpbPLFefs/tIkua9Ok8PvPVA0Niy6WUamDVQklT8j2It3LQwaGzJ90s0pOcQSdJ9Ly3SloaFUlrrsdl1xarwXKyS8sPadugp3fXSXUHf9/lbntdXzv+KJOlP7/9J333uu4EBzX5Hj7ofqYt3pBySjiW9pS0NP5drcevvu/prq3XbpbdJkl7++GXd8OQNQduw/LrlunPonZKkf+z9h656/KqgsUuuWaL7rrhPkrStYpuG/n5o0Nj5o+ZrwegFkqQPPv9AhSsKg8beO/xeLR23VJK017NX+b/KDxo7Y/AMPfSVhyRJB784qKwHspqeaGV/dDkxRj0a7lGFp1avf/yZxjzVO+j73lxws/534v/6fz5r0VlBY6N1jih4qMDS54gkpeqFmz7x92Ke8Tmi2T7MO/6MHP85QR9MWa5PG14Nerz7zhGSNOvlWTE/R/zq7V9p9t9mB419bcprGt1ntCRp5daVZ3aOaObPN/9ZEwdOlCSt/WCtvvnMN4PGxvM5or0Y4oHtHK0L/q+z5iJ1fYjblarbrwz+BY7WfV4T/F+I6BhjDMMvsCyGeBKo+/Z0sbEe4mlPbDS6b1//qEKTH90cNNY3FPPk7V/S4D6ZZ9x96+tW//cxoxzXWRqa301GjQnZfdue2FOHeF77aJ9uW72l1ViHkuVQU25PfH+YLjk3SLeX7DfE09DY2GK4xjd80vxv+WjdF7r6FxuDDmkmK1VuV6remHO1Grx1HTpHvFN+qMU+bD7EY9Qgo0Y99t0hGpbfckaJ1c4RDPEwxHPGunTuEvAH01ZcKO/ZXs1PGOGMbX6CC2ds8xNyOGOdnZxyqn13mw4ltnNyZ//BH87YK/q51dN1drumPicnOfx/2KeTkpwSNPbqC04dbuikTp3b9+fXKan9sclJye0+hkOJTXIkRSTW4XBoVP889XT967T7Y1jf7iHN9orU370VzhGbdv273bNl3v/suKqqHUpqbTxcHZ/y3vwcMap/epv7sOk6ogyN6p932n1ohXNEKLFt/d2fSWwof/fxdo5oL4Z4YDu+qc+SWtyrItZTn+2I/RGaUGfLRGPKO/sQkUCBAluy4tRnO2N/tE9Hbr4ZrSnv7EOEW1wP8QBnIt6XgU407I/T68gKxdFczZl9iHCiQIGtxfMy0ImI/dG2jgzXRHs1Z/YhwoUhHgCIEx0drmH4BfGIHhQAiBNnMlzD8AviDQUKAMSJMx2uYfgF8YQhHgCIIwzXwC7oQQGAOMNwDeyAAgUA4hDDNUh0DPEAAADLoUABAACWwxAPAIRZo9dwfQhwhihQACCM1pdVtPtOwwCCY4gHAMIk1DsNAwiOHhQACIPT3WnYoaY7DY8tcDPccwq7DonZNe/2okABgDDoyJ2GYd8hMbvmHQqGeAAgDDpyp2G7s+uQmF3zDhUFCgCEQUfvNGxXpxsSk5qGxBq9rUXEL7vm3REUKAAQBr47DQe7gsChpi781u40bEehDIklErvm3REUKAAQBr47DUtqUaS0507DdmPXITG75t0RFCgAECbcabj97DokZte8O4JZPADahSmR7cOdhtvHNyRW6alt9XoMh5oKu0QbErNr3h1BgQLgtJgSGRruNHx6viGx6Wu2ySEFfFkn8pCYXfPuCIZ4ALSJKZGIFLsOidk171A5jDFxN5epurpaLpdLHo9HmZmZsW5OQqD7Hq1p9BqNXLwx6KwDX3f0G3Ou5nhBh9n1/GPHvEP5/maIB3TfIyhWR0U02HVIzK55txdDPDZH9z3awpRIALFCgWJjrGiI02FKJIBYoUCxMVY0xOmwOiqAWKFAsTG673E6rI4KIFYoUGyM7nu0B1MiAcQCs3hsjBUN0V6sjgog2ihQbIwVDREKpkQCiKb4LlCOHZOSk1tuT06WUlMD44JJSpLS0joW+8UXUrB17hwOKT29Y7HHj0teb/B2dOnSsdjaWqmxMeDp8fmZWvmNC1X80gcqP36yEDk3PUk/Hn++xuZntv6ZpKc3tVuS6uqkEyeCtyGU2LS0ps9ZkurrpYaG8MSmpp48VkKJbWhoig/G6ZQ6dQo99sSJps8imM6dpZSU0GMbG5v2czApKU3xocZ6vU3HWjhiO3Vq+iykpr+JL74IT2wof/ecI1qPbeUc0eFYzhFNOEe0jG0vE4c8Ho+RZDxNf84tH9dfH/iC9PTW4yRjRo0KjO3RI3js4MGBsb17B48tKAiMLSgIHtu7d2Ds4MHBY3v0CIwdNSp4bHp6YOz11wePlczmjw+aZ7d/ZjZ/fNB4b7q5zVhz9OjJ950ype3YqqqTsTNmtB1bXn4y9t57244tKzsZO39+27ElJSdjlyxpO/a1107GLl/eduzzz5+MXb267dg///lk7J//3Hbs6tUnY59/vu3Y5ctPxr72WtuxS5acjC0paTt2/vyTsWVlbcfee+/J2PLytmNnzDgZW1XVduyUKSdjjx5tO/bmm02AtmI5RzQ9QjxHBLiZc4QxhnOETzvPEf7vb4/HnE5896AgrAK67xnVAQDEUHzfi+fAgdbX8qf7tvVYum9Dj6X7tun/GeLpWCzniKb/5xwRemyCniNCuRdPfBco3CwQAIC4Ecr3N+ugAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVEpEDZv3+/Jk+erO7duys9PV2XXnqptm7d6n/eGKMFCxYoNzdXaWlpGj16tHbs2BGJpgAAgDgU9gLlyJEjuuKKK5SSkqKXXnpJO3fu1C9+8QudffbZ/pglS5Zo2bJlWr58ubZs2SK3262xY8eqpqYm3M0BAABxKOxL3f/oRz/Sm2++qX/84x+tPm+MUW5uroqKijRnzhxJUl1dnbKzs7V48WJNmzatxWvq6upU1+w+A9XV1crLy2OpewCIsEavUUn5YVXV1CorI1VD87spOYm7iaJjYrrU/V//+lcNHjxYEydOVFZWlgYNGqRVq1b5ny8vL1dlZaXGjRvn3+Z0OjVq1Cht3ry51fdctGiRXC6X/5GXlxfuZgMATrG+rEIjF2/ULave1synSnXLqrc1cvFGrS+riHXTYANhL1A++eQTrVixQv3799fLL7+sO+64Qz/4wQ/0hz/8QZJUWVkpScrOzg54XXZ2tv+5U82dO1cej8f/2LdvX7ibDQBoZn1Zhaav2aYKT+DdbCs9tZq+ZhtFCiKuU7jf0Ov1avDgwSouLpYkDRo0SDt27NCKFSv0ne98xx/ncAR2ERpjWmzzcTqdcvpuuQ4AiKhGr9HCdTvV2vi/keSQtHDdTo0tcDPcg4gJew9KTk6OCgoKArYNGDBAe/fulSS53W5JatFbUlVV1aJXBQAQfSXlh1v0nDRnJFV4alVSfjh6jYLthL1AueKKK7Rr166AbR999JF69+4tScrPz5fb7daGDRv8z9fX12vTpk0aMWJEuJsDAAhRVU3w4qQjcUBHhH2I55577tGIESNUXFysb37zmyopKdHKlSu1cuVKSU1DO0VFRSouLlb//v3Vv39/FRcXKz09XZMmTQp3cwAAIcrKSA1rHNARYS9QhgwZorVr12ru3Lm6//77lZ+frwcffFC33nqrP2b27Nk6fvy4ZsyYoSNHjmjYsGF65ZVXlJGREe7mAABCNDS/m3Jcqar01LZ6HYpDktvVNOUYiJSwr4MSDaHMowYAhM43i0dSQJHiuyR2xeTLNL4wJ+rtQnyL6TooAID4N74wRysmXya3K3AYx+1KpThBVIR9iAcAkBjGF+ZobIGblWQRExQoAICgkpMcGn5e91g3AzbEEA8AALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAltMp1g0A0FKj16ik/LCqamqVlZGqofndlJzkiHWzACBqKFAAi1lfVqGF63aqwlPr35bjStX8CQUaX5gTw5YBQPQwxANYyPqyCk1fsy2gOJGkSk+tpq/ZpvVlFTFqGQBEFwUKYBGNXqOF63bKtPKcb9vCdTvV6G0tAgASCwUKYBEl5Ydb9Jw0ZyRVeGpVUn44eo0CgBihQAEsoqomeHHSkTgAiGcUKIBFZGWkhjUOAOIZBQpgEUPzuynHlapgk4kdaprNMzS/WzSbBQAxQYECWERykkPzJxRIUosixffz/AkFrIcCwBYoUAALGV+YoxWTL5PbFTiM43alasXky1gHBYBtsFAbYDHjC3M0tsDNSrIAbI0CBbCg5CSHhp/XPdbNAICYYYgHAABYDgUKAACwHIZ4LI672gIA7CjiPSiLFi2Sw+FQUVGRf5sxRgsWLFBubq7S0tI0evRo7dixI9JNiTvryyo0cvFG3bLqbc18qlS3rHpbIxdv5IZxAICEF9ECZcuWLVq5cqUuvvjigO1LlizRsmXLtHz5cm3ZskVut1tjx45VTU1NJJsTV7irLQDAziJWoBw9elS33nqrVq1apa5du/q3G2P04IMPat68efrGN76hwsJCPf744/riiy/0xBNPRKo5cYW72gIA7C5iBcqdd96pr3zlK7rmmmsCtpeXl6uyslLjxo3zb3M6nRo1apQ2b97c6nvV1dWpuro64JHIuKstAMDuInKR7FNPPaVt27Zpy5YtLZ6rrKyUJGVnZwdsz87O1qefftrq+y1atEgLFy4Mf0MtirvaAgDsLuw9KPv27dPMmTO1Zs0apaYGv+uqwxE4E8UY02Kbz9y5c+XxePyPffv2hbXNVsNdbQEAdhf2HpStW7eqqqpKl19+uX9bY2OjXn/9dS1fvly7du2S1NSTkpNz8r4iVVVVLXpVfJxOp5xOZ7ibalm+u9pWempbvQ7FoaZ7s3BXWwBAogp7D8qYMWP0/vvvq7S01P8YPHiwbr31VpWWlqpv375yu93asGGD/zX19fXatGmTRowYEe7mxCXuagsAsLuw96BkZGSosLAwYFuXLl3UvXt3//aioiIVFxerf//+6t+/v4qLi5Wenq5JkyaFuzlxy3dX24XrdgZcMOt2pWr+hALuagsASGgxWUl29uzZOn78uGbMmKEjR45o2LBheuWVV5SRkRGL5lgWd7UFANiVwxgTd4tpVFdXy+VyyePxKDMzM9bNAQAA7RDK9zc3CwQAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDmdYt0AAABgHY1eo5Lyw6qqqVVWRqqG5ndTcpIj6u2gQAEAAJKk9WUVWrhupyo8tf5tOa5UzZ9QoPGFOVFtC0M8AABA68sqNH3NtoDiRJIqPbWavmab1pdVRLU9FCgAANhco9do4bqdMq0859u2cN1ONXpbi4gMChQAAGyupPxwi56T5oykCk+tSsoPR61NFCgAANhcVU3w4qQjceFAgQIAgM1lZaSGNS4cKFAAALC5ofndlONKVbDJxA41zeYZmt8tam2iQAEAwOaSkxyaP6FAkloUKb6f508oiOp6KBQoAABA4wtztGLyZXK7Aodx3K5UrZh8WdTXQWGhNgAAIKmpSBlb4LbESrJh70FZtGiRhgwZooyMDGVlZenrX/+6du3aFRBjjNGCBQuUm5urtLQ0jR49Wjt27Ah3UwAAQIiSkxwafl53fe3Snhp+XveYFCdSBAqUTZs26c4779Tbb7+tDRs26MSJExo3bpyOHTvmj1myZImWLVum5cuXa8uWLXK73Ro7dqxqamrC3RwAABCHHMaYiC4L9/nnnysrK0ubNm3SlVdeKWOMcnNzVVRUpDlz5kiS6urqlJ2drcWLF2vatGmnfc/q6mq5XC55PB5lZmZGsvkAACBMQvn+jvhFsh6PR5LUrVvT1KTy8nJVVlZq3Lhx/hin06lRo0Zp8+bNrb5HXV2dqqurAx4AACBxRbRAMcZo1qxZGjlypAoLCyVJlZWVkqTs7OyA2OzsbP9zp1q0aJFcLpf/kZeXF8lmAwCAGItogXLXXXfpvffe05NPPtniOYcj8KIbY0yLbT5z586Vx+PxP/bt2xeR9gIAAGuI2DTju+++W3/961/1+uuvq1evXv7tbrdbUlNPSk7OyTnVVVVVLXpVfJxOp5xOZ6SaCgAALCbsPSjGGN111136v//7P23cuFH5+fkBz+fn58vtdmvDhg3+bfX19dq0aZNGjBgR7uYAAIA4FPYelDvvvFNPPPGEnnvuOWVkZPivK3G5XEpLS5PD4VBRUZGKi4vVv39/9e/fX8XFxUpPT9ekSZPC3RwAABCHwl6grFixQpI0evTogO2rV6/WbbfdJkmaPXu2jh8/rhkzZujIkSMaNmyYXnnlFWVkZIS7OQAAIA5FfB2USGAdFAAA4o+l1kEBAAAIFQUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwHAoUAABgORQoAADAcihQAACA5VCgAAAAy6FAAQAAltMp1g2wkkavUUn5YVXV1CorI1VD87spOckR62aFzM55JErusB+O3fbjs7KHmBYoDz/8sJYuXaqKigoNHDhQDz74oL785S/HpC3ryyq0cN1OVXhq/dtyXKmaP6FA4wtzYtKmjrBzHomSO+yHY7f9+KzsI2ZDPE8//bSKioo0b948bd++XV/+8pd13XXXae/evVFvy/qyCk1fsy3ggJekSk+tpq/ZpvVlFVFvU0fYOY9EyR32w7HbfnxW9hKzAmXZsmWaOnWqvv/972vAgAF68MEHlZeXpxUrVkS1HY1eo4Xrdsq08pxv28J1O9XobS3COuycR6LkDvvh2G0/Piv7iUmBUl9fr61bt2rcuHEB28eNG6fNmze3iK+rq1N1dXXAI1xKyg+3qMabM5IqPLUqKT8ctt8ZCXbOI1Fyh/1w7LYfn5X9xKRAOXjwoBobG5WdnR2wPTs7W5WVlS3iFy1aJJfL5X/k5eWFrS1VNcEP+I7ExYqd80iU3GE/HLvtx2dlPzGdZuxwBF51bYxpsU2S5s6dK4/H43/s27cvbG3IykgNa1ys2DmPRMkd9sOx2358VvYTkwKlR48eSk5ObtFbUlVV1aJXRZKcTqcyMzMDHuEyNL+bclypCjZBzaGmK8SH5ncL2++MBDvnkSi5w344dtuPz8p+YlKgdO7cWZdffrk2bNgQsH3Dhg0aMWJEVNuSnOTQ/AkFktTiwPf9PH9CgeXn2Ns5j0TJHfbDsdt+fFb2E7MhnlmzZun3v/+9Hn30UX3wwQe65557tHfvXt1xxx1Rb8v4whytmHyZ3K7ArkG3K1UrJl8WN3Pr7ZxHouQO++HYbT8+K3txGGNiNifr4Ycf1pIlS1RRUaHCwkL98pe/1JVXXnna11VXV8vlcsnj8YR1uCdRVie0cx6Jkjvsh2O3/fis4lco398xLVA6KlIFCgAAiJxQvr+5WSAAALAcChQAAGA5FCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECAAAshwIFAABYDgUKAACwnE6xbkBH+Ba/ra6ujnFLAABAe/m+t9uziH1cFig1NTWSpLy8vBi3BAAAhKqmpkYul6vNmLi8F4/X69WBAweUkZEhhyO8N4iqrq5WXl6e9u3bZ7v7/Ng1d7vmLdk3d7vmLZG7HXO3Ut7GGNXU1Cg3N1dJSW1fZRKXPShJSUnq1atXRH9HZmZmzHdkrNg1d7vmLdk3d7vmLZG7HXO3St6n6znx4SJZAABgORQoAADAcihQTuF0OjV//nw5nc5YNyXq7Jq7XfOW7Ju7XfOWyN2Oucdr3nF5kSwAAEhs9KAAAADLoUABAACWQ4ECAAAshwIlghwOh5599tlYNyMm7JK7XfJsjV1zt2veErnbMfdY5k2BEkEVFRW67rrr/D//7Gc/04gRI5Senq6zzz47dg2LglNzl6QXXnhBw4YNU1pamnr06KFvfOMbMWpd+HRkH8+cOVOXX365nE6nLr300ug0NAI6enw/9thjuvjii5Wamiq326277rorCq0Nn+Z579mzR1OnTlV+fr7S0tJ03nnnaf78+aqvrw94TSLu8/bmLsX/PpdaHu9f/epXde655yo1NVU5OTn69re/rQMHDgS8JhH2e0fylsKzz+NyJdkz0djYKIfDcdoldsPB7XYH/FxfX6+JEydq+PDheuSRRyL++08Vy9z/8pe/6Pbbb1dxcbGuvvpqGWP0/vvvR+R3W30fG2P0ve99T++8847ee++9sLbH6rkvW7ZMv/jFL7R06VINGzZMtbW1+uSTT864LbHK+8MPP5TX69Xvfvc79evXT2VlZbr99tt17NgxPfDAA/64RNzn7c09Uvtciu3xftVVV+m///u/lZOTo/379+vee+/VzTffrM2bN/tjIrXfrZ532Pa5sbja2lpz9913m3POOcc4nU5zxRVXmJKSEv/zzz33nOnXr59JTU01o0ePNo899piRZI4cOWKMMWb16tXG5XKZdevWmQEDBpjk5GTzySefmLq6OnPfffeZ3Nxck56eboYOHWpee+01//v6Xrd+/Xpz4YUXmi5duphrr73WHDhwIKB9jzzyiCkoKDCdO3c2brfb3Hnnnf7nJJm1a9e2yMn33nbJvaGhwfTs2dP8/ve/T+g8m2vPPp4/f7656KKLbJP74cOHTVpamvnb3/6WkPvcZ8mSJSY/P7/V5xJ1nwfLvfk+NyYx/9abt93hcJj6+voWz82bN8/06NHDFnmfus/PhOULlB/84AcmNzfXvPjii2bHjh1mypQppmvXrubQoUOmvLzcpKSkmHvvvdd8+OGH5sknnzQ9e/ZssWNTUlLMiBEjzJtvvmk+/PBDc/ToUTNp0iQzYsQI8/rrr5uPP/7YLF261DidTvPRRx8FvO6aa64xW7ZsMVu3bjUDBgwwkyZN8rft4YcfNqmpqebBBx80u3btMiUlJeaXv/yl//kzLVASJfd33nnHSDKPPvqoufTSS43b7Tbjx483ZWVlCZVnqPt4/vz5pkePHrbJ/emnnzZOp9M8/vjjpmvXriYpKcmMHDnS/O1vf0uIvH3mzZtnLr/8clvt82C5N9/nvi/I1NRU8/jjjydU7ocOHTLf/OY3zRVXXNHq80OHDjWdOnVKuH3eWt6n7vOePXuaiRMnmr1797b6Hm2xdIFy9OhRk5KSYv70pz/5t9XX15vc3FyzZMkSM2fOHFNYWBjwmnnz5rXYsZJMaWmpP+bjjz82DofD7N+/P+C1Y8aMMXPnzg143ccff+x//qGHHjLZ2dn+n3Nzc828efOCtv9MvrwSKfcnn3zSSDLnnnuueeaZZ8y7775rbrnlFtO9e3ezd+/ehMmzufbs47lz5xqHw2Gb3BctWmRSUlJM//79TadOncyCBQvMmDFjzAUXXGCOHj0a93n72pCZmWlWrVrV6vOJus+D5e7b5xdccIF59tlnTadOnczAgQPNBRdcYOrq6uI+99mzZ5v09HQjyXzpS18yBw8ebPG6o0ePmqSkJHPuuef6tyVy3s33+fr1681bb73l/zuvq6sL+ntaY+lrUHbv3q2GhgZdccUV/m0pKSkaOnSoPvjgAx05ckRDhgwJeM3QoUNbvE/nzp118cUX+3/etm2bjDE6//zzA+Lq6urUvXt3/8/p6ek677zz/D/n5OSoqqpKklRVVaUDBw5ozJgxZ5ZkEImUu9frlSTNmzdPN910kyRp9erV6tWrl1auXJkweYbqyJEjMsbYJnev16uGhgbNmjVL06dP12233aYZM2bI7XbrjTfeiPu8Dxw4oPHjx2vixIn6/ve/32pMou7zYLn79vmvf/1rud1unThxQn/4wx80ZMgQvfbaa7r22mvjOvf77rtPU6dO1aeffqqFCxfqO9/5jp5//nk5HA5/zO7du+X1etWlSxf/tnjf523l3Xyfjxs3TpL05JNPyu12+/d5e1m6QDH/WYW/+c72bXc4HP7/tvaa5tLS0gLivF6vkpOTtXXrViUnJwfEnnXWWf7/T0lJCXjO9zt97xlJiZR7Tk6OJKmgoMC/zel0qm/fvqqoqPC//6m5xFueoUqkfdwevuOgb9++/t93zjnnqEePHtq7d29c533gwAFdddVVGj58uFauXBk0LhH3eVu5N//bP3TokCSpR48e/n3uyy9ec/flcv7552vAgAHKy8vT22+/reHDh7eZg297Iubd2vm++d95KCw9zbhfv37q3Lmz3njjDf+2hoYGvfvuuxowYIAuvPBCbdmyJeA177777mnfd9CgQWpsbFRVVZX69esX8Dj1iuVgMjIy1KdPH7366quhJdVOiZS7b5rdrl27AnLZs2ePLrnkkoTJM1TdunWTw+GwTe6+XoP6+nr/Pj98+LAOHjyonj17xm3e+/fv1+jRo3XZZZdp9erVbc6sSLR9frrcfft8165d/nPa+vXrdfDgQfXu3Tuucz+V70u/rq4uYHu/fv2UnJysY8eO+bclct7N97mP7++8d+/eIb+5pc2cOdPk5uaal156KeDiosOHD5tPPvnEpKSkmNmzZ5tdu3aZp59+2vTq1ctIMv/+97+NMcHHw2+99VbTp08f85e//MV88sknpqSkxPz85z83L7zwQtDXrV271jT/yB577DGTmppqfvWrX5mPPvrIbN261fz617/2P69Txu4+/fRTs337drNw4UJz1llnme3bt5vt27ebmpqahM995syZpmfPnubll182H374oZk6darJysoyhw8fTqg827OP//Wvf5nt27ebadOmmbPPPtucc845Zvny5aa0tDThc//a175mBg4caCZOnGiysrLM0KFDzXnnnWe+/e1vx2Xe+/fvN/369TNXX321+eyzz0xFRYX/0Vwi7vP25u7b52+++aaZPHmycTqd5txzz43r3N955x3zm9/8xmzfvt3s2bPHbNy40YwcOdKcd955pra2tsV+LywsNMnJyWb58uXmmWeeidvjvb15N9/n77//vrnhhhtMQUFBqzOc2mL5AuX48ePm7rvvNj169GhzepbT6TSjR482K1asMJLM8ePHjTHBd2x9fb35yU9+Yvr06WNSUlKM2+02N954o3nvvfeCvu7UHWuMMb/97W/NBRdcYFJSUkxOTo65++67/c+degKfMmWKkdTi0XxaWKLmXl9fb374wx+arKwsk5GRYa655hr/LJ5EyrM9+3jUqFGtxnTu3Dnhc/d4POZ73/uecblcxul0ms6dO8f1PvddhNjao7lE3Oftzd23z88++2zTtWtX07dvX9OtW7e43u/vvfeeueqqq/x59OnTx9xxxx3ms88+C3i/YPt98ODBCZ13833erVs3c+ONNybeLJ6O+OlPf2p69eoV62bEhF1yt0uerbFr7nbN2xhyt2Puds37VJa+SLY9Hn74YQ0ZMkTdu3fXm2++qaVLl8blMsodYZfc7ZJna+yau13zlsjdjrnbNe/TinWFdKaKiopMTk6OcTqdpn///ub+++83DQ0NsW5WVNgld7vk2Rq75m7XvI0hdzvmbte8T8dhTJA5UAAAADFi6WnGAADAnihQAACA5VCgAAAAy6FAAQAAlkOBAgAALIcCBUBc2LNnjxwOh0pLS2PdFABRQIECAAAshwIFAABYDgUKgJhYv369Ro4cqbPPPlvdu3fXDTfcoN27d/ufLykp0aBBg5SamqrBgwdr+/btMWwtgGijQAEQE8eOHdOsWbO0ZcsWvfrqq0pKStKNN94or9erY8eO6YYbbtAFF1ygrVu3asGCBbr33ntj3WQAURT3NwsEEJ9uuummgJ8feeQRZWVlaefOndq8ebMaGxv16KOPKj09XQMHDtRnn32m6dOnx6i1AKKNHhQAMbF7925NmjRJffv2VWZmpvLz8yVJe/fu1QcffKBLLrlE6enp/vjhw4fHqqkAYoAeFAAxMWHCBOXl5WnVqlXKzc2V1+tVYWGh6uvrxT1MAdCDAiDqDh06pA8++EA//vGPNWbMGA0YMEBHjhzxP19QUKB//vOfOn78uH/b22+/HYumAogRChQAUde1a1d1795dK1eu1Mcff6yNGzdq1qxZ/ucnTZqkpKQkTZ06VTt37tSLL76oBx54IIYtBhBtFCgAoi4pKUlPPfWUtm7dqsLCQt1zzz1aunSp//mzzjpL69at086dOzVo0CDNmzdPixcvjmGLAUSbwzDYCwAALIYeFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFgOBQoAALAcChQAAGA5FCgAAMByKFAAAIDl/H/2r49n1G0zmgAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"notlar['final'].plot(marker=\"o\",ls=\"None\")\n",
"plt.axhline(y = notlar['final'].mean(), ls=\"--\",color=\"red\")\n",
"plt.axhline(y = notlar['final'].median(), ls=\"--\",color=\"green\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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dtT3v//9OLUuclqzj6dPn67LLrtMTqdTl1xySWwaGgWtPb5XrVqliy66SBkZGXK73brzzjtj0NrIOT3vTz/9VFOmTFFhYaEyMzPVs2dPzZ49W/X19QE/k4z7PNTcpcTf51LT4/073/mOzjvvPGVkZCgvL08//OEPdfDgwYCfSYb93pq8pcjs84RcSfbraGhokMPhOOsSu5HgdrsDntfX12v8+PEaMmSIHn300aj/+2eKZ+5//etfdeutt6q0tFRXXnmljDF6//33o/JvW30fG2N0yy236J133tF7770X0fZYPfdFixbp17/+tRYuXKjBgwertrZWn3zyydduS7zy/vDDD+X1evXII4+oV69eKisr06233qpjx47poYce8scl4z4PNfdo7XMpvsf7FVdcoZ/97GfKy8vTgQMHdO+99+qGG27Qpk2b/DHR2u9Wzzti+9xYXG1trbnrrrtMp06djNPpNJdffrnZsmWL//XnnnvO9OrVy2RkZJgRI0aYVatWGUnmyJEjxhhjVq5caVwul1m7dq3p27evSU1NNZ988ompq6sz9913n8nPzzdZWVlm0KBB5rXXXvO/r+/n1q1bZy644ALTtm1bc/XVV5uDBw8GtO/RRx81RUVFJj093bjdbnPHHXf4X5Nk1qxZ0yQn33vbJfcTJ06YLl26mN///vdJnefpQtnHs2fPNhdeeKFtcj98+LDJzMw0r7zySlLuc58FCxaYwsLCZl9L1n0eLPfT97kxyfm7fnrbHQ6Hqa+vb/LarFmzTMeOHW2R95n7/OuwfIHyk5/8xOTn55sXX3zR7Nq1y0yePNm0a9fOHDp0yJSXl5u0tDRz7733mg8//NA8+eSTpkuXLk12bFpamhk6dKh56623zIcffmiOHj1qJk6caIYOHWreeOMN8/HHH5uFCxcap9NpPvroo4Cfu+qqq8zWrVvNtm3bTN++fc3EiRP9bVu6dKnJyMgwixcvNnv27DFbtmwxv/nNb/yvf90CJVlyf+edd4wk89hjj5lLLrnEuN1uM2bMGFNWVpZUeYa7j2fPnm06duxom9yffvpp43Q6zeOPP27atWtnUlJSzLBhw8wrr7ySFHn7zJo1y1x22WW22ufBcj99n/u+IDMyMszjjz+eVLkfOnTI/OAHPzCXX355s68PGjTItGnTJun2eXN5n7nPu3TpYsaPH2/27dvX7Hu0xNIFytGjR01aWpr505/+5N9WX19v8vPzzYIFC8yMGTNMcXFxwM/MmjWryY6VZHbu3OmP+fjjj43D4TAHDhwI+NmRI0eamTNnBvzcxx9/7H/94YcfNrm5uf7n+fn5ZtasWUHb/3W+vJIp9yeffNJIMuedd5555plnzLvvvmsmTJhgOnToYPbt25c0eZ4ulH08c+ZM43A4bJP7vHnzTFpamundu7dp06aNmTNnjhk5cqTp06ePOXr0aMLn7WtDTk6OWbFiRbOvJ+s+D5a7b5/36dPHPPvss6ZNmzamX79+pk+fPqauri7hc7///vtNVlaWkWS+8Y1vmC+++KLJzx09etSkpKSY8847z78tmfM+fZ+vW7fOvP322/7f87q6uqD/TnMsfQ3K3r17deLECV1++eX+bWlpaRo0aJA++OADHTlyRAMHDgz4mUGDBjV5n/T0dF100UX+59u3b5cxRueff35AXF1dnTp06OB/npWVpZ49e/qf5+XlqaqqSpJUVVWlgwcPauTIkV8vySCSKXev1ytJmjVrlq6//npJ0sqVK9W1a1ctX748afIM15EjR2SMsU3uXq9XJ06c0D333KOpU6fqpptu0rRp0+R2u/Xmm28mfN4HDx7UmDFjNH78eP34xz9uNiZZ93mw3H37/Le//a3cbrdOnjypP/zhDxo4cKBee+01XX311Qmd+3333acpU6bos88+09y5c/WjH/1Izz//vBwOhz9m79698nq9atu2rX9bou/zlvI+fZ+PHj1akvTkk0/K7Xb793moLF2gmK9W4T99Z/u2OxwO/3+b+5nTZWZmBsR5vV6lpqZq27ZtSk1NDYg955xz/P+flpYW8Jrv3/S9ZzQlU+55eXmSpKKiIv82p9OpHj16qKKiwv/+Z+aSaHmGK5n2cSh8x0GPHj38/16nTp3UsWNH7du3L6HzPnjwoK644goNGTJEy5cvDxqXjPu8pdxP/90/dOiQJKljx47+fe7LL1Fz9+Vy/vnnq2/fviooKNDmzZs1ZMiQFnPwbU/GvJs735/+ex4OS08z7tWrl9LT0/Xmm2/6t504cULvvvuu+vbtqwsuuEBbt24N+Jl33333rO/bv39/NTQ0qKqqSr169Qp4nHnFcjDZ2dnq3r27Xn311fCSClEy5e6bZrdnz56AXD799FNdfPHFSZNnuNq3by+Hw2Gb3H29BvX19f59fvjwYX3xxRfq0qVLwuZ94MABjRgxQpdeeqlWrlzZ4syKZNvnZ8vdt8/37NnjP6etW7dOX3zxhbp165bQuZ/J96VfV1cXsL1Xr15KTU3VsWPH/NuSOe/T97mP7/e8W7duYb+5pU2fPt3k5+ebl156KeDiosOHD5tPPvnEpKWlmfvvv9/s2bPHPP3006Zr165GkvnXv/5ljAk+Hn7jjTea7t27m7/+9a/mk08+MVu2bDH/8R//YV544YWgP7dmzRpz+ke2atUqk5GRYf7zP//TfPTRR2bbtm3mt7/9rf91nTF299lnn5kdO3aYuXPnmnPOOcfs2LHD7Nixw9TU1CR97tOnTzddunQxf//7382HH35opkyZYjp37mwOHz6cVHmGso//93//1+zYscPcdttt5txzzzWdOnUyS5YsMTt37kz63L/73e+afv36mfHjx5vOnTubQYMGmZ49e5of/vCHCZn3gQMHTK9evcyVV15pPv/8c1NRUeF/nC4Z93moufv2+VtvvWUmTZpknE6nOe+88xI693feecf813/9l9mxY4f59NNPzYYNG8ywYcNMz549TW1tbZP9XlxcbFJTU82SJUvMM888k7DHe6h5n77P33//fTN27FhTVFTU7Aynlli+QDl+/Li56667TMeOHVucnuV0Os2IESPMsmXLjCRz/PhxY0zwHVtfX29+8YtfmO7du5u0tDTjdrvNddddZ957772gP3fmjjXGmN/97nemT58+Ji0tzeTl5Zm77rrL/9qZJ/DJkycbSU0ep08LS9bc6+vrzU9/+lPTuXNnk52dba666ir/LJ5kyjOUfTx8+PBmY9LT05M+d4/HY2655RbjcrmM0+k06enpCb3PfRchNvc4XTLu81Bz9+3zc88917Rr18706NHDtG/fPqH3+3vvvWeuuOIKfx7du3c3t99+u/n8888D3i/Yfh8wYEBS5336Pm/fvr257rrrkm8WT2v88pe/NF27do13M+LCLrnbJc/m2DV3u+ZtDLnbMXe75n0mS18kG4qlS5dq4MCB6tChg9566y0tXLgwIZdRbg275G6XPJtj19ztmrdE7nbM3a55n1W8K6Svq6SkxOTl5Rmn02l69+5tHnzwQXPixIl4Nysm7JK7XfJsjl1zt2vexpC7HXO3a95n4zAmyBwoAACAOLH0NGMAAGBPFCgAAMByKFAAAIDlUKAAAADLoUABAACWQ4ECICF8+umncjgc2rlzZ7ybAiAGKFAAAIDlUKAAAADLoUABEBfr1q3TsGHDdO6556pDhw4aO3as9u7d6399y5Yt6t+/vzIyMjRgwADt2LEjjq0FEGsUKADi4tixY7rnnnu0detWvfrqq0pJSdF1110nr9erY8eOaezYserTp4+2bdumOXPm6N577413kwHEUMLfLBBAYrr++usDnj/66KPq3Lmzdu/erU2bNqmhoUGPPfaYsrKy1K9fP33++eeaOnVqnFoLINboQQEQF3v37tXEiRPVo0cP5eTkqLCwUJK0b98+ffDBB7r44ouVlZXljx8yZEi8mgogDuhBARAX48aNU0FBgVasWKH8/Hx5vV4VFxervr5e3MMUAD0oAGLu0KFD+uCDD/Tzn/9cI0eOVN++fXXkyBH/60VFRfrHP/6h48eP+7dt3rw5Hk0FECcUKABirl27durQoYOWL1+ujz/+WBs2bNA999zjf33ixIlKSUnRlClTtHv3br344ot66KGH4thiALFGgQIg5lJSUvTUU09p27ZtKi4u1t13362FCxf6Xz/nnHO0du1a7d69W/3799esWbM0f/78OLYYQKw5DIO9AADAYuhBAQAAlkOBAgAALIcCBQAAWA4FCgAAsBwKFAAAYDkUKAAAwHIoUAAAgOVQoAAAAMuhQAEAAJZDgQIAACyHAgUAAFjO/wdznyLtQe4z+AAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"notlar['final'].plot(marker=\"o\",ls=\"None\")\n",
"plt.axhline(y = notlar[notlar['final'] != 0.]['final'].mean(), ls=\"--\",color=\"red\")\n",
"plt.axhline(y = notlar[notlar['final'] != 0.]['final'].median(), ls=\"--\",color=\"green\")\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAjsAAAGwCAYAAABPSaTdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAt3klEQVR4nO3df3RU9Z3/8deQwJCEZJQEJqREmJRY0aBGEJRwIP4g7oK2qEttQPHX2bWiQKQK0qpFVxNhS/RIFQvloFZB6ypd+sslqxgUvgJGYxE9CBIgrWaTAE4I0USS+/0DmWVIAvk1c+985vk4Z/7I596ZvPO5nDMvPp/7+VyXZVmWAAAADNXL7gIAAABCibADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGC0WLsLcIKWlhZ98cUXSkxMlMvlsrscAADQAZZl6fDhw0pLS1OvXu2P3xB2JH3xxRdKT0+3uwwAANAFlZWVGjx4cLvHCTuSEhMTJR3rrKSkJJurAQAAHVFXV6f09PTA93h7CDtSYOoqKSmJsAMAQIQ53S0o3KAMAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEazNexs3LhR11xzjdLS0uRyufSHP/wh6LhlWVq4cKHS0tIUFxen3Nxc7dixI+icxsZGzZo1SykpKUpISNAPf/hD/f3vfw/jXwEAQHjtqanXhp3Vqqg9Qh0dYOuzsY4cOaILLrhAt956q66//vpWxxcvXqzi4mI999xzOvvss/Xoo49q4sSJ2rlzZ+ChXwUFBfrjH/+ol19+WcnJyfrZz36mq6++WmVlZYqJiQn3nwQAQMh81dCk2WvKtXFXTaBtfOYALc3Plie+d9TV0VEuy7Isu4uQjj3Ea+3atZoyZYqkY6M6aWlpKigo0Pz58yUdG8Xxer1atGiR7rjjDvn9fg0YMEC/+93vdMMNN0iSvvjiC6Wnp+svf/mLrrrqqg797rq6Onk8Hvn9fh4ECgBwrBkrt2rT7lo1n/DVHeNyKWdYil64fXTU1dHR72/H3rNTUVGhqqoq5eXlBdrcbrcmTJigzZs3S5LKysr07bffBp2TlpamrKyswDltaWxsVF1dXdALAAAn21NTr427aoIChiQ1W5Y27qoJ21SSU+roDMeGnaqqKkmS1+sNavd6vYFjVVVV6tOnj84888x2z2lLUVGRPB5P4JWent7D1QMA0LP2HWw45fG9B8ITMpxSR2c4Nuwc53K5gn62LKtV28lOd86CBQvk9/sDr8rKyh6pFQCAUBnSP/6Ux4cmJ0RVHZ3h2LCTmpoqSa1GaKqrqwOjPampqWpqatKhQ4faPactbrdbSUlJQS8AAJwsY0A/jc8coJiT/jMf43JpfOYA+VLCEzKcUkdnODbs+Hw+paamqqSkJNDW1NSk0tJSjR07VpI0cuRI9e7dO+icL7/8Uh9//HHgHAAATLE0P1s5w1KC2nKGpWhpfnbIf/eJy8ztrKMrbF16Xl9fr927dwd+rqioUHl5ufr376+zzjpLBQUFKiwsVGZmpjIzM1VYWKj4+HhNmzZNkuTxeHT77bfrZz/7mZKTk9W/f3/de++9GjFihK688kq7/iwAAELCE99bL9w+WhW1R7T3wBENTU4I+UjKqZaZH2xoClsd3WHr0vO3335bl112Wav2m2++Wc8995wsy9LDDz+s3/zmNzp06JDGjBmjp59+WllZWYFzv/nmG913331avXq1vv76a11xxRV65plnOnXTMUvPAQBom1OWmbelo9/fjtlnx06EHQAAWttTU6/Ll5S2e3zDvbm2juhE/D47AADAXpG4zLwthB0AANCmSFxm3hbCDgAAUaQzD++MxGXmbbF1NRYAAAiPrj68c2l+tmat+TDofU5eZt4WblAWNygDAMzX3VVV4Vzu3lEd/f5mZAcAAMMdf3jnyU58eOfpAowvxTkhp7O4ZwcAAMOZsqqqqwg7AAAYzpRVVV1F2AEAwHCmrKrqKsIOAABh0Jkl36EQaQ/v7EncoAwAQAh1dcl3T7PjIaJOwcgOAAAhNHtNuTbtrg1q27S7VrPWfGhLPb6UBF32g4FRE3Qkwg4AACFzfMl380lb2p245BuhR9gBACBEon3Jt1MQdgAACJFoX/LtFIQdAABCJNqXfDsFYQcAEHXCuQw8mpd8OwVLzwEAUcOOZeDRvOTbKRjZAQBEDTuXgUfjkm+nIOwAAKICy8CjF2EHABAVWAYevQg7AICowDLw6EXYAQBEBZaBRy/CDgAgarAMPDqx9BwAEDVYBh6dCDsAgKjjSyHkRBPCDgAA6JI9NfXad7DB8SNkhB0AANApduxE3R3coAwAADrFzp2ou4KwAwCICOF8eCfaF4k7UTONBQBwtEibMjFdR3aidtr9O4zsAAAcLdKmTEwXiTtRE3YAAI4ViVMmpovEnagJOwAAx+Lhnc5x4j1TkbYTNffsAAAcKxKnTExzqnumDjY0RcRO1IzsAAAcKxKnTExzqnumfCkJuuwHAx1/HQg7AABHC8WUCcvYO8aUe6aYxgIAOFpPPryTZeydE4nLzNvCyA4AICL0xJQJy9g7x5R7pgg7AICoYMqUTDiZcs8UYQcAEBVYxt41kbbMvC3cswMAiAqmTMmEW0/eM2UXwg4AICocn5LZtLs2aCorxuVSzrCUiPsCDzdfSuSFnOOYxgIARA0TpmTQeYzsAACihglTMug8wg4AIOpE8pQMOo+wAwCIOntq6rXvYAMjO2HghL4m7AAAogY7KIePk/qaG5QBAFGDHZTDx0l9TdgBgAjHQy07hh2Uw8dpfc00FgBEKCdNE0QCUx5qGQmc1teM7ABAhHLSNEEkYAfl8HFaXxN2ACACOW2aIBKY8lDLSOC0vibsAEAE4qGWXcMOyuHjpL7mnh0AiEBOmyaIFOygHD5O6mvCDgBEIB5q2T3soBw+TuhrprEAIEI5aZoAcDJHh52jR4/qgQcekM/nU1xcnDIyMvTII4+opaUlcI5lWVq4cKHS0tIUFxen3Nxc7dixw8aqASA8jk8TbLg3V6tuvVgb7s3VC7ePZtk5cBJHT2MtWrRIzz77rJ5//nmdd955ev/993XrrbfK4/Fozpw5kqTFixeruLhYzz33nM4++2w9+uijmjhxonbu3KnExESb/wIACD0nTBMATuayrJPWLTrI1VdfLa/Xq5UrVwbarr/+esXHx+t3v/udLMtSWlqaCgoKNH/+fElSY2OjvF6vFi1apDvuuKPNz21sbFRjY2Pg57q6OqWnp8vv9yspKSm0fxQAwJGc8MBKdE5dXZ08Hs9pv78dPY01btw4vfnmm/rss88kSR999JHeffddTZo0SZJUUVGhqqoq5eXlBd7jdrs1YcIEbd68ud3PLSoqksfjCbzS09ND+4cAABzrq4YmzVi5VZcvKdWtq7bpsl+9rRkrt8rf8K3dpaGHODrszJ8/X/n5+TrnnHPUu3dvZWdnq6CgQPn5+ZKkqqoqSZLX6w16n9frDRxry4IFC+T3+wOvysrK0P0RAABHYydq8zn6np1XXnlFL774olavXq3zzjtP5eXlKigoUFpamm6++ebAea6Tdmi0LKtV24ncbrfcbnfI6gYARIbjO1Gf7MSdqJnSinyODjv33Xef7r//fv3kJz+RJI0YMUL79u1TUVGRbr75ZqWmpko6NsIzaNCgwPuqq6tbjfYAALrG5HtZnPbAyu4w+Tp1l6PDTkNDg3r1Cp5pi4mJCSw99/l8Sk1NVUlJibKzj+0r0dTUpNLSUi1atCjs9QKASaLhqeom7EQdDdepuxx9z84111yjxx57TH/+85+1d+9erV27VsXFxbr22mslHZu+KigoUGFhodauXauPP/5Yt9xyi+Lj4zVt2jSbqweAyBYN97I47YGVXREN16m7HD2ys3TpUj344IOaOXOmqqurlZaWpjvuuEMPPfRQ4Jx58+bp66+/1syZM3Xo0CGNGTNG69evZ48dAOiGSLmXpSembpbmZ2vWmg+D/t5I2Yk6Uq6T3Ry9z064dHSdPgBEiw07q3Xrqm3tHl9168W67AcDw1hRsFBM3TjhgZWd5fTrFGpG7LMDALCH0+9lCcXUjS8lQZf9YGDEBB3J+dfJKQg7AIBWnHwvy/Gpm+aTJiZOnLqJFk6+Tk5C2AGACLenpl4bdlb3+Je8U5+q3pHl4qcTqj6z43c69To5iaNvUAYAtC/US46PP1XdafeydGfqxo5l2tF6nZyEkR0AiFDhWnLstHtZujN1Y8cy7Wi9Tk5C2AGACBTJ9630xHROV6Zu7OizSL5OJmEaCwAiUCQ+5qAnp3O6MnVjR59F4nUyESM7ABCBInHJsd3Lxe3os0i8TiYi7ABAG+xYrdMZkbbk2AnTOXb0WaRdJ1MRdgDgBF81NGnGyq26fEmpbl21TZf96m3NWLlV/oZv7S6tlUhactwTy8V7gh19FknXyVQ8LkI8LgLA/5mxcqs27a4NGoGIcbmUMyxFL9w+2sbK2hcJS4731NTr8iWl7R7fcG9uWGu3o88i4TpFmo5+f3ODMgB8J1IfquhLcf6X5/HpnPaCZLjrt6PPIuE6mYppLAD4jlOmWkzFdA7swsgOAHyHlTOhxU6/sAthBwC+47SpFlMxnYNwYxoLAE7AVAtgHkZ2AOAETLUA5iHsAEAbmGoBzME0FgAAMBphBwAAGI2wAwAAjEbYAQAARuMGZQAAumFPTb32HWxg5Z6DEXYAAOiCrxqaNHtNedDz1MZnDtDS/Gx54nvbWBlOxjQWAABdMHtNuTbtrg1q27S7VrPWfGhTRWgPYQcAumFPTb027KxWRe2RU7bBLHtq6rVxV03QY0UkqdmytHFXDdfeYZjGAoAuaGsK49KMZLlc0ubPDwTamNYw076DDac8vvfAEe7fcRBGdgCgC9qawvh/ew4EBR2JaQ1TDekff8rjQ5MJOk5C2AGATmpvCqMtTGuYKWNAP43PHKAYlyuoPcbl0vjMAYzqOAxhBwA66XRTGG3Ze4CwY5ql+dnKGZYS1JYzLEVL87Ntqgjt4Z4dAOik001htIVpDfN44nvrhdtHq6L2iPYeOMI+Ow5G2AGATjo+hbFpd+1pp7JiXC7lDEvhS9BgvhRCjtMxjQUAXdDWFMalGcka+/3koLZInNZg6TxMw8gOAHTBqaYwInVagx2BYSqXZXVgOYHh6urq5PF45Pf7lZSUZHc5AGCLGSu3tpqaOz4N98Lto22sDGhbR7+/mcYCABs4baqIHYFhMqaxACCMnDpVxI7AMBkjOwAQRk59eCQ7AsNkhB0ACBMnTxWxIzBMRtgBgDDpyFSRndgRGKbinh0ACBOnTxWxIzBMRdgBgDBpb+dlp+2yzI7AMA3TWAAQRkwVAeHHyA4AhBFTRUD4EXYAwAZMFQHhwzQWAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIzm+LDzj3/8QzfeeKOSk5MVHx+vCy+8UGVlZYHjlmVp4cKFSktLU1xcnHJzc7Vjxw4bKwYAAE7i6LBz6NAh5eTkqHfv3vrrX/+qTz75REuWLNEZZ5wROGfx4sUqLi7Wr3/9a23btk2pqamaOHGiDh8+bF/hAADAMVyWZVl2F9Ge+++/X5s2bdI777zT5nHLspSWlqaCggLNnz9fktTY2Civ16tFixbpjjvuaPN9jY2NamxsDPxcV1en9PR0+f1+JSUl9fwfAgAAelxdXZ08Hs9pv78dPbKzbt06jRo1SlOnTtXAgQOVnZ2tFStWBI5XVFSoqqpKeXl5gTa3260JEyZo8+bN7X5uUVGRPB5P4JWenh7SvwMAIsmemnpt2FmtitojdpcC9AhHh509e/Zo2bJlyszM1H//93/rpz/9qWbPnq0XXnhBklRVVSVJ8nq9Qe/zer2BY21ZsGCB/H5/4FVZWRm6PwIAIsRXDU2asXKrLl9SqltXbdNlv3pbM1Zulb/hW7tLA7ol1u4CTqWlpUWjRo1SYWGhJCk7O1s7duzQsmXLNGPGjMB5Lpcr6H2WZbVqO5Hb7Zbb7Q5N0QAQoWavKdem3bVBbZt212rWmg/1wu2jbaoK6D5Hj+wMGjRI5557blDb8OHDtX//fklSamqqJLUaxamurm412gMAaN+emnpt3FWj5pNu42y2LG3cVcOUFiKao8NOTk6Odu7cGdT22WefaciQIZIkn8+n1NRUlZSUBI43NTWptLRUY8eODWutABDJ9h1sOOXxvQcIO4hcjp7GuueeezR27FgVFhbqxz/+sbZu3arly5dr+fLlko5NXxUUFKiwsFCZmZnKzMxUYWGh4uPjNW3aNJurB4DIMaR//CmPD01OCFMlQM9zdNi5+OKLtXbtWi1YsECPPPKIfD6fnnzySU2fPj1wzrx58/T1119r5syZOnTokMaMGaP169crMTHRxsoBILJkDOin8ZkDtGl3bdBUVozLpZxhKfKlEHYQuRy9z064dHSdPgCYzN/wrWat+VAbd9UE2sZnDtDS/Gx54nvbWBnQto5+fzt6ZAcAED6e+N564fbRqqg9or0HjmhocgIjOjACYQcAEMSXQsiBWRy9GgsAAKC7CDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKMRdgAAgNEIOwAAwGiEHQAAYDTCDgAAMBphBwAAGK1DTz3Pzs6Wy+Xq0Ad+8MEH3SoIAACgJ3Uo7EyZMiXEZQAAAISGy7Isy+4i7FZXVyePxyO/36+kpCS7ywEAAB3Q0e9v7tkBAABG69A01omam5v1xBNP6Pe//73279+vpqamoOMHDx7sseIAAAC6q9MjOw8//LCKi4v14x//WH6/X3PnztV1112nXr16aeHChSEoEQAAoOs6HXZeeuklrVixQvfee69iY2OVn5+v3/72t3rooYf03nvvhaJGAACALut02KmqqtKIESMkSf369ZPf75ckXX311frzn//cs9UBAAB0U6fDzuDBg/Xll19KkoYNG6b169dLkrZt2ya3292z1QEAAHRTp8POtddeqzfffFOSNGfOHD344IPKzMzUjBkzdNttt/V4gQAAAN3R7X123nvvPW3evFnDhg3TD3/4w56qK6zYZwcAgMjT0e/vTi89P9kll1yiSy65pLsfAwAAEBJdCjufffaZ3n77bVVXV6ulpSXo2EMPPdQjhQEAAPSEToedFStW6M4771RKSopSU1ODHhDqcrkIOwAAwFE6HXYeffRRPfbYY5o/f34o6gEAAOhRnV6NdejQIU2dOjUUtQAAAPS4ToedqVOnBvbWAQAAcLpOT2MNGzZMDz74oN577z2NGDFCvXv3Djo+e/bsHisOAACguzq9z47P52v/w1wu7dmzp9tFhRv77AAAEHlCts9ORUVFtwoDAAAIp07fswMAABBJOjSyM3fuXP37v/+7EhISNHfu3FOeW1xc3COFAQAA9IQOhZ3nnntOP//5z5WQkKAPP/yw3fNO3GAQAADACToUdr766qvAYyH27dunbdu2KTk5OaSFAQAA9IQO3bNz5plnBm5M3rt3b6vnYQEAADhVh0Z2rr/+ek2YMEGDBg2Sy+XSqFGjFBMT0+a5kbj0HAAAmKtDYWf58uW67rrrtHv3bs2ePVv/+q//qsTExFDXBgAA0G0d3mfnn/7pnyRJZWVlmjNnDmEHgNH21NRr38EGDU1OkC8lwe5yAHRDpzcVXLVqVSjqAABH+KqhSbPXlGvjrppA2/jMAVqany1PfO9TvBOAU7GpIACcYPaacm3aXRvUtml3rWataX/bDQDORtgBgO/sqanXxl01aj7pkYHNlqWNu2pUUXvEpsoAdAdhBwC+s+9gwymP7z1A2AEiEWEHAL4zpH/8KY8PTeZGZSASEXYA4DsZA/ppfOYAxZz06JsYl0vjMwewKguIUIQdADjB0vxs5QxLCWrLGZaipfnZNlUEoLs6vfQcAEzmie+tF24frYraI9p74Aj77AAGIOwAQBt8KYQcwBRMYwEAAKMRdgAAgNEIOwAAwGiEHQAAYLSICjtFRUVyuVwqKCgItFmWpYULFyotLU1xcXHKzc3Vjh077CsSAE6yp6ZeG3ZW87gJwCYRsxpr27ZtWr58uc4///yg9sWLF6u4uFjPPfeczj77bD366KOaOHGidu7cqcTERJuqBQCeoA44RUSM7NTX12v69OlasWKFzjzzzEC7ZVl68skn9Ytf/ELXXXedsrKy9Pzzz6uhoUGrV6+2sWIA4AnqgFNERNi56667NHnyZF155ZVB7RUVFaqqqlJeXl6gze12a8KECdq8eXO7n9fY2Ki6urqgFwD0JJ6gDjiH48POyy+/rA8++EBFRUWtjlVVVUmSvF5vULvX6w0ca0tRUZE8Hk/glZ6e3rNFA4h6PEEdcA5Hh53KykrNmTNHL774ovr27dvuea6THtpnWVarthMtWLBAfr8/8KqsrOyxmgFA4gnqgJM4OuyUlZWpurpaI0eOVGxsrGJjY1VaWqqnnnpKsbGxgRGdk0dxqqurW432nMjtdispKSnoBQA9iSeoA87h6LBzxRVXaPv27SovLw+8Ro0apenTp6u8vFwZGRlKTU1VSUlJ4D1NTU0qLS3V2LFjbawcAHiCOuAUjl56npiYqKysrKC2hIQEJScnB9oLCgpUWFiozMxMZWZmqrCwUPHx8Zo2bZodJQNAAE9QB5zB0WGnI+bNm6evv/5aM2fO1KFDhzRmzBitX7+ePXYAOAZPUAfs5bKsk9ZFRqG6ujp5PB75/X7u3wEAIEJ09Pvb0ffsAAAAdBdhBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKMRdgAAgNEIOwAAwGiEHQAAYDTCDgAAMBphBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKMRdgAAgNFi7S4AAEJpT0299h1s0NDkBPlSEuwuB4ANCDsAjPRVQ5NmrynXxl01gbbxmQO0ND9bnvjeNlYGINyYxgJgpNlryrVpd21Q26bdtZq15kObKgJgF8IOAOPsqanXxl01arasoPZmy9LGXTWqqD1iU2UA7EDYAWCcfQcbTnl87wHCDhBNCDsAjDOkf/wpjw9N5kZlIJoQdgAYJ2NAP43PHKAYlyuoPcbl0vjMAazKAqIMYQeAkZbmZytnWEpQW86wFC3Nz7apIgB2Yek5ACN54nvrhdtHq6L2iPYeOMI+O0AUI+wAMJovhZADRDtHT2MVFRXp4osvVmJiogYOHKgpU6Zo586dQedYlqWFCxcqLS1NcXFxys3N1Y4dO2yqGAAAOI2jw05paanuuusuvffeeyopKdHRo0eVl5enI0f+b9no4sWLVVxcrF//+tfatm2bUlNTNXHiRB0+fNjGygEAgFO4LOukXbccrKamRgMHDlRpaanGjx8vy7KUlpamgoICzZ8/X5LU2Ngor9erRYsW6Y477ujQ59bV1cnj8cjv9yspKSmUfwIAAOghHf3+dvTIzsn8fr8kqX///pKkiooKVVVVKS8vL3CO2+3WhAkTtHnz5nY/p7GxUXV1dUEvAABgpogJO5Zlae7cuRo3bpyysrIkSVVVVZIkr9cbdK7X6w0ca0tRUZE8Hk/glZ6eHrrCAQCArSIm7Nx9993629/+pjVr1rQ65jpp4zDLslq1nWjBggXy+/2BV2VlZY/XCwAAnCEilp7PmjVL69at08aNGzV48OBAe2pqqqRjIzyDBg0KtFdXV7ca7TmR2+2W2+0OXcEAAMAxHD2yY1mW7r77br3++ut666235PP5go77fD6lpqaqpKQk0NbU1KTS0lKNHTs23OUCAAAHcvTIzl133aXVq1frv/7rv5SYmBi4D8fj8SguLk4ul0sFBQUqLCxUZmamMjMzVVhYqPj4eE2bNs3m6gEAgBM4OuwsW7ZMkpSbmxvUvmrVKt1yyy2SpHnz5unrr7/WzJkzdejQIY0ZM0br169XYmJimKsFAABOFFH77IQK++wAABB5jNxnBwAAoLMIOwAAwGiEHQAAYDTCDgAAMBphBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKMRdgAAgNEIOwAAwGiEHQAAYDTCDgAAMBphBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKMRdgAAgNEIOwAAwGiEHQAAYDTCDgAAMBphBwAAGI2wAwAAjEbYAQAARiPsAAAAoxkTdp555hn5fD717dtXI0eO1DvvvGN3SXpl634VvPKhXn2/0u5SAMAx9tTUa8POalXUHrG7lIjVVh/Sr+1zWZZl2V1Ed73yyiu66aab9MwzzygnJ0e/+c1v9Nvf/laffPKJzjrrrNO+v66uTh6PR36/X0lJSd2uZ/vfv9K1z2zW0Zb/69rYXi6tuytH537P0+3PB4BI9FVDk2avKdfGXTWBtvGZA7Q0P1ue+N42VhY52urDSzOS5XJJmz8/EGiLln7t6Pe3EWFnzJgxuuiii7Rs2bJA2/DhwzVlyhQVFRWd9v09HXaG/fwvQUHnuNheLu0unNTtzweASDRj5VZt2l2r5hO+dmJcLuUMS9ELt4+2sbLI0VYftiVa+rWj398RP43V1NSksrIy5eXlBbXn5eVp8+bNbb6nsbFRdXV1Qa+e8srW/W0GHUk62mIxpQUgKu2pqdfGXTWtvqSbLUsbd9Uw9dIB7fVhW+jXYBEfdmpra9Xc3Cyv1xvU7vV6VVVV1eZ7ioqK5PF4Aq/09PQeq+f/VRw45fFNn9f22O8CgEix72DDKY/vPcCX8umcrg/bQr8eE/Fh5ziXyxX0s2VZrdqOW7Bggfx+f+BVWdlzoy2X+pJPeTzn+yk99rsAIFIM6R9/yuNDkxPCVEnkOl0ftoV+PSbiw05KSopiYmJajeJUV1e3Gu05zu12KykpKejVU24YfZZie7UdsmJ7uTR1VM+NIgFApMgY0E/jMwco5qT/hMa4XBqfOUC+FL6UT6e9PmwL/Ros4sNOnz59NHLkSJWUlAS1l5SUaOzYsbbUtO6unFaB5/hqLACIVkvzs5UzLHh0O2dYipbmZ9tUUeRpqw8vzUjW2O8HzyrQr8GMWI11fOn5s88+q0svvVTLly/XihUrtGPHDg0ZMuS07+/p1VjHvfp+pTZ9Xquc76cwogMA36moPaK9B45oaHICIw9d1FYfRmO/RtXSc+nYpoKLFy/Wl19+qaysLD3xxBMaP358h94bqrADAABCJ+rCTncQdgAAiDxRs88OAADAqRB2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACMRtgBAABGI+wAAACjxdpdgBMc30S6rq7O5koAAEBHHf/ePt3DIAg7kg4fPixJSk/nYZ0AAESaw4cPy+PxtHucZ2NJamlp0RdffKHExES5XK4e+9y6ujqlp6ersrKSZ27ZgP63F/1vL/rfXvR/eFiWpcOHDystLU29erV/Zw4jO5J69eqlwYMHh+zzk5KS+MduI/rfXvS/veh/e9H/oXeqEZ3juEEZAAAYjbADAACMRtgJIbfbrV/+8pdyu912lxKV6H970f/2ov/tRf87CzcoAwAAozGyAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7IfTMM8/I5/Opb9++GjlypN555x27SzJSUVGRLr74YiUmJmrgwIGaMmWKdu7cGXSOZVlauHCh0tLSFBcXp9zcXO3YscOmis1VVFQkl8ulgoKCQBt9H1r/+Mc/dOONNyo5OVnx8fG68MILVVZWFjhO/4fO0aNH9cADD8jn8ykuLk4ZGRl65JFH1NLSEjiH/ncICyHx8ssvW71797ZWrFhhffLJJ9acOXOshIQEa9++fXaXZpyrrrrKWrVqlfXxxx9b5eXl1uTJk62zzjrLqq+vD5zz+OOPW4mJidZrr71mbd++3brhhhusQYMGWXV1dTZWbpatW7daQ4cOtc4//3xrzpw5gXb6PnQOHjxoDRkyxLrlllusLVu2WBUVFdb//M//WLt37w6cQ/+HzqOPPmolJydbf/rTn6yKigrr1Vdftfr162c9+eSTgXPof2cg7ITI6NGjrZ/+9KdBbeecc451//3321RR9KiurrYkWaWlpZZlWVZLS4uVmppqPf7444FzvvnmG8vj8VjPPvusXWUa5fDhw1ZmZqZVUlJiTZgwIRB26PvQmj9/vjVu3Lh2j9P/oTV58mTrtttuC2q77rrrrBtvvNGyLPrfSZjGCoGmpiaVlZUpLy8vqD0vL0+bN2+2qaro4ff7JUn9+/eXJFVUVKiqqiroerjdbk2YMIHr0UPuuusuTZ48WVdeeWVQO30fWuvWrdOoUaM0depUDRw4UNnZ2VqxYkXgOP0fWuPGjdObb76pzz77TJL00Ucf6d1339WkSZMk0f9OwoNAQ6C2tlbNzc3yer1B7V6vV1VVVTZVFR0sy9LcuXM1btw4ZWVlSVKgz9u6Hvv27Qt7jaZ5+eWX9cEHH2jbtm2tjtH3obVnzx4tW7ZMc+fO1c9//nNt3bpVs2fPltvt1owZM+j/EJs/f778fr/OOeccxcTEqLm5WY899pjy8/Ml8e/fSQg7IeRyuYJ+tiyrVRt61t13362//e1vevfdd1sd43r0vMrKSs2ZM0fr169X37592z2Pvg+NlpYWjRo1SoWFhZKk7Oxs7dixQ8uWLdOMGTMC59H/ofHKK6/oxRdf1OrVq3XeeeepvLxcBQUFSktL08033xw4j/63H9NYIZCSkqKYmJhWozjV1dWtEj56zqxZs7Ru3Tpt2LBBgwcPDrSnpqZKEtcjBMrKylRdXa2RI0cqNjZWsbGxKi0t1VNPPaXY2NhA/9L3oTFo0CCde+65QW3Dhw/X/v37JfFvP9Tuu+8+3X///frJT36iESNG6KabbtI999yjoqIiSfS/kxB2QqBPnz4aOXKkSkpKgtpLSko0duxYm6oyl2VZuvvuu/X666/rrbfeks/nCzru8/mUmpoadD2amppUWlrK9eimK664Qtu3b1d5eXngNWrUKE2fPl3l5eXKyMig70MoJyen1TYLn332mYYMGSKJf/uh1tDQoF69gr9GY2JiAkvP6X8HsfHmaKMdX3q+cuVK65NPPrEKCgqshIQEa+/evXaXZpw777zT8ng81ttvv219+eWXgVdDQ0PgnMcff9zyeDzW66+/bm3fvt3Kz89n+WeInLgay7Lo+1DaunWrFRsbaz322GPWrl27rJdeesmKj4+3XnzxxcA59H/o3Hzzzdb3vve9wNLz119/3UpJSbHmzZsXOIf+dwbCTgg9/fTT1pAhQ6w+ffpYF110UWApNHqWpDZfq1atCpzT0tJi/fKXv7RSU1Mtt9ttjR8/3tq+fbt9RRvs5LBD34fWH//4RysrK8tyu93WOeecYy1fvjzoOP0fOnV1ddacOXOss846y+rbt6+VkZFh/eIXv7AaGxsD59D/zuCyLMuyc2QJAAAglLhnBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHQFS45ZZbNGXKFLvLAGADdlAGEBX8fr8sy9IZZ5xhdykAwoywA8Dxvv32W/Xu3dvuMgBEKKaxAITdG2+8oXHjxumMM85QcnKyrr76an3++eeSpL1798rlcun3v/+9cnNz1bdvX7344os6cOCA8vPzNXjwYMXHx2vEiBFas2ZN0Of+53/+p0aMGKG4uDglJyfryiuv1JEjRyS1nsbKzc3V7NmzNW/ePPXv31+pqalauHBh0OcVFxdrxIgRSkhIUHp6umbOnKn6+npJx0aK4uLi9MYbbwS95/XXX1dCQkLgPAD2I+wACLsjR45o7ty52rZtm95880316tVL1157rVpaWgLnzJ8/X7Nnz9ann36qq666St98841GjhypP/3pT/r444/1b//2b7rpppu0ZcsWSdKXX36p/Px83Xbbbfr000/19ttv67rrrtOpBq+ff/55JSQkaMuWLVq8eLEeeeQRlZSUBI736tVLTz31lD7++GM9//zzeuuttzRv3jxJksfj0eTJk/XSSy8Ffebq1av1ox/9SP369evJLgPQDUxjAbBdTU2NBg4cqO3bt6tfv37y+Xx68sknNWfOnFO+b/LkyRo+fLh+9atf6YMPPtDIkSO1d+9eDRkypNW5t9xyi7766iv94Q9/kHRsZKe5uVnvvPNO4JzRo0fr8ssv1+OPP97m73v11Vd15513qra2VpK0du1azZgxQ//7v/+r+Ph41dXVyev16rXXXtOkSZO62BsAehojOwDC7vPPP9e0adOUkZGhpKQk+Xw+SdL+/fsD54waNSroPc3NzXrsscd0/vnnKzk5Wf369dP69esD77ngggt0xRVXaMSIEZo6dapWrFihQ4cOnbKO888/P+jnQYMGqbq6OvDzhg0bNHHiRH3ve99TYmKiZsyYoQMHDgSmxiZPnqzY2FitW7dOkvTaa68pMTFReXl5XewZAKFA2AEQdtdcc40OHDigFStWaMuWLYGpqKampsA5CQkJQe9ZsmSJnnjiCc2bN09vvfWWysvLddVVVwXeExMTo5KSEv31r3/Vueeeq6VLl+oHP/iBKioq2q3j5JueXS5XYCpt3759mjRpkrKysvTaa6+prKxMTz/9tKRjN0xLUp8+ffQv//IvWr16taRjU1g33HCDYmNju9M9AHoYYQdAWB04cECffvqpHnjgAV1xxRUaPnz4aUdgJOmdd97Rj370I91444264IILlJGRoV27dgWd43K5lJOTo4cfflgffvih+vTpo7Vr13apzvfff19Hjx7VkiVLdMkll+jss8/WF1980eq86dOn64033tCOHTu0YcMGTZ8+vUu/D0Do8N8PAGF15plnKjk5WcuXL9egQYO0f/9+3X///ad937Bhw/Taa69p8+bNOvPMM1VcXKyqqioNHz5ckrRlyxa9+eabysvL08CBA7VlyxbV1NQEjnfW97//fR09elRLly7VNddco02bNunZZ59tdd6ECRPk9Xo1ffp0DR06VJdcckmXfh+A0GFkB0BY9erVSy+//LLKysqUlZWle+65R//xH/9x2vc9+OCDuuiii3TVVVcpNzdXqampQUvJk5KStHHjRk2aNElnn322HnjgAS1ZskT//M//3KU6L7zwQhUXF2vRokXKysrSSy+9pKKiolbnuVwu5efn66OPPmJUB3AoVmMBAACjMbIDAACMRtgBAABGI+wAAACjEXYAAIDRCDsAAMBohB0AAGA0wg4AADAaYQcAABiNsAMAAIxG2AEAAEYj7AAAAKP9f2GfEVx57AFyAAAAAElFTkSuQmCC\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"notlar.plot.scatter(x=\"arasinav\", y=\"final\", marker=\"o\")\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"pandas veri çerçeveleri kolaylıkla $\\LaTeX$ formatındaki tablolara dönüştürülüp, yayınlara aktarılabilir."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\\begin{tabular}{lrrrrlr}\n",
" & odev1 & odev2 & arasinav & final & durum & genel_ortalama \\\\\n",
"ad & & & & & & \\\\\n",
"ogrenci1 & 100 & 0 & 0.000000 & 0.000000 & W & 10.000000 \\\\\n",
"ogrenci2 & 80 & 92 & 64.000000 & 78.000000 & C+ & 75.400000 \\\\\n",
"ogrenci3 & 95 & 100 & 71.000000 & 88.000000 & B+ & 84.800000 \\\\\n",
"ogrenci4 & 100 & 100 & 54.000000 & 40.000000 & D & 56.200000 \\\\\n",
"ogrenci5 & 97 & 0 & 0.000000 & 0.000000 & W & 9.700000 \\\\\n",
"ogrenci6 & 100 & 100 & 55.000000 & 66.000000 & C & 69.500000 \\\\\n",
"ogrenci7 & 100 & 100 & 91.000000 & 87.000000 & A & 90.800000 \\\\\n",
"ogrenci8 & 97 & 100 & 86.000000 & 78.000000 & B+ & 84.500000 \\\\\n",
"ogrenci9 & 75 & 0 & 68.000000 & 0.000000 & W & 27.900000 \\\\\n",
"ogrenci10 & 95 & 0 & 85.000000 & 0.000000 & W & 35.000000 \\\\\n",
"ogrenci11 & 100 & 100 & 75.000000 & 76.000000 & B & 80.500000 \\\\\n",
"ogrenci12 & 90 & 100 & 75.000000 & 92.000000 & A- & 87.500000 \\\\\n",
"ogrenci13 & 95 & 100 & 72.000000 & 77.000000 & B & 79.600000 \\\\\n",
"ogrenci14 & 95 & 100 & 50.000000 & 44.000000 & D & 56.500000 \\\\\n",
"ogrenci15 & 100 & 100 & 91.000000 & 98.000000 & A & 96.300000 \\\\\n",
"ogrenci16 & 90 & 100 & 75.000000 & 86.000000 & B+ & 84.500000 \\\\\n",
"ogrenci17 & 95 & 100 & 63.000000 & 67.000000 & C & 71.900000 \\\\\n",
"ogrenci18 & 100 & 100 & 88.000000 & 96.000000 & A & 94.400000 \\\\\n",
"ogrenci19 & 70 & 98 & 59.000000 & 76.000000 & C+ & 72.500000 \\\\\n",
"ogrenci20 & 100 & 100 & 81.000000 & 94.000000 & A & 91.300000 \\\\\n",
"ogrenci21 & 95 & 97 & 75.000000 & 83.000000 & B & 83.200000 \\\\\n",
"ogrenci22 & 100 & 100 & 85.000000 & 100.000000 & A & 95.500000 \\\\\n",
"ogrenci23 & 90 & 100 & 79.000000 & 70.000000 & B- & 77.700000 \\\\\n",
"ogrenci24 & 90 & 0 & 0.000000 & 0.000000 & W & 9.000000 \\\\\n",
"ogrenci25 & 0 & 75 & 50.000000 & 74.000000 & D+ & 59.500000 \\\\\n",
"ogrenci26 & 100 & 100 & 68.000000 & 75.000000 & B- & 77.900000 \\\\\n",
"ogrenci27 & 92 & 97 & 63.000000 & 59.000000 & C- & 67.300000 \\\\\n",
"ogrenci28 & 100 & 100 & 81.000000 & 76.000000 & B & 82.300000 \\\\\n",
"ogrenci29 & 100 & 97 & 52.000000 & 69.000000 & C & 69.800000 \\\\\n",
"ogrenci30 & 92 & 0 & 86.000000 & 0.000000 & W & 35.000000 \\\\\n",
"ogrenci31 & 87 & 100 & 59.000000 & 82.000000 & B- & 77.400000 \\\\\n",
"ogrenci32 & 100 & 100 & 92.000000 & 89.000000 & A & 92.100000 \\\\\n",
"ogrenci33 & 100 & 100 & 92.000000 & 100.000000 & A & 97.600000 \\\\\n",
"ogrenci34 & 95 & 100 & 53.000000 & 69.000000 & C & 69.900000 \\\\\n",
"ogrenci35 & 100 & 100 & 94.000000 & 83.000000 & A & 89.700000 \\\\\n",
"ogrenci36 & 95 & 0 & 76.000000 & 79.000000 & C & 71.800000 \\\\\n",
"ogrenci37 & 78 & 0 & 47.000000 & 23.000000 & F & 33.400000 \\\\\n",
"\\end{tabular}\n",
"\n"
]
}
],
"source": [
"notlar_latex = notlar.style.to_latex()\n",
"print(notlar_latex)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sonuç olarak oluşan notlar veriçerçevesini yine virgülle ayrılmış bir salt metin dosyasına (ders_notlar_sonuc.csv) adıyla yazdıralım. `df.to_json` gibi fonksiyonlarla dosyalara başka türden formatlarda da yazmak mümkündür. "
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"#notlar.options.display.float_format = '{:.2f}'.format\n",
"notlar['genel_ortalama'] = notlar['genel_ortalama'].map('{:.2f}'.format)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"notlar.to_csv(\"ders_notlar_sonuc.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Kaynaklar #\n",
"\n",
"* [10 minutes to pandas](https://pandas.pydata.org/pandas-docs/stable/getting_started/10min.html)\n",
"* [Pandas Dokümantasyonu](https://pandas.pydata.org/docs/)\n",
"* [Real Python Pandas Tutorial](https://realpython.com/pandas-python-explore-dataset/)\n",
"* Python Data Science Handbook, Jake VanderPlas, 2017, O’Reilly Media, Inc."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Başa Dön](#Pandas-Paketine-Giriş)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 4
}