R 最大客户敞口-按报告月份拆分报告余额并动态分配

R 最大客户敞口-按报告月份拆分报告余额并动态分配,r,strsplit,R,Strsplit,我有一系列报告的余额和信用信息局报告的月份。我想按报告的月份计算消费者的风险敞口。我有大约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,

我有一系列报告的余额和信用信息局报告的月份。我想按报告的月份计算消费者的风险敞口。我有大约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,如下所示:

df <- data.frame("id" = c(1,1)
            ,"c201708"=c(12455,0)
            ,"c201707"=c(14085,0)
            ,"c201706"=c(16940,1260)
            ,"c201505"=c(0,2467))
后来我打算将他的余额分为几个月,并取最大值


任何帮助都将不胜感激

下面是一个使用
tidyverse
的想法。我们将字符串和
unest
数据帧拆分为长格式。我们转换为datetime(
as.POSIXct
),并使用
格式
仅获取年/月。我们将其分组,创建一个新变量,使用每组长度的
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)
这就给了,

#一个tible:2 x 6
id新'201705``201706``201707``201708`
*                  
1     1     1     2467    16940    14085    12455
2     1     2          1260        0     

注意:您可以添加
…%>%在末尾选择(-new)
以删除变量
new
。如果需要,还可以使用
rename
更改列名。

这里有一个使用
tidyverse
的主意。我们将字符串和
unest
数据帧拆分为长格式。我们转换为datetime(
as.POSIXct
),并使用
格式
仅获取年/月。我们将其分组,创建一个新变量,使用每组长度的
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)
这就给了,

#一个tible:2 x 6
id新'201705``201706``201707``201708`
*                  
1     1     1     2467    16940    14085    12455
2     1     2          1260        0     

注意:您可以添加
…%>%在末尾选择(-new)
以删除变量
new
。如果需要,
rename
也可以用来更改列名。

这对我来说很有效(已经用los\u app\u id替换了id)。'“数据”是保存原始数据的数据帧。通过拆分和取消列出结果创建DFlong df。使用过去36个月的列表筛选出较旧的报告余额。使用重塑2包的dcast获取每个los_应用程序id的总余额的月度视图(使用总和获取总余额)。现在获得这些列的最大值很容易

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')]

DFlong这对我来说很有效(已经用los\u app\u id代替了id)。'“数据”是保存原始数据的数据帧。通过拆分和取消列出结果创建DFlong df。使用过去36个月的列表筛选出较旧的报告余额。使用重塑2包的dcast获取每个los_应用程序id的总余额的月度视图(使用总和获取总余额)。现在获得这些列的最大值很容易

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')]

DFlongis报告的日期和余额总是作为三条记录一起出现。或者它也可以大于或小于3?2017年6月没有31日余额可以在该月的任何一天报告过去36个月的余额。我的想法是,先得到客户每个月的余额,然后再得到他在过去36个月内的最大风险敞口。报告日期和余额总是作为三个记录一起出现。或者它也可以大于或小于3?2017年6月没有31日余额可以在该月的任何一天报告过去36个月的余额。我的想法是获得客户每月的余额,然后获得他在过去36个月内的最大敞口。我没有尝试过上述方法,但我注意到5月17日第二次观察的余额已转移到第一次观察。我想当我有多个客户并且需要在客户级别(在上面的案例id中)对余额进行分组时,这将是一个问题。你是什么意思?17年5月只有一个观察结果我试图在我的办公室笔记本电脑上安装“tidyverse”,但安装失败(可能是因为R版本,我的版本是3.3.1),因此我无法使用上述解决方案。有没有别的办法呢。它在BaseR中可行吗?我一直在使用“重塑2”软件包。拆分字符串后,我取消了它们的列表,然后使用dcast将它们转换为宽格式。虽然这在较小的数据集上运行良好,但我不确定当它必须将约200万行从宽格式转换为长格式,从而产生约500-600万行时,它将如何运行。今天我将通过在服务器上运行它来尝试一下。希望这样行。哦,200万行不是那么大。我不知道为什么你不能安装
tidyverse
。我将尝试添加一个包含
数据的解决方案。table
tidyverse
方法更快。我还没有尝试过上述方法,但我注意到2017年5月第二次观察的平衡已转移到第一次观察。我想当我有多个客户并且需要在客户级别(在上面的案例id中)对余额进行分组时,这将是一个问题。你是什么意思?17年5月只有一个观察结果我试图在我的办公室笔记本电脑上安装“tidyverse”,但安装失败(可能是因为R版本,我的版本是3.3.1),因此我无法使用上述解决方案。有没有别的办法呢。它在BaseR中可行吗?我一直在使用“重塑2”软件包。拆分字符串后,我取消了它们的列表,然后使用dcast将它们转换为宽格式。虽然这在较小的数据集上运行良好,但我不确定当它必须将约200万行从宽格式转换为长格式,从而产生约500-600万行时,它将如何运行。今天我将通过在服务器上运行它来尝试一下。希望这样行。哦,200万行不是那么大。我不知道为什么你不能安装
tidyverse
。我会的
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')]