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.