pandas - Uygulama

Yazar

Taygun Bulmus

Yayınlanma Tarihi

26 Ağustos 2024

Neler Öğrendik?

# Seriler
s= pd.Series()
s.index
s.values
s.name
s["Londra"]
s.Londra
s.describe()
s.max()
s.min()
s.std()
s.mean()
s.median()
s.plot(kind= 'line')
s.plot(kind= 'bar')
s.plot(kind= 'barh')
s.plot(kind= 'pie')
# ----------------
df= pd.DataFrame()
df.columns
df["Nüfus"] #! Sütunun İsmi
df.Nüfus #! Türkçe karakter kullanma, Sütunun ismi
df.loc["Londra"] # Satır ismi
df.loc[["Londra", "Roma"]]
df.rename(columns= {"Nüfus" : "Nüfuslar"})
df.info()
# ----------------
df= pd.read_csv()
df.head()
df.tail()
df.loc["Etiket İsmi"]
df.iloc[0]
df.iloc[1, 2]
df.shape
df["Yeni Sütun"]
df["Sütun İsmi"].unique()
df["Sütun İsmi"].value_counts()
df["Sütun İsmi"].duplicated()
df.drop("Sütun İsmi", axis=1)
df.pop("Sütun İsmi")
df.drop("Etiket İsmi", axis=0)
df.Population.apply(lambda x: int(x.replace(',','')))
df.State.str.capitalize()
df.index.name
df.sort_index()
df.sort_values(by="Sütun İsmi", ascending=True)
df.set_index(["State", "City"]).sort_index(level=0)
df.set_index(["State", "City"]).sort_index(level=1)
df.sum()

Alıştırma 1

  1. Amerika’daki Kalifornya eyaletinin elektrik tüketimini veren bu veriyi okuyun  [1]. Okuma tarihi 25.05.2023.
  2. İlk ve son 5 satırını yazdırın.
  3. Timestamp (Hour Ending) sütun ismini Tarih Bilgisi yapın.
  4. Demand (MWh) sütun ismini Talep (MWh) yapın.
  5. Talep (MWh) sütununundaki NaN olan satırlarını silin.
  6. Yatayda Tarih Bilgisi, düşeyde Talep (MWh) olacak şekilde bir grafik çizin.

Çözüm

################################################
import os
# Bu dosyanın bulunduğu dizini al
current_dir = os.path.abspath('')
# 3 üst dizine çık
veri_dir = os.path.join(\
    os.path.abspath(\
        os.path.join(\
    current_dir, os.pardir, os.pardir, os.pardir))\
        , 'veri')
################################################

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Oku
df = pd.read_csv(veri_dir+"/veri-930-data-export.csv",
    delimiter=",")
# İlk ve son 5 satır
print(df.head())
print(df.tail())
# Sütun isimlerini değiştir
df.rename(columns={"Timestamp (Hour Ending)":"Tarih Bilgisi"},
    inplace=True)
df.rename(columns={"Demand (MWh)":"Talep (MWh)"}\
    , inplace=True)
# NaN satırlarını "Talep (MWh)" sütunundan sil
df.dropna(subset=["Talep (MWh)"], inplace=True)
# Çiz
plt.plot(df["Tarih Bilgisi"], df["Talep (MWh)"])
plt.xlabel("Tarh Bilgisi")
plt.ylabel("Kalifornya Elektrik Talebi (MWh)")
plt.xticks(rotation=25)
plt.xticks(np.arange(0, len(df), step=20))
plt.show()
plt.close()
  Region Code Timestamp (Hour Ending)  Demand (MWh)  Demand Forecast (MWh)  \
0        US48   5/17/2023 12 a.m. EDT      446173.0                 438971   
1        US48    5/17/2023 1 a.m. EDT      418994.0                 412814   
2        US48    5/17/2023 2 a.m. EDT      399252.0                 389905   
3        US48    5/17/2023 3 a.m. EDT      381525.0                 373869   
4        US48    5/17/2023 4 a.m. EDT      370696.0                 363882   

   Net Generation (MWh)  Total Interchange (MWh)  
0              438045.0                  -5573.0  
1              410208.0                  -5438.0  
2              389248.0                  -5768.0  
3              372178.0                  -4785.0  
4              363001.0                  -4675.0  
    Region Code Timestamp (Hour Ending)  Demand (MWh)  Demand Forecast (MWh)  \
188        US48    5/24/2023 8 p.m. EDT           NaN                 504300   
189        US48    5/24/2023 9 p.m. EDT           NaN                 494357   
190        US48   5/24/2023 10 p.m. EDT           NaN                 479733   
191        US48   5/24/2023 11 p.m. EDT           NaN                 457902   
192        US48   5/25/2023 12 a.m. EDT           NaN                 431842   

     Net Generation (MWh)  Total Interchange (MWh)  
188                   NaN                      NaN  
189                   NaN                      NaN  
190                   NaN                      NaN  
191                   NaN                      NaN  
192                   NaN                      NaN  
/opt/hostedtoolcache/Python/3.10.14/x64/lib/python3.10/site-packages/dateutil/parser/_parser.py:1207: UnknownTimezoneWarning: tzname EDT identified but not understood.  Pass `tzinfos` argument in order to correctly return a timezone-aware datetime.  In a future version, this will raise an exception.
  warnings.warn("tzname {tzname} identified but not understood.  "

Alıştırma 2

Bu linkte, ülkelerin mutluluk skorları ve bunlar ile ilintili bilgilerin olduğu csv dosyaları bulunmaktadır. Her yıl için, 2015, 2016, 2017, 2018, 2019, indirin ve aşağıdaki soruları cevaplayın.

  1. Beş yıllık veri setini tek bir veri setinde birleştirin.
  2. Türkiye’nin mutluluk skorunu yıllara göre nasıl değiştiğini grafik gösterin.
  3. Türkiye’nin gayri safi milli hasılası (GSMH, sütunlarda GDP per capita isminde) yıllara göre nasıl değiştiğini grafik üzerinde gösterin.

Çözüm

################################################
import os
# Bu dosyanın bulunduğu dizini al
current_dir = os.path.abspath('')
# 3 üst dizine çık
veri_dir = os.path.join(\
    os.path.abspath(\
        os.path.join(\
    current_dir, os.pardir, os.pardir, os.pardir))\
        , 'veri')
################################################

import pandas as pd
import matplotlib.pyplot as plt
# 2015
happiness2015 = pd.read_csv(veri_dir+'/veri_mutluluk_2015.csv')
happiness2015['Year'] = 2015
happiness2015.rename(columns={'Happiness Score':  'Score', 'Economy (GDP per Capita)': 'GDP per capita'}, inplace=True)
# 2016
happiness2016 = pd.read_csv(veri_dir+'/veri_mutluluk_2016.csv')
happiness2016['Year'] = 2016
happiness2016.rename(columns={'Happiness Score':  'Score', 'Economy (GDP per Capita)': 'GDP per capita'}, inplace=True)
# 2017
happiness2017 = pd.read_csv(veri_dir+'/veri_mutluluk_2017.csv')
happiness2017['Year'] = 2017
happiness2017.rename(columns={'Happiness.Score':  'Score', 'Economy..GDP.per.Capita.': 'GDP per capita'}, inplace=True)
# 2018
happiness2018 = pd.read_csv(veri_dir+'/veri_mutluluk_2018.csv')
happiness2018['Year'] = 2018
happiness2018.rename(columns={'Country or region':  'Country'}, inplace=True)
# 2019
happiness2019 = pd.read_csv(veri_dir+'/veri_mutluluk_2019.csv')
happiness2019['Year'] = 2019
happiness2019.rename(columns={'Country or region':  'Country'}, inplace=True)
# Ortak sütunlar
happiness = pd.concat([happiness2015, happiness2016, happiness2017, happiness2018, happiness2019], ignore_index=True)
# Türkiye
turkiye = happiness[happiness['Country'] == 'Turkey']
print(turkiye.head())
# Çiz
plt.plot(turkiye['Year'], turkiye['Score'], marker='.')
plt.xlabel('Yıllar')
plt.ylabel('Mutluluk Skoru (Happiness Score)')
plt.title('Türkiye Mutluluk Skoru (Happiness Score) Değişimi')
plt.show()
plt.close()
# Gayri Safi Milli Hasıla
# Çiz
plt.plot(turkiye['Year'], turkiye['GDP per capita'], marker='.')
plt.xlabel('Yıllar')
plt.ylabel('Gayri Safi Milli Hasıla (GDP per capita)')
plt.title('Gayri Safi Milli Hasıla (GDP per capita) Değişimi')
plt.show()
    Country                           Region  Happiness Rank  Score  \
75   Turkey  Middle East and Northern Africa            76.0  5.332   
235  Turkey  Middle East and Northern Africa            78.0  5.389   
383  Turkey                              NaN             NaN  5.500   
543  Turkey                              NaN             NaN  5.483   
704  Turkey                              NaN             NaN  5.373   

     Standard Error  GDP per capita    Family  Health (Life Expectancy)  \
75          0.03864        1.060980  0.946320                   0.73172   
235             NaN        1.164920  0.877170                   0.64718   
383             NaN        1.198274  1.337753                       NaN   
543             NaN        1.148000       NaN                       NaN   
704             NaN        1.183000       NaN                       NaN   

      Freedom  Trust (Government Corruption)  ...  Whisker.high  Whisker.low  \
75   0.228150                        0.15746  ...           NaN          NaN   
235  0.238890                        0.12348  ...           NaN          NaN   
383  0.300741                            NaN  ...      5.594865     5.405135   
543       NaN                            NaN  ...           NaN          NaN   
704       NaN                            NaN  ...           NaN          NaN   

     Health..Life.Expectancy.  Trust..Government.Corruption.  \
75                        NaN                            NaN   
235                       NaN                            NaN   
383                  0.637606                       0.099672   
543                       NaN                            NaN   
704                       NaN                            NaN   

     Dystopia.Residual  Overall rank  Social support  Healthy life expectancy  \
75                 NaN           NaN             NaN                      NaN   
235                NaN           NaN             NaN                      NaN   
383           1.879278           NaN             NaN                      NaN   
543                NaN          74.0            1.38                    0.686   
704                NaN          79.0            1.36                    0.808   

     Freedom to make life choices  Perceptions of corruption  
75                            NaN                        NaN  
235                           NaN                        NaN  
383                           NaN                        NaN  
543                         0.324                      0.109  
704                         0.195                      0.106  

[5 rows x 26 columns]

Problemler

Problem 1

Github sitesinde bulunan veri_imdb_1e5rows.tsv dosyasındaki verinin metadatasına inceleyin. Bu veri, title.akas.tsv.gz adlı dosyanın ilk \(10^{5}\) satırıdır. Bu veriyi pd.read_table() fonksiyonu ile okuyun.

Eğer tüm veri ile çalışmak istiyorsanız (1.8 gb) şu linkteki dosyayı indirin. Bu dosya sıkıştırılmış dosyadır. Bu dosyayı indirdikten sonra dışarı aktarın.

Bu veri hakkında aşağıdaki soruları cevaplayın.

  1. Bu verinin sütunları nelerdir?
  2. Bu verinin kaç sütunu var?
  3. Bu verinin kaç satırı var?
  4. Bu verinin ilk 2 satırını gösterin.
  5. Bu verinin son 2 satırını gösterin.
  6. Bu veri setindeki tüm biricik dilleri (language) gösterin.
  7. Bu veri setindeki tüm biricik bölgeleri (region) gösterin.
  8. Bu veri setindeki her bir biricik dilde kaç adet film vardır?
  9. Bu veri setindeki her bir biricik bölgede kaç adet film vardır?
  10. Bu veri setindeki attributes sütununu çıkarın (değişkene atayın).
  11. Bu verideki sütunların veri tiplerini ekrana yazdırın.
  12. Bu verinin ordering sütununu tam sayı haline getirin (değişkene atayın).
  13. Bu verinin isOriginalTitle sütununu bool haline getirin (değişkene atayın).
  14. Bu verinin etiketlerini titleId olacak şekilde gösterin (değişkene atayın).
  15. Bu verinin etiketini titleId ve title olarak değiştirin (değişkene atayın).
  16. Bu veriyi titleId sütununa göre sıralayın (değişkene atayın).
  17. Bu verideki tüm \N değerlerini pd.NA değerleri ile değiştirin (değişkene atamayın).
  18. Bu verinin titleId ve title etiketlerini tekrar sütun haline getirin (değişkene atayın).
  19. Bu verideki types sütunu içerisinde olan original verisine sahip satırları gösterin ve sonucu df2 değişkenine atayın.
  20. Bu veride isOriginalTitle sütunu True olan satırları gösterin ve sonucu df2 ile karşılaştırın. Yani elde ettiğiniz veri ile df2 verisi aynı mı? Değilse hangi satırlar farklı?

Problem 2

TÜİK’in veri merkezinde bulunan “Hava Alanlarında Toplam Yolcu ve Yük Trafiği” verisini indirin. Bu veri dosyasında yani dosyayı bir office programında açıp herhangi bir değişiklik yapmayın!

Aşağıdaki soruları cevaplayın.

  1. Bu excel dosyasını okuyun ve df değişkenine atayın. (Not: read_excel fonksiyonu ile okumak için xlrd kütüphanesini kurmanız gerekebilir. pip install xlrd komutu ile kurabilirsiniz.)
  2. Veri çerçevesini gösterin.
  3. Veri çerçevesi temizleyin. Bu temizlemeyi excel dosyasını açıp değil pandas ile yapın. Bu temizlemeyi aşağıdaki grafikleri çizebilmek için yapın:
    1. Toplam Yolcu - Yıl grafiğini çizdirin. Aynı grafik üzeride iç hat yolcusu ve dış hat yolcusunun yıllara göre grafiği de olsun.
    2. Toplam Yükün (Ton), iç hat yükünün (Ton) ve dış hat yükünün (Ton) yıllara göre grafiğini çizdirin.

Problem 3

Bir veri çatısı (data frame) oluşturun ve aşağıdaki tablodaki verileri içine yerleştirin. Veri çatısının sütunları sırasıyla “Ad_Soyad”, “Yas”, “Cinsiyet”, “Meslek” olsun.

Ad_Soyad Yas Cinsiyet Meslek
Ali Yılmaz 42 Erkek Mühendis
Canan Kaya 35 Kadın Doktor
Ece Özer 27 Kadın Hukukçu
Fatma Yılmaz 45 Kadın Avukat
Gamze Kaya 32 Kadın Mühendis
  • Veri çatısının ilk 3 satırını yazdırın.
  • Veri çatısının ad-soyad sütununu temelli olarak etikete (indexe) kaydedin, ve ekrana yazdırın.
  • Veri çatısındaki kişilerin yaş ortalamasını hazır fonksiyon kullanarak hesaplayın ve ekrana yazdırın.
  • Yaşı 40’dan büyük olanların bilgilerini ekrana yazdırın.

Problem 4

Bir fizik laboratuvarında, bir yayın esneklik sabiti ölçümü için deney yapılmıştır. Deney, bir dizi ağırlığın (\(m_{1}\), \(m_{2}\), \(m_{3}\), \(\dots\)) yayın ucuna asılması ve her bir ağırlığın yayı uzatma miktarının ölçülmesiyle gerçekleştirilmiştir.

Veriler, her bir ağırlığın yayın uzatma miktarı (kg biriminde) ve uygulanan kuvvetin (N biriminde) bir listesi olarak elde edilmiştir.

Kütle (kg) Uzama, \(\Delta x\) (m)
0.1 0.02
0.2 0.05
0.3 0.07
0.4 0.1
0.5 0.12
  1. Bu verileri bir DataFrame’e kaydedin.
  2. Her kütle için yayın esneklik sabitini (\(k\) [N/m]) hesaplayın, (\(k = F / \Delta x\)) ve DataFrame’e yeni sütun olarak ekleyin. (\(g=9.81\) \(m/s^{2}\))
  3. Her bir ağırlık için potansiyel enerjiyi hesaplayın (\(E = 1/2 \times k \times x^{2}\)) ve DataFrame’e yeni sütun olarak ekleyin.
  4. DataFrame’in son halinin ilk satırını ekrana yazdırın.
  5. DataFrame’in son halinin son satırını ekrana yazdırın.
  6. Yatay eksende uzama (m), dikey eksende potansiyel enerji (J = N \(\times\) m) olacak şekilde bir grafik oluşturun.

Problem 5

Bu linkteki veri_bilgYont1_notlar.csv dosyasını indirin. Bu dosyada her bir öğrencinin ödevleri, quizleri, arasınav ve final notları bulunmaktadır. Bu dosyadaki veri kütüphanesini kullanarak aşağıdaki soruları cevaplayın.

  1. Dosyayı pandas kütüphanesini kullanarak okuyun.
  2. Verinin ilk 5 satırını ekrana yazdırın.
  3. Verinin son 2 satırını ekrana yazdırın.
  4. Verinin sütunların isimlerini ekrana yazdırın.

Aşağıdaki işlemleri yapın ve değişkene atayın. Atadıktan sonra ilk 2 satırını ekrana yazdırın.

  1. Etiketleri ogrenci1, ogrenci2ogrenci14 gibi olacak şekilde değiştirin.

  2. Her bir öğrencinin ödevin ortalamasını bulun ve veri çatısında (data frame) bir sütun olarak kaydedin. Sütunun ismi OdevOrt olsun.

  3. Her bir öğrencinin quizlerinin ortalamasını bulun ve veri çatısında (data frame) bir sütun olarak kaydedin. Sütunun ismi QuizOrt olsun.

  4. Her bir öğrencinin dönem sonu ortalamasını bulun ve sütun ismi Ortalama olacak şekilde kaydedin. Dönem sonu ortalaması aşağıdaki gibi hesaplanır:

    • Quizler %10
    • Ödevler %20
    • Arasınav %30
    • Final %40
  5. Her bir öğrencinin harf sonu notunu, ortalamaya bakarak hesaplayın ve sütun ismi HarfNot olacak şekilde kaydedin. Harfli notlar aşağıdaki gibi hesaplanır:

Ortalama Harf Notu
90-100 AA
85-89 BA
80-84 BB
75-79 CB
70-74 CC
65-69 DC
60-64 DD
50-59 EE
0-49 FF
  1. Her bir öğrencinin quizlerinin arasından en yüksek 5 notu seçin ve QuizOrtBoost sütunu olarak kaydedin. Her öğrencinin ortalamasını ve harf notunu QuizOrtBoost kullanarak hesaplayın.