Türkiye Koronavirüs verisi ile veri seti hazırlama

Blog’u yaratalı her ne kadar uzun zaman olsa da anca buraya yazabilecek birşeyler bulabildim, aslında alışkanlığı edineyim diye biraz da bu yazıyı yazıyorum, eminim birisinin işine yaracaktır.

Bir süredir verilerle ilgileniyorum ve şu anda dünyada süregelen bir COVID salgını mevcut. Bu verilerle ilgilendiğim sürede kaggle ile içli dışlı oldum ardından arama çubuğuna COVID ve Turkey kelimelerini yazdığımda çok birşey bulamadığımı fark ettim ve ilk datasetimi oluşturmak için yola koyuldum.

İlk olarak Türkiye’nin koronavirüs verisini almak için bir kaynak bulmamız gerekiyordu, bunun için yaklaşık 1 saat bakındım ancak tek ve en güvenli olarak bulduğum Sağlık Bakanlığı’nın verisi oldu. Site ilk baktığımda verileri toplamak çok kolay geldi çünkü ortada bir tablo vardı satırları topladığınızda elinizde veri setiniz oluyordu. Hemen request kütüphanesi ile aşağıdaki kodu çalıştırdım.

import requests
from bs4 import BeautifulSoup
URL = "https://covid19.saglik.gov.tr/EN-69532/general-coronavirus-table.html"
resp = requests.get(url=URL)
soup = BeautifulSoup(resp.content, "lxml")
print(soup)

Çalıştırdığımda gördüğüm şey tablonun doğal olarak boş olduğu ve bir jquery ile [CDATA] formatında veriyi tabloya işlediğiydi.

//<![CDATA[
var geneldurumjson = [{"tarih":"16.08.2021","gunluk_test":"287.947","gunluk_vaka":"18.163"...

Şeklinde devam eden bir formu vardı, öncelikle tabii ki bu [CDATA]’yı almaya çalıştım fakat bunda başarılı olamadım ve forumlarda da benim BeautifulSoup ile ilgili aynı problemleri yaşayan insanlar gördüm. Bu noktada açıkcası sanırım tecrübesizliğimden ötürü aklıma çok da fazla seçenek gelmedi ve aklıma gelen en basit seçeneği uyguladım, Selenium kullandım. Bu sayede tüm javascriptler çalışacak ve veriler yerlerine oturacaktı.

#Importin requirements

from selenium import webdriver
import time
import pandas as pd
import numpy as np

Bu şekilde gereken kütüphaneleri içeri aktardım. Ardından sabitleri tanımladım.

PATH = "Buraya web sürücünüzün yolunu girebilirsiniz, eğer PATH değişkeninde kayıtlı ise buna gerek yok"
URL = "https://covid19.saglik.gov.tr/EN-69532/general-coronavirus-table.html"

Bundan sonrasında artık sürücümüzü çalıştırıp gereken verileri almamız gerek.

# Define driver and get URL

driver = webdriver.Chrome(PATH)
driver.get(URL)
time.sleep(1)

Yukarıda 1 saniye bekliyorum çünkü tüm yüklemeler anlık olarak gerçekleşmeyebilir. Bunun ardından aşağıdaki kodlar ile tüm satırların uzunluğunu alıyorum.

# Get all tablerows for tablerows length

res = driver.find_elements_by_xpath('/html/body/div[1]/section[2]/div/table/tbody/tr')

Açıkcası ben ilk bu işlemi yaparken bu XPATH’in alt XPATH’lerini alıcağından direkt bu işlemle tüm verileri çekebileceğimi düşünmüştüm, ama başaramadım ve her bir satırı tek tek almaya karar verdim;

#Define sub variables
arr = []
columns = []
count = 1

for i in res:
    if count == 1: # If its first run, then get columns
        for i in range(1,13): # Getting all colums into columns[]
            resp = driver.find_element_by_xpath(f"/html/body/div[1]/section[2]/div/table/thead/tr/th[{i}]").text
            columns.append(resp)
    temp_arr = []
    for q in range(1,13): # Getting all rows into arr[]
        resp = driver.find_element_by_xpath(f'/html/body/div[1]/section[2]/div/table/tbody/tr[{count}]/td[{q}]').text
        temp_arr.append(resp)
    arr.append(temp_arr)
    count +=1
driver.quit()

Bunun ardından elimde satır satır alınmış bir list oldu, sonrasında ise bu listeyi direkt olarak pandas DataFrame’ine aktararak çıktı aldım.

#Create a DataFrame
df = pd.DataFrame(columns=columns)

#Append all data to DataFrame row by row

for i in arr[0::][::-1]:
    df = df.append(pd.Series(i, index = columns,  ignore_index=True)

Şu anda elimde tam bir tablo mevcut fakat boş kolonlarlardan boş veri çektiğimden bazı veriler boş, bunları np.nan ile dolduralım ve son olarak csv çıktığımızı alalım.

# Replace empty values with np.nan
df.replace('', np.nan, inplace=True)

# Convert DataFrame to CSV
df.to_csv("data.csv", index=False)

Csv çıktımızı aldık! Bu sayede de blog yazımızın sonuna geldik. Dediğim gibi bloguma birşeyler eklemek için denediğim ilk sunumlardan biri,umarım faydalı olmuştur.

Veri setine ulaşmak isterseniz bu link üzerinden ulaşabilirsiniz.