R ile Türkiye Cumhuriyet Merkez Bankası verilerini indirme Barış Sanlı, www.barissanli.com , barissanli2@gmail.com Komutlar: library(RCurl) Giriş Enerji analizlerindeki bir diğer önemli veriseti ise ekonomik ve finansal göstergeler, anketler vs.'dir. Bu noktada Türkiye Cumhuriyet(yanlış değil, böyle yazılıyor) Merkez Bankası'nın veri paylaşımı konusunda Türkiye'de 1 numara olduğunu söylemek isterim. Web servisler ile inanılmaz bir veri setine erişebiliyorsunuz. Bu veri setine erişirken benim aşağıda anlatacağım kodu, EVDS kullanma kılavuzlarındaki önerilere göre değiştirerek istediğiniz verileri yükleyebilirsiniz. TCMB EVDS'den Anahtar Almak TCMB EVDS'den anahtar almak için sağ üstteki "Giriş yap" kısmından giriş yapa tıklayarak "kayıt olun" https://evds2.tcmb.gov.tr/index.php?/evds/login
Hesabınıza girdikten sonra kullanıcı adınıza tıklayın, Burada bir menu açılacak orada "Profil"'e tıklayın veya bu adrese girin: https://evds2.tcmb.gov.tr/index.php?/evds/editProfile
Profil sayfasında en alta doğru "API Anahtarı" tuşunu göreceksiniz, işte bu sizin anahtarınız
API Anahtarına tıklayınca, anahtarınız ekrana çıkacak, bu karakter dizinini alıp bir yerde muhafaza edin, internette bölüşmeyin. Gerekli Kütüphaneler TCMB'ye bağlanırken, bağlantı "http" değil "https" bağlanıyor. Ben burada çok sorun yaşadım, özellikle SSL sertifika kabul edip etmeme konusu sinir bozucuydu. Bu yüzden Rcurl'de ssl bağlantıda sertifikayı boşver ayarı ile bağlantı kurdum. TCMB veriyi xml tipinde veriyor (başka formatlar da var herhalde ama denemedim), bu yüzden XML ve verileri data.frame'e çevirmek için plyr kullanmak gerekiyor. Eğer bu 3 kütüphane yok ise install.packager("Rcurl") diyerek yükleyebilirsiniz. Ben anahtarımı da kütüphaneleri yükledikten hemen sonra tanıtıyorum.
Veri adresi EVDS sitesindeki kılavuzlardan öğrendiğime göre aslında bir web adresi oluşturarak buradan veriyi istediğimiz formatta alıp işliyoruz. Bu adres XXXXXXX anahtarı için, Dolar/TL döviz kurunun 21 Ekim ile 11 Kasım arasındaki hareketi için şu şekildedir: Her seferinde web adresi bence zor olur diye ben basit bir fonksiyon ile bu işi çözmeye çalıştım tcmb_evds fonksiyonu Bu fonksiyon sadece metin dizilerini arka arkaya ekleyerek verinin EVDS adresini oluşturmaktadır. Fakat, "getURL" komutundaki parametrelerden .opts çok önemlidir. EVDS bağlantısı "https", yani güvenilir, sertifikalı bağlantı olduğundan, bunu karşılıklı doğrulama gerekecektir. Bununla vakit kaybetmeyerek (daha doğrusu ben beceremedim), bu karşılıklı sertifika işini doğrulama komutu verdim. • .opts = list(ssl.verifypeer = FALSE)
Yukarıda istediğimiz veriyi XML formatında aldığımız görülüyor. Burada "TP.DK.USD.A"'nın dolar kuru olduğunu nereden bulduğumu soranlar için evds'de istediğim verilere girip verileri istediğimde açılan sayfalardaki isimlerden buldum. Yani gün gün dolar kurunu istediğimde gelen ekrandaki verilerin üstünde "TP DK USD A" yazıyordu. XML veriyi R'a tanıtmak xmlveriler değişkeninde bir XML tablomuz var. Şimdi bunu ldply ile bir veri çerçevesine yani data.frame'e çevirmemiz gerekiyor. Bunun için de komut, ldply(xmlToList(xmlveriler), data.frame) Daha sonra ise df isimli değişkene attığımız tablonun baş tarafına bakıyoruz.
Verileri İşlemek df'ye baktığımız zaman (ben bir de yedek olsun diye af diye yedek değişkene de attım), 5 sütundan oluşan bir veri görüyoruz. Burada bizi ilgilendiren istediğimiz kod ve tarih yani TP_DK_USD_A ve Tarih sütunları. Fakat verinin ilk satırında veri sonucu var. Yani biz bir istemde bulunduk ve bu istem sonucu kabul edilen ve bize dönen veri sayısı var. Dolayısı ile ilgi satırı sileceğiz. Bir diğer problem de "null" olan satırlar. Yani döviz kurunun "null"/boş olduğu satırlar ki bunlar hafta sonları, resmi tatiler vs herhalde, yani kur belirlenmeyen tarihler. Hem ilk satırı hem de "null" satırını silmek sonra da verimizin son halini görmek için şöyle yapacağız:
Gördüğümüz gibi null satırlar ve haftasonları/resmi tatiller gitti. İlk satır da gitti. Dolar Kurunu Sayıya Çevirmek Nedendir bilinmez TP_DK_USD_A satırını R veri sınıflarından "faktör" olarak görüyor, oysa orası ondalıklı bir sayı. Bu sebeple o satırı da sayıya çevirelim
Grafiklemek Artık df verisetimizin TP_DK_USD_A alt kümesinde nümerik olarak dolar kuru, Tarih alt kümesinde de tarih olduğu için herşeyi grafikleyebiliriz:
Sonuç Veri setleri arasında muhtemelen en önemlisi, ekonomik ve finansal veriler olunca, R'da bu verilerin otomatik alınması da önemli oluyor. TCMB'nin veri setine zaten webservislerden erişim var, ben burada XML olarak verilere erişim nasıl olacağını göstermiş oldum. EVDS sitesine girerek istediğiniz veri setlerini çektiğiniz zaman bu veri setlerinin kodları ekrana geliyor, buradan kodları öğrenerek Rcurl kütüphanesinden getURL ile istenilen veriye erişebilirsiniz. Öneri ve yorumlarınız için : barissanli2@gmail.com
Kod:
# Eğer bu kütüphaneler kurulmadı ise bunları install.packages ile kurabilirsiniz # install.packages(RCurl) # install.packages(XML) # install.packages(plyr) library(RCurl) # EVDS'ye bağlantı için library(XML) # XML veri kullanımı için library(plyr) # XML veriyi data.frame'e çevirmek için
# evds sisteminden aldığımız API anahtarını buraya yazıyoruz
anahtar<-"XXXXXXXXXX"
# veriseti ile verilen verinin, baslangıç ve sonuç tarihleri arasını # anahtar=API Anahtarınız olacak şekilde girince XML olarak sonuç üreten # fonksiyon
tcmb_evds<-function(veriseti,baslangic,son, anahtar) { adres="https://evds2.tcmb.gov.tr/service/evds/" seri=paste("series=",veriseti, sep="") tarihler=paste("&startDate=",baslangic,"&endDate=",son, sep="") tamamlayici=paste("&type=xml&key=",anahtar, sep="") veriadresi<-paste(adres,seri,tarihler,tamamlayici, sep="") xmlveri <- getURL(veriadresi, .opts = list(ssl.verifypeer = FALSE)) return(xmlveri) }
xmlveriler<-tcmb_evds("TP.DK.USD.A","21-10-2017", "11-11-2017",anahtar) xmlveriler
df<-ldply(xmlToList(xmlveriler), data.frame) head(df)
# önce ilk satırı silelim df<-df[df$.id!="totalCount",]
# şimdi de boş satırları, genelde haftasonu kur açıklanmadığı için, silelim # df$TP_DK_USD_A[df$TP_DK_USD_A == "null"] <- "" # df$TP_DK_USD_A <- as.numeric(as.character.numeric_version(df$TP_DK_USD_A)) # df[complete.cases(df$TP_DK_USD_A), ]
df<-df[df$TP_DK_USD_A!="null",] head(df)
# nedense sayı kısımların factor(etken) olarak alıyor, kur'un rakam olduğunu belirtelim # satırları numeriğe çevir df$TP_DK_USD_A <- as.numeric(as.character.numeric_version(df$TP_DK_USD_A))
plot(y=df$TP_DK_USD_A, x=df$Tarih,type="l", col="red", xlab="Tarih", ylab="TL/$") lines(y=df$TP_DK_USD_A, x=df$Tarih) title("TL'nın Dolar karşısındaki değişimi")
|