[英]Conditional Cumulative Sum in R
我有一個時間序列數據框,並希望計算一系列日期內的股票代碼的累積回報。 當符號和/或日期更改時,應重置累積回報。 任何幫助,將不勝感激。 我的數據框的一小部分樣本如下,包括累積總和列應返回的內容。 謝謝。
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%
使用data.table
包這是微不足道的。 如果您的數據位於名為dat
的data.frame
:
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')]
在您的特定示例中,執行:
DT[, Return := as.numeric(sub('%$', '', Return))]
DT[!is.na(Return), Cumulative.Sum := cumsum(Return), by = c('Date', 'Symbol')]
這是拆分應用組合策略的典型情況:您通過特定列(日期和符號)的唯一組合拆分data.frame
, cumsum
集應用過程(返回時為cumsum
)並將子集合並回大data.frame
。 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
示例數據(注意:我使用了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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.