R: импорт и преобразование данных CRSP в xts-объект

Я скачал исторические цены на акции в США из базы данных CRSP через веб-сайт WRDS.

Я могу импортировать файл .csv, но мой подход к тому, чтобы правильно разместить его в xts-объекте, по крайней мере неудобен. При более длительных периодах времени и большем количестве данных после разделения исходного кадра данных в соответствии с каждым идентификатором список кадров данных увеличивается до десятков гигабайт. Поэтому я ищу более эффективный подход, чтобы скрыть фрейм данных, состоящий из простого списка, в готовый к использованию xts-объект.

Структура фрейма данных после импорта: (запасы перечислены друг под другом)

> head(dataf)
  ï..Names.Date PERMNO Price.adjusted
1    31/01/2014  10104          36.90
2    28/02/2014  10104          39.11
3    31/03/2014  10104          40.91

Желаемый формат в xts-объекте:

> dat[1:3,1:19]
         X10104 X10107 X11308 X11587 X11628 X11850 X12060 X12072 X12400 
Jan 2014  36.90  37.84  37.82 267.18  18.35  92.16  25.13  17.74  53.53  
Feb 2014  39.11  38.31  38.20 289.43  19.73  96.27  25.47  18.43  53.68  
Mar 2014  40.91  40.99  38.66 306.14  20.20  97.68  25.89  18.25  52.54  

Мой подход:

#read CSV into a data frame
dataf <- read.csv(file = "us-data14-16.csv", header = TRUE, sep = ";", fill = TRUE)

#data preprocessing, deletes objects with price = 0
dataf <- dataf[dataf[, 3] != 0, ]

#split list according to ticker in a list of data frames
dataf <- split(dataf, f= dataf[,2])

#get identifier
id <- names(dataf)

#convert data frames into xts objects
datax <- lapply(dataf, function(x) xts(x$Price.adjusted, as.yearmon(x[,1], "%d/%m/%Y")))

#set column name according to ticker (loop through every element in the list)
sapply(seq_along(datax), function(x) colnames(datax[[x]]) <<- id[x])

#merge list of xts objects in one xts object
dat <- do.call(merge, datax)

person user169340    schedule 19.07.2017    source источник


Ответы (2)


Вам нужно использовать функцию изменения формы с таким же широким направлением.

df = data.frame(Names.Date= rep(seq(1:10), 10), PERMNO=sort(rep(seq(from= 101, to=110), 10)), Price.adjusted=rnorm(100))
reshape(df, idvar = "Names.Date", timevar = "PERMNO", direction = "wide")
person gopal krishna varshney    schedule 19.07.2017

Возможно, вам будет легче понять read.zoo и его split аргумент. Функцию reshape бывает трудно запомнить, как ее использовать. Во-первых, несколько примеров данных, взятых из одной из виньеток зоопарка.

dataf <- structure(list(V1 = c("13/10/2010", "13/10/2010", "13/10/2010", 
"14/10/2010", "14/10/2010", "14/10/2010", "15/10/2010", "15/10/2010", 
"15/10/2010"), V2 = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
 V3 = c(23L, 12L, 124L, 43L, 54L, 65L, 43L, NA, 65L)),
.Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -9L))

Затем используйте read.zoo для преобразования data.frame в объект зоопарка.

z <- read.zoo(dataf, format = "%d/%m/%Y", split = 2)
z
#             A  B   C
# 2010-10-13 23 12 124
# 2010-10-14 43 54  65
# 2010-10-15 43 NA  65

Вы можете вызвать as.xts(z), если хотите преобразовать z в объект xts.

person Joshua Ulrich    schedule 20.07.2017
comment
Работает также отлично, может быть, даже более интуитивно понятно. К сожалению, слишком низкая репутация, чтобы проголосовать за ответ. - person user169340; 22.07.2017