Bu yazımızda hem dplyr kütüphanesi içerisindeki fonksiyonları incelemeye hem de oldukça kullanışlı olan zaman serisi yapıları (xts) ile çalışmaya başlayacağız. dplyr kütüphanesinin nasıl kullanılacağını merak ediyorsanız bir önceki yazımızı inceleyebilirsiniz. Yahoo Finance ve Google Finance bir çok finansal enstrümanın tarihsel fiyat verilerini alabileceğimiz kaynaklardır. quantmod kütüphanesi ile bu sitelerden tarihsel fiyat verilerine erişebilmekteyiz. Bu incelememizde Yahoo Finance’dan Starbucks ve Microsoft hisse senetlerinin 01.01.2015 – 31.12.2017 tarih aralığında günlük fiyatlarını alıp tek bir tibble yapısında
birleştireceğiz.
quantmod
Öncelikle gerekli kütüphanelerin kurulumu yapılacaktır.
install.packages(c("quantmod","dplyr","tidyr"))
Kütüphaneleri aktif hale getirelim.
library(quantmod)
library(dplyr)
library(tidyr)
from <- "2015-01-01"
to <- "2017-12-31"
src <- "yahoo"
as <- FALSE
sbux <- getSymbols(Symbols = "SBX", src = src, auto.assign = as, from = from, to=to)
msft <- getSymbols(Symbols = "MSFT", src = src, auto.assign = as, from = from, to=to)
Yahoo Finance, finansal enstrümanlara ait genellikle açılış (Open), en yüksek (High), en düşük (Low), kapanış (Close), hacim (Volume) ve düzeltilmiş kapanış (Adjusted) değişkenlerini saklar. Biz düzeltilmiş kapanış değerleri üzerinden çalışacağız. Her iki zaman serisi de farklı sayıda datalardan oluşmaktadır.
obs <- c(nrow(sbux),nrow(msft))
names(obs) <- c("Starbucks","Microsoft")
obs
## Starbucks Microsoft
## 745 755
xts obejeleri, satırlarında tarih bilgilerini tutmaktadır. Bu serileri tarih bazında birleştirmek için öncelikle satır ismi olarak yazılı tarih bilgilerini sütun olarak eklemeli ve tibble yapısına dönüştürmeliyiz. Bu çalışmayı tibble yapısına dönüştürmeden de yapmanın yolları mevcuttur. Ancak çalışmamızda dplyr ve tibble ile çalışmaya gayret edeceğiz.
sbux <- tibble(date = index(sbux), sbx = (sbux %>% as.data.frame %>% .$SBX.Adjusted) )
msft <- tibble(date = index(msft), msft = (msft %>% as.data.frame %>% .$MSFT.Adjusted) )
join
Tibble yapılarını birleştirmek için dplyr kütüphanesi içerisindeki left_join, right_join, inner_join, full_join fonksiyonları kullanılacaktır.
left_join
Soldaki tibble baz alınarak sağ tarafta yer alan tibble anahtar sütuna göre birleştirilir. Örneğin Starbukcs kapanış fiyatlarının olduğu tarihlere göre Microsoft fiyatlarını birleştirelim.
left_join(x=sbux, y=msft, by="date")
## # A tibble: 745 x 3
## date sbx msft
## <date> <dbl> <dbl>
## 1 2015-01-02 0.0250 43.3
## 2 2015-01-05 0.0250 42.9
## 3 2015-01-06 0.0250 42.3
## 4 2015-01-07 0.0250 42.8
## 5 2015-01-08 0.0250 44.1
## 6 2015-01-09 0.0250 43.7
## 7 2015-01-12 0.0250 43.2
## 8 2015-01-13 0.0250 43.0
## 9 2015-01-14 0.0250 42.6
## 10 2015-01-15 0.0250 42.2
## # ... with 735 more rows
inner_join
Anahtar sütuna göre her iki tibble içerisinde de olan satırlara göre birleştirilir. Örneğin Starbukcs ve Microsoft kapanış fiyatlarının her ikisinin fiyatlarının geldiği tarihleri birleştirelim.
df_inner <- inner_join(x=sbux, y=msft, by="date")
df_inner
## # A tibble: 745 x 3
## date sbx msft
## <date> <dbl> <dbl>
## 1 2015-01-02 0.0250 43.3
## 2 2015-01-05 0.0250 42.9
## 3 2015-01-06 0.0250 42.3
## 4 2015-01-07 0.0250 42.8
## 5 2015-01-08 0.0250 44.1
## 6 2015-01-09 0.0250 43.7
## 7 2015-01-12 0.0250 43.2
## 8 2015-01-13 0.0250 43.0
## 9 2015-01-14 0.0250 42.6
## 10 2015-01-15 0.0250 42.2
## # ... with 735 more rows
full_join
Anahtar sütuna göre her iki tibble içerisinde de olan tüm verileri birleştirilir. Örneğin Starbukcs ve Microsoft kapanış fiyatlarını birleştirelim.
full_join(x=sbux, y=msft, by="date")
## # A tibble: 755 x 3
## date sbx msft
## <date> <dbl> <dbl>
## 1 2015-01-02 0.0250 43.3
## 2 2015-01-05 0.0250 42.9
## 3 2015-01-06 0.0250 42.3
## 4 2015-01-07 0.0250 42.8
## 5 2015-01-08 0.0250 44.1
## 6 2015-01-09 0.0250 43.7
## 7 2015-01-12 0.0250 43.2
## 8 2015-01-13 0.0250 43.0
## 9 2015-01-14 0.0250 42.6
## 10 2015-01-15 0.0250 42.2
## # ... with 745 more rows
Data Biçimini Değiştirme
Yapılan analizlerde data şeklinin değiştirilmesi (reshaping) gerekli olabilmektedir. tidyr kütüphanesi içerisindeki gather ve spread fonksiyonları ile data, kolaylıkla tekrar şekillendirilebilmektedir.
inner_join fonksiyonu ile oluşturduğumuz datasetinin yapısını inceleyelim. Dataset, 3 sütundan oluşmaktadır.
str(df_inner)
## Classes 'tbl_df', 'tbl' and 'data.frame': 745 obs. of 3 variables:
## $ date: Date, format: "2015-01-02" "2015-01-05" ...
## $ sbx : num 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 0.025 ...
## $ msft: num 43.3 42.9 42.3 42.8 44.1 ...
gather
Yukarıda incelediğimiz df_inner, ilk sütununda tarih, ikinci sütunda Starbucks hisse fiyatları, üçüncü sütunda ise Microsoft hisse fiyatlarını içermektedir. Dataseti date, asset, price sütunlarından oluşan bir yapıya nasıl çevirebiliriz? Bunun için tiydr kütüphanesi içerisindeki gather fonksiyonu kullanılmaktadır.
df_gather <- gather(data = df_inner, key = "asset", value = "price", -date)
df_gather
## # A tibble: 1,490 x 3
## date asset price
## <date> <chr> <dbl>
## 1 2015-01-02 sbx 0.0250
## 2 2015-01-05 sbx 0.0250
## 3 2015-01-06 sbx 0.0250
## 4 2015-01-07 sbx 0.0250
## 5 2015-01-08 sbx 0.0250
## 6 2015-01-09 sbx 0.0250
## 7 2015-01-12 sbx 0.0250
## 8 2015-01-13 sbx 0.0250
## 9 2015-01-14 sbx 0.0250
## 10 2015-01-15 sbx 0.0250
## # ... with 1,480 more rows
spread
df_gather ile oluşturduğumuz yeni tibble, bizim veritabanlarından eriştiğimiz yapı formatına oldukça benzemektedir. Analizlerimizde ise bu dataların sütunlara dağıtılmış halini daha sık kullanıyoruz. Bu nedenle bu şekildeki verileri spread’lendirmemiz gerekebilmektedir. tidyr kütüphanesi içerisindeki spread fonksiyonu ile datayı tekrar eski haline getirebiliriz.
df_spread <- spread(data = df_gather, key = asset, value = price)
df_spread
## # A tibble: 745 x 3
## date msft sbx
## * <date> <dbl> <dbl>
## 1 2015-01-02 43.3 0.0250
## 2 2015-01-05 42.9 0.0250
## 3 2015-01-06 42.3 0.0250
## 4 2015-01-07 42.8 0.0250
## 5 2015-01-08 44.1 0.0250
## 6 2015-01-09 43.7 0.0250
## 7 2015-01-12 43.2 0.0250
## 8 2015-01-13 43.0 0.0250
## 9 2015-01-14 42.6 0.0250
## 10 2015-01-15 42.2 0.0250
## # ... with 735 more rows