我有一个时间序列数据框,想要计算一系列日期的股票代码的累积回报。当符号和/或日期更改时,应重置累积回报。任何帮助,将不胜感激。我的数据框的一小部分样本如下,包括累积总和列应返回的内容。谢谢。
Date Symbol Time Last Return Cumulative.Sum
1 1/2/2013 AA 9:30 42.00 n/a n/a
2 1/2/2013 AA 12:00 42.50 1.19% 1.19%
3 1/2/2013 AA 16:00 42.88 0.89% 2.08%
4 1/2/2013 AAPL 9:30 387.00 n/a n/a
5 1/2/2013 AAPL 12:00 387.87 0.22% 0.22%
6 1/2/2013 AAPL 16:00 388.69 0.21% 0.44%
7 1/3/2013 AA 9:30 42.88 n/a n/a
8 1/3/2013 AA 12:00 42.11 -1.80% -1.80%
9 1/3/2013 AA 16:00 41.89 -0.52% -2.32%
答案 0 :(得分:11)
使用data.table
包这是微不足道的。如果您的数据位于名为data.frame
的{{1}}中:
dat
library(data.table)
DT <- data.table(dat)
DT[, your_cumsum_function(.SD), by=c('Date', 'Symbol')]
是.SD
组定义的data.table
的子集。有关详细信息,请参阅by
。
您也可以直接传递列名:
?data.table
在您的特定示例中,执行:
DT[, your_cumsum_function(Last), by=c('Date', 'Symbol')]
答案 1 :(得分:10)
这是split-apply-combine策略的典型案例:您通过特定列(日期和符号)的唯一组合拆分data.frame
,对子集(cumsum
)应用过程返回)并将子集组合回一个大的data.frame
。这可以通过ddply
包中的plyr
轻松实现:
mdf$Return <- as.numeric(sub( "(\\d+\\.\\d+)\\%", "\\1", mdf$Return ))
mdf$Return[ is.na(mdf$Return) ] <- 0
library(plyr)
ddply(mdf, .(Date,Symbol), transform, Cumulative.Sum = cumsum(Return))
Date Symbol Time Last Return Cumulative.Sum
1 1/2/2013 AA 9:30 42.00 0.00 0.00
2 1/2/2013 AA 12:00 42.50 1.19 1.19
3 1/2/2013 AA 16:00 42.88 0.89 2.08
4 1/2/2013 AAPL 9:30 387.00 0.00 0.00
5 1/2/2013 AAPL 12:00 387.87 0.22 0.22
6 1/2/2013 AAPL 16:00 388.69 0.21 0.43
7 1/3/2013 AA 9:30 42.88 0.00 0.00
8 1/3/2013 AA 12:00 42.11 -1.80 -1.80
9 1/3/2013 AA 16:00 41.89 -0.52 -2.32
答案 2 :(得分:1)
示例数据(注意:我使用lubridate
库只是为了调用dmy
函数)
library(lubridate)
df <- data.frame(
Date = dmy( c( "1/2/2013", "1/2/2013", "1/2/2013", "1/2/2013"
, "1/2/2013", "1/2/2013", "1/3/2013", "1/3/2013", "1/3/2013" ) ),
Symbol = c( "AA", "AA", "AA", "AAPL", "AAPL", "AAPL", "AA", "AA", "AA" ),
Return = c( NA, 1.19, 0.89, NA, 0.22, 0.21, NA, -1.80, -0.52 )
)
现在,使用dplyr
,您可以group_by
创建数据框并创建所需的列Cum_Sum
:
library(dplyr)
df %>% group_by(Date, Symbol) %>%
mutate( Return_aux = ifelse( is.na(Return), 0, Return ), #remove NA
Cum_Sum = cumsum(Return_aux) )
# A tibble: 9 x 5
# Groups: Date, Symbol [3]
Date Symbol Return Return_aux Cum_Sum
<date> <fct> <dbl> <dbl> <dbl>
1 2013-02-01 AA NA 0 0
2 2013-02-01 AA 1.19 1.19 1.19
3 2013-02-01 AA 0.89 0.89 2.08
4 2013-02-01 AAPL NA 0 0
5 2013-02-01 AAPL 0.22 0.22 0.22
6 2013-02-01 AAPL 0.21 0.21 0.43
7 2013-03-01 AA NA 0 0
8 2013-03-01 AA -1.8 -1.8 -1.8
9 2013-03-01 AA -0.52 -0.52 -2.32