簡體   English   中英

R中的條件累積和

[英]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包這是微不足道的。 如果您的數據位於名為datdata.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.framecumsum集應用過程(返回時為cumsum )並將子集合並回大data.framedata.frame 這可以容易地實現ddplyplyr包:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM