客户的最大风险 - 按报告月份拆分报告余额并动态分配

Maximum exposure of customer - splitting reported balance by reported month and dynamically assigning it

我有一串来自信用信息局的报告余额和报告月份。我想按报告月份计算消费者的曝光率。我有大约 200 万条记录要处理,我正在寻找 R 中的解决方案。

I/P数据:

df <- data.frame("id" = c(1,1)
,"reported_date_hist" = c("20170830,20170728,20170630",
                          "20170730,20170620,20170525")

,"cur_bal_hist" = c("12455,14085,16940",
                "0,1260,2467"))

o/p:

  id         reported_date_hist      cur_bal_hist
1  1 20170830,20170728,20170631      12455,14085,16940
2  1 20170730,20170620,20170525      0,1260,2467

我想要一个 o/p 如下:

df <- data.frame("id" = c(1,1)
            ,"c201708"=c(12455,0)
            ,"c201707"=c(14085,0)
            ,"c201706"=c(16940,1260)
            ,"c201505"=c(0,2467))

o/p:

  id c201708 c201707 c201706 c201505
1  1   12455   14085   16940       0
2  1       0       0    1260    2467

以后打算把他每个月的余额都分组,取最大值

如有任何帮助,我们将不胜感激。

这是一个使用 tidyverse 的想法。我们将字符串和 unnest 数据框拆分为长格式。我们转换为日期时间 (as.POSIXct) 并使用 format 只得到 year/month。我们以此为基础分组,创建一个新变量,每个组的长度为seq(为了避免标识符重复),我们使用spread转换为宽格式,即

library(tidyverse)

df %>% 
 mutate(reported_date_hist = strsplit(as.character(reported_date_hist), ','), 
        cur_bal_hist = strsplit(as.character(cur_bal_hist), ',')) %>% 
 unnest() %>% 
 mutate(reported_date_hist = format(as.POSIXct(reported_date_hist, format = '%Y%m%d'), 
                                                                     format = '%Y%m')) %>% 
 group_by(reported_date_hist) %>% 
 mutate(new = seq(n())) %>% 
 spread(reported_date_hist, cur_bal_hist)

这给出了,

# A tibble: 2 x 6
     id   new `201705` `201706` `201707` `201708`
* <dbl> <int>    <chr>    <chr>    <chr>    <chr>
1     1     1     2467    16940    14085    12455
2     1     2     <NA>     1260        0     <NA>

注意:您可以在末尾添加... %>% select(-new)以删除变量new。如果需要,rename 也可用于更改您的列名称。

这对我有用(已将 id 替换为 los_app_id)。 'data' 是保存原始数据的数据框。通过拆分和取消列出结果创建了一个 DFlong df。使用最近 36 个月的列表来过滤掉较旧的报告余额。使用 reshape2 包的 dcast 获得每个 los_app_id 的总余额的月视图(使用 sum 获得总数)。现在获取这些列的最大值很容易。

DFlong<- data.frame(los_app_id = rep.int(data$los_app_id, sapply(strsplit(as.character(data$reported_date_hist), ','), length)), 
                yearMM = unlist(strsplit(as.character(data$reported_date_hist), ',')),
                bal    = unlist(strsplit(as.character(data$cur_bal_hist), ',')))

DFlong$yearMM  <-  gsub("","",DFlong$yearMM)

DFlong$yearMM <- format(as.POSIXct(DFlong$yearMM, format = '%Y%m%d'), format = '%Y%m')

last36months <- seq(as.Date(Sys.Date()), length=36, by="-1 month")
last36months <- format(as.POSIXct(last36months, format = '%Y-%m-%d'), format = '%Y%m')

DFlong$bal  <-  gsub("","",DFlong$bal)
DFlong$bal <- as.numeric(DFlong$bal)
require(reshape2)
DFwide <- dcast(DFlong, los_app_id~yearMM, sum, na.rm=TRUE)
DFwide$Maximum_Indebtedness <- apply(DFwide[2:ncol(DFwide)],1,max, is.na= FALSE, na.rm = TRUE)

result <- DFwide[,c('los_app_id','Maximum_Indebtedness')]