【问题标题】:Conditional Cumulative Sum in RR中的条件累积和
【发布时间】:2013-05-20 10:49:51
【问题描述】:

我有一个时间序列数据框,想计算某个日期范围内股票代码的日内累积回报。当代码和/或日期发生变化时,累积回报应重置。任何帮助,将不胜感激。下面是我的数据框的一个小样本,包括累积总和列应该返回的内容。谢谢。

       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%

【问题讨论】:

  • 我希望这些是日志返回...
  • 在我发布的示例数据中,没有。在我的真实数据框中,是的日志返回

标签: r cumsum


【解决方案1】:

使用data.table 包这很简单。如果您的数据位于名为datdata.frame 中:

library(data.table)
DT <- data.table(dat)

DT[, your_cumsum_function(.SD), by=c('Date', 'Symbol')]

其中.SDby 组定义的data.table 的子集。请参阅?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')]

【讨论】:

    【解决方案2】:

    这是split-apply-combine 策略的典型案例:您通过某些列(日期和符号)的唯一组合拆分您的data.frame,对子集应用一个过程(cumsum on Return)并组合子集回到大data.frame。这可以通过来自plyr 包的ddply 轻松实现:

    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
    

    【讨论】:

      【解决方案3】:

      示例数据(注意:我使用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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-04
        相关资源
        最近更新 更多