(неправильно) понимать `first` в` xts` - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь использовать функцию xts first, чтобы посмотреть первую или две недели моего объекта xts. Я использовал first раньше, и он ведет себя как ожидалось. Вот хороший пример:

library(quantmod)                                                                                
getSymbols('IBM', from='2000-01-01', to='2000-12-31')                                            
first(IBM, "week")  

#>            IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875  116.0000   10347700     81.97214
#> 2000-01-04 114.0000 114.5000 110.875  112.0625    8227800     79.18969
#> 2000-01-05 112.9375 119.7500 112.125  116.0000   12733200     81.97214
#> 2000-01-06 118.0000 118.9375 113.500  114.0000    7971900     80.55885
#> 2000-01-07 117.2500 117.9375 110.625  113.5000   11856700     80.20554

first(IBM, "2 weeks")                                                                            
#>            IBM.Open IBM.High IBM.Low IBM.Close IBM.Volume IBM.Adjusted
#> 2000-01-03 112.4375 116.0000 111.875  116.0000   10347700     81.97214
#> 2000-01-04 114.0000 114.5000 110.875  112.0625    8227800     79.18969
#> 2000-01-05 112.9375 119.7500 112.125  116.0000   12733200     81.97214
#> 2000-01-06 118.0000 118.9375 113.500  114.0000    7971900     80.55885
#> 2000-01-07 117.2500 117.9375 110.625  113.5000   11856700     80.20554
#> 2000-01-10 117.2500 119.3750 115.375  118.0000    8540500     83.38549
#> 2000-01-11 117.8750 121.1250 116.625  119.0000    7873300     84.09212
#> 2000-01-12 119.6250 122.0000 118.250  119.5000    6803800     84.44543
#> 2000-01-13 119.9375 121.0000 115.750  118.2500    8489700     83.56213
#> 2000-01-14 120.9375 123.3125 117.500  119.6250   10956600     84.53379

Это полностью соответствует моим ожиданиям. Однако у меня есть этот другой xts объект, который я создал в другом проекте. Единственное отличие (о котором я знаю) состоит в том, что значения были объединены с другим набором данных и интерполированы с помощью сплайна, так что существует значение для первого числа каждого месяца. Таким образом, вместо того, чтобы начинаться с 3 января, этот объект начинается с 1 января (но все еще отсутствует 2-й). Немного сложно воссоздать пошагово, поэтому я просто прочитаю это здесь:

tst <-                                                                                           
structure(c(78.5624741277677, 81.972145, 79.18969, 81.972145,                                    
80.558853, 80.205544, 83.38549, 84.092117, 84.445427, 83.562126,                                 
84.533791, 81.795456, 84.445427, 84.092117, 85.858765, 85.858765,                                
84.180458, 82.502182, 80.205544, 78.836357, 79.322182, 77.732201,                                
80.205544, 82.767128, 81.707153, 80.647171, 84.048004, 83.031113,                                
84.269081, 81.616318, 82.102638, 82.854218, 81.881592, 82.589005,                                
79.58252, 78.521446, 76.929787, 78.167717, 76.399216, 73.923332,                                 
72.685371), .indexCLASS = "Date", .indexTZ = "UTC", tclass = "Date", tzone = "UTC", src = "FRED",
updated = structure(1530873556.5857, class = c("POSIXct",                                        
"POSIXt")), class = c("xts", "zoo"), index = structure(c(946684800,                              
946857600, 946944000, 947030400, 947116800, 947203200, 947462400,                                
947548800, 947635200, 947721600, 947808000, 948153600, 948240000,                                
948326400, 948412800, 948672000, 948758400, 948844800, 948931200,                                
949017600, 949276800, 949363200, 949449600, 949536000, 949622400,                                
949881600, 949968000, 950054400, 950140800, 950227200, 950486400,                                
950572800, 950659200, 950745600, 950832000, 951177600, 951264000,                                
951350400, 951436800, 951696000, 951782400), tzone = "UTC", tclass = "Date"), .Dim = c(41L,      
1L), .Dimnames = list(NULL, "ibm"))                                                              

Теперь, когда я делаю first на данных, я не получаю то, что ожидал:

first(tst, "week")                                                                               
#>                 ibm
#> 2000-01-01 78.56247

Только одно значение? А что, если мы посмотрим на первые две недели?

first(tst, "2 weeks")                                                                            
#>                 ibm
#> 2000-01-01 78.56247
#> 2000-01-03 81.97214
#> 2000-01-04 79.18969
#> 2000-01-05 81.97214
#> 2000-01-06 80.55885
#> 2000-01-07 80.20554

Хорошо, это дает ровно 1 неделю данных. Если я попытаюсь 3 weeks, я получу первые 14 дней месяца.

Что здесь происходит? Кажется, что единственное, что изменилось, - это добавление наблюдения за первое число в мои данные, но это действительно повлияло на поведение first так, как я не придумываю. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 06 июля 2018

Если я не ошибаюсь, xts использует внутренний стандарт ISO 8601. Это означает, что 2000-01-01 относится не к 1-й неделе, а к 52-й неделе. Следовательно, если вы используете first(tst, "week"), вы получите данные за первую неделю в ваших данных, которая является 52-й неделей и содержит только 1 запись.

Если вы делаете:

lubridate::isoweek(tst)
 [1] 52  1  1  1  1  1  2  2  2  2  2  3  3  3  3  4  4  4  4  4  5  5  5  5  5  6  6  6  6  6  7  7  7  7  7  8  8  8  8  9  9

Вы можете видеть, что первая дата начинается на 52 неделе, что соответствует результату из xts.

Также to.weekly(tst) покажет вам, что 2000-01-01 использует только данные за 1 день, а следующая неделя основана на данных с 2000-01-03 по 2000-01-07.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...