2015-05-07 4 views
2

Я работаю с большим количеством данных о валютной паре большого количества времени в R. Файлы имеют размер 100-300 МБ, и я обычно буду работать с 3 файлами за раз. Я ищу (намного) более эффективный способ рассмотрения столбца TIME этих данных.Эффективные временные ряды в R

Мои данные начинает выглядеть как:

PAIR TIME     BID ASK 
1 USD/JPY 2012-01-02 00:00:00.307 77.023 77.055 
2 USD/JPY 2012-01-02 00:00:00.493 77.030 77.049 
3 USD/JPY 2012-01-02 00:00:05.003 77.030 77.050 
4 USD/JPY 2012-01-02 00:00:05.005 77.023 77.056 
5 USD/JPY 2012-01-02 00:00:05.006 77.024 77.056 
6 USD/JPY 2012-01-02 00:00:06.008 77.023 77.056 
...  ...      ... ... 

R не имеет никаких проблем с пониманием столбец TIME. Например,

USDJPY$TIME[2] - USDJPY$TIME[1] 

Придает OUTPUT

Time difference of 0.1860001 secs 

данные уже организованы в виде файлов в месяц. К сожалению, это слишком много. Я хотел бы разбить данные о ценах на «торговую неделю»

Торговля на Форекс происходит в непрерывных многодневных трассах, обычно с понедельника по пятницу. Некоторые торговые праздники приостановят торговлю, и в эти дни данных не будет. Характер торгового планирования такова, что, если

USDJPY$TIME[t+1] - USDJPY$TIME[t] 

... больше 12 часов, время т последний индекс времени на этой неделе в USDJPY.

Я не нашел приемлемого способа разбить данные на торговые недели, по индексам или иным образом. Все мои попытки в конечном итоге висят. Файл USDJPY содержит ~ 1 900 000 строк.

Один подход, который я пробовал:

for(i in 1:(length(USDJPY$TIME)-1)){ 
    USDJPY.diff <- c(USDJPY.diff, USDJPY$TIME[i+1]-USDJPY$TIME[i]) 
} 

занимает слишком много времени (я бросить курить, прежде чем он смог закончить)

+0

Вы пробовали сделать смещение вектора (тот же вектор, только запаздывающий) и вычитания вектора все сразу? например 'early_time <- c (USDJPY $ TIME, NA) later_time <- c (NA, USDJPY $ TIME) time_diff <- later_time - early_time' – goodtimeslim

+0

Что вы хотите, чтобы ваш результат выглядел? Это кажется идеальным для пакета 'data.table'. Он должен иметь возможность обрабатывать 1,9 миллиона строк в секундах. –

+0

Я хочу, чтобы вывод был индексом последней строки в каждой временной группе (торговая неделя). поэтому, если эти индексы начинаются как 113987, 245776, 342811, ... вывод должен быть вектором, списком или data.table –

ответ

2

Я думаю data.table должен ускорить процесс здесь совсем немного:

library(data.table) #1.9.5 
setDT(data) 
data[, DIFF := as.numeric(TIME-shift(TIME,n=1,type="lag"))] 

Номер недели (приращение с разницей больше 12 часов)

data[, Week.num := cumsum(DIFF>12)] 
+0

. Я должен как-то определять DIFF? как насчет сдвига? Я собираюсь поиграть с data.table и посмотреть, как скорость улучшилась, но я запустил библиотека (data.table) # 1.9.5 setDT (USDJPY) USDJPY [, DIFF: = as.numeric (TIME-shift (TIME, n = 1, type = "lag"))] и получить ошибку data.table 1.9.4 Тип справки:? Data.table *** NB: by = .EACHI теперь явно. См. README для восстановления предыдущего поведения. Ошибка в eval (expr, envir, enc): не удалось найти функцию «shift» Кроме того: Предупреждающее сообщение: Пакет 'data.table' был построен под R версии 3.1.3 –

+0

Вам нужно будет скачать 'data.table' версию 1.9.5, сначала https://github.com/Rdatatable/data.table/wiki/Installation –

+0

, что отличается между версией github и версией cran, которая изменит функциональность для меня? –

Смежные вопросы