#r #data.table #tidyquant
#r #data.table #tidyquant
Вопрос:
У меня есть ежедневные данные по двум акциям (Apple и Google)
library(tidyquant)
dt = tidyquant::tq_get(c("AAPL", "GOOG")) %>%
arrange(symbol, date)
Я пытаюсь преобразовать эти данные из ежедневных в еженедельные, используя следующий код
result = dt %>%
group_by(symbol) %>%
tidyquant::tq_transmute(mutate_fun = to.weekly) %>% data.table
result[symbol == "AAPL" amp; date == "2017-02-03"]
Каким-то образом результат неверен.
В качестве примера, еженедельные данные для AAPL
on 2017-02-03
поступают следующим образом с использованием приведенного выше кода-
symbol date open high low close volume
1: AAPL 2017-02-03 32.0775 32.2975 32.04 32.27 98029200
Однако правильный результат должен быть —
symbol date open high low close volume
1: AAPL 2017-02-03 30.2325 32.6225 30.1550 32.2700 999124986
Может ли кто-нибудь мне здесь помочь?
Спасибо!
Ответ №1:
На момент написания: ошибка, см. Выпуск 148 github.
Возможный обходной путь с использованием tidyr, timetk и purrr. Использование timetk для перевода данных в формат xts преобразует данные в weekly и возвращает формат data.frame. Включение nest
и unnest
из tidyr и map
из purrr. data.table не требуется, но печатает данные намного лучше, чем tibbles.
library(tidyr)
library(timetk)
# library(purrr)
result <- dt %>%
group_by(symbol) %>%
nest() %>%
mutate(data = purrr::map(data, function(x) x %>%
select(date, Open = open, High = high, Low = low, Close = close) %>%
tk_xts(x, select = c(Open, High, Low, Close), date_var = date) %>%
to.weekly %>%
tk_tbl)) %>%
unnest(data) %>%
rename_with( ~ tolower(gsub("..", "", .x, fixed = T))) %>%
rename(date = index)
result %>%
data.table %>%
filter(date == "2017-02-03")
symbol date open high low close
1: AAPL 2017-02-03 30.2325 32.6225 30.155 32.27
2: GOOG 2017-02-03 814.6600 815.8400 790.520 801.49
Комментарии:
1. В итоге я использовал
lapply
andto.weekly
, чтобы ускорить его. Библиотекаtimetk
упростила преобразование data.table в xts без особых хлопот. Спасибо.