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)

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")

Возможно, вам будет легче понять 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.

Другие вопросы по тегам