Başlangıç
R Studio ve ilk kodlar
Elektrik Talep Analizi - (Histogram)
Elektrik Talep Analizi - (Filtreleme)
Elektrik Talep Analizi - (Verinin Bileşenleri)
Elektrik Talep Analizi - (Programlamaya Giriş)
Dogrusal Regresyon ile Elektrik Talebi
Üssel Düzgünleştirme ve STL ile Elektrik Talebi
Elektrik Talebinde Farklı Periyodlar (ARIMA ve TBATS)
2015-2024 - Aylık Doğalgaz Talebi
NOAA'dan günlük sıcaklık verilerine erisim
TCMB(Merkez Bankasi) verilerine erisim
EIA (ABD Eneji Bilgi Dairesi) verilerine erisim

R ile Türkiye Cumhuriyet Merkez Bankası verilerini indirme

Barış Sanlı, www.barissanli.com , barissanli2@gmail.com

Komutlar:

library(RCurl)
library(XML)
library(plyr)
xmlToList()
ldply()
plot

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")