R 数据表优化。 overdraw 财务数据

标签 r performance data.table financial

给定以下包含财务数据的 data.table(3500 万行):

DT:

userId  Date         balance  overdraft (boolean)
600     2014-11-01   -100     1
600     2014-11-02   1000     0
600     2014-11-03   -100     1
600     2014-11-04   -100     1
600     2014-11-05   100      0
600     2014-11-06   100      0
700     2014-11-01   -100     1
700     2014-11-02   1000     0
700     2014-11-03   -100     1
700     2014-11-04   -100     1
700     2014-11-05   -100     1
700     2014-11-06   100      0

案例:

a.- 最大总数。按userId连续 overdraw 天数。

userId  maxConsecutiveOverdraftDays   
600     2
700     3
800     0
900     1
1000    5

在本例中,我执行了以下操作:

acum = FALSE

for (i in 1:nrow(DT)) {

    if (DT[i]$overdraft == 1 ) {
      if (acum == TRUE) 
  {

        DT[i]$acumBalance <- DT[i]$balance + DT[i-1]$balance 
        DT[i]$totalConsecutiveOverdraftDays   <- DT[i]$overdraft + DT[i-1]$overdraft
  }

      if (DT[i]$userId == DT[i+1]$userId 
      && DT[i+1]$overdraft == 1 ) 
  {

        acum = TRUE
  }  
    else { acum = FALSE }
}
}

DT[,maxConsecutiveOverdraftDays:=max(totalConsecutiveOverdraftDays),by=userId]

需要超过 12 个小时才能完成。

如何改进代码并减少计算时间?

提前致谢。

最佳答案

不能说这是否会帮助您解决性能问题,但是 rle 在这里对于漂亮的短代码很有帮助。由于 overdraw 的值始终为零或一,因此我们可以取长度和值的乘积的最大值:

> aggregate(overdraft~userId, df, FUN=function(x) {
+   r <- rle(x)
+   max(r$lengths * r$values)
+ })
  userId overdraft
1    600         2
2    700         3

关于R 数据表优化。 overdraw 财务数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27494849/

相关文章:

r - 如何在 R 中拟合自回归泊松混合模型(计数时间序列)?

r - 检查其他 data.table 中 data.table 值的频率

r - 如何在 R 中使用 pivot_longer() 按类别将列分成多行?

r - 优化每行数据表的调用函数

r - 在 R 中的贷款建模中应用 Reduce()

r - 仅包含数据框中每一列的异常值

r - 找到 x 轴上对应于 cdf 交点的两个点

MySQL 联合性能问题

java - 优化获取上一条记录和下一条记录的方式

java - 加速多个 JDBC SQL 查询?