【发布时间】:2014-04-07 22:41:52
【问题描述】:
我有一些高格式的(金融时间序列)数据:
require(data.table)
DT <- data.table(Variable=c(rep("a",times = 3), rep("b", times=3)),
Date=as.Date(c("2014-04-01","2014-04-02","2014-04-03"
,"2014-04-02", "2014-04-03","2014-04-04")),
Value=c(1:3,3:1), key=c("Variable","Date"))
DT
Variable Date Value
1: a 2014-04-01 1
2: a 2014-04-02 2
3: a 2014-04-03 3
4: b 2014-04-02 3
5: b 2014-04-03 2
6: b 2014-04-04 1
我想计算第三个变量spread,其中spread = a - b 对应每个常见的Date 行(基本上是两个时间序列之间的差值——金融领域的常见转换)。
期望的输出:
Variable Date Value
1: spread 2014-04-02 -1
2: spread 2014-04-03 1
我知道当我将dcast.data.table 数据转换为宽格式(即转换为具有列c("Date", "a", "b") 的表)时的解决方案,但是由于大数据的性能问题,有没有一种优雅的方法可以直接在tall 格式使用 a)dplyr 和 b)data.table(两部分问题)?
理想情况下,在dplyr 方面,我正在寻找像mutate(tbl_dt(DT, tall=TRUE), spread=a-b) 这样富有表现力的东西。 (免责声明:我是dplyr 的新手)
真实数据集:
# download 200 stocks from Quandl.com. requires free registration
library(Quandl); library(data.table); library(plyr)
ntickers <- 200 ; auth.token="register_free_to_obtain_token"
code.file <- tempfile()
download.file("https://s3.amazonaws.com/quandl-static-content/quandl-stock-code-list.csv",
destfile=code.file)
tickers <- na.omit(read.csv2(code.file, sep=",", stringsAsFactors=FALSE)[,"Price.Code"])
lst <- na.omit(tickers)[1:ntickers]
names(lst) <- lst
Q <- ldply(lst, Quandl,
type = "raw", end_date="2014-04-08",
sort="asc", auth=auth.token) # might take minutes
DT <- as.data.table(Q)[,Date:=as.IDate(Date)]
setnames(DT, ".id", "Instrument")
setkey(DT, Instrument, Date)
> dim(DT); object.size(DT)
[1] 685512 8
41145752 bytes
> DT
Instrument Date Open High Low Close Volume Adjusted Close
1: GOOG/AMEX_ABI 1981-03-11 NA NA 6.56 6.75 217200 NA
2: GOOG/AMEX_ABI 1981-03-12 NA NA 6.66 6.88 616400 NA
3: GOOG/AMEX_ABI 1981-03-13 NA NA 6.81 6.84 462000 NA
4: GOOG/AMEX_ABI 1981-03-16 NA NA 6.81 7.00 306400 NA
5: GOOG/AMEX_ABI 1981-03-17 NA NA 6.88 6.88 925600 NA
---
685508: YAHOO/TSX_AHX_TO 2014-04-02 0.75 0.75 0.75 0.75 5000 0.75
685509: YAHOO/TSX_AHX_TO 2014-04-03 0.79 0.82 0.75 0.82 25700 0.82
685510: YAHOO/TSX_AHX_TO 2014-04-04 0.81 0.81 0.78 0.80 4500 0.80
685511: YAHOO/TSX_AHX_TO 2014-04-07 0.80 1.05 0.80 0.96 40400 0.96
685512: YAHOO/TSX_AHX_TO 2014-04-08 0.95 0.96 0.90 0.95 21300 0.95
【问题讨论】:
-
假设 500 万行 * 3 列(1000 个仪器,每个仪器每天都有 20 年的历史)是的,我知道
dcast.data.table,这就是我的想法。问题已编辑 -
可能发生在任何地方(数据间隙、假期等)。此外,
a和b在日期组中的位置事先不知道,并且可能还有其他变量,所以这需要按变量名 (a - b) 引用/子集,而不是按位置 (Value[1] - Value[2]),抱歉不清楚 -
我可以生成一些典型的大样本(多变量价格数据),因为这是金融中反复出现的主题。在 SO,链接到 Google Drive 上共享多 MB 数据的常用方法是什么?
-
@Arun 您删除的解决方案似乎是最直接的方法(顺便说一句,过滤 NA 可能比在
if期间这样做更便宜) - 为什么 将其删除? -
@Arun 包含用于更大数据集下载的代码
标签: r data.table dplyr