2017-09-19 5 views
0

J'ai une série de mois déclarés par le bureau d'information sur le crédit. Je veux calculer l'exposition du consommateur par mois rapporté. J'ai ~ 2 millions de disques à traiter et je suis à la recherche d'une solution dans l'affaire R.Exposition maximale du solde déclaré par division des clients par mois déclaré et attribution dynamique

données 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 

je veux un o/p comme ci-dessous:

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 

plus tard, j'ai l'intention de regrouper son solde chaque mois et de prendre le maximum de celui-ci.

Toute aide sera appréciée.

+0

est la date signalée et la balance est toujours composée de trois enregistrements. ou il peut être supérieur ou inférieur à trois aussi? –

+0

Juin 2017 n'a pas 31 – Sotos

+0

le solde peut être signalé pour les 36 derniers mois sur n'importe quel jour du mois. Idéale pour obtenir l'équilibre du client dans chaque mois et ensuite obtenir son exposition maximale qu'il a jamais eu au cours des 36 derniers mois. – AmreshKumar

Répondre

0

C'est ce qui a fonctionné pour moi (j'ai remplacé l'id par los_app_id). 'data' est la base de données qui contient les données brutes. Création d'une DFlong df en divisant et en désélectionnant le résultat. Utilisé une liste des 36 derniers mois pour filtrer les anciens soldes déclarés. Utilisé dcast du paquet reshape2 pour obtenir une vue mensuelle des soldes totaux pour chaque los_app_id (somme utilisée pour obtenir le total). Obtenir le maximum de ces colonnes était facile.

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

Voici une idée utilisant tidyverse. Nous divisons les chaînes et unnest la trame de données dans un format long. Nous convertissons en datetime (as.POSIXct) et utilisons format pour obtenir seulement l'année/mois. Nous regroupons à ce sujet, créer une nouvelle variable avec le seq de la longueur de chaque groupe (afin d'éviter les identificateurs en double), et nous utilisons spread pour convertir au format large, à savoir

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) 

qui donne,

# 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> 

NOTE: Vous pouvez ajouter ... %>% select(-new) à la fin pour enlever la new variable. En outre rename peut être utilisé pour modifier vos noms de colonne si nécessaire.

+0

N'a pas essayé la méthode ci-dessus mais je remarque que le solde de la 2ème observation de May'17 s'est déplacé à la 1ère observation. Je suppose que ce sera un problème quand j'ai plusieurs clients et que j'ai besoin de regrouper les soldes au niveau du client (dans l'identifiant de cas ci-dessus). – AmreshKumar

+0

Que voulez-vous dire? Il y a seulement 1 observation pour Mai '17 – Sotos

+0

J'ai essayé d'obtenir 'tidyverse' installé sur mon ordinateur portable de bureau mais l'installation échoue (peut être due à la version R, la mienne est 3.3.1) et donc je ne suis pas capable d'utiliser le solution ci-dessus. Y a-t-il une autre façon de le faire? Est-ce faisable en base R? – AmreshKumar