Avaliação da estrutura da carteira de crédito em R

Durante as discussões, surgiu uma "pequena" tarefa - construir a dinâmica da estrutura da carteira de crédito (dinâmica de um cartão de crédito, por exemplo). Há uma especificidade importante - é necessário aplicar o método FIFO para pagar os empréstimos. Aqueles. ao pagar, os primeiros empréstimos devem ser pagos primeiro. Isso impõe certos requisitos no cálculo da situação de cada empréstimo individual e na determinação de sua data de vencimento.







Considere isso como um problema de olimpíada. Sem “ prêmios de energia sangrentos ” e código de pedalada, a abordagem é exclusivamente “ pense primeiro ”. Não mais do que uma tela de código por protótipo e nenhum loop (integrado para desempenho e legibilidade). Abaixo está o código R com uma abordagem de protótipo.







É a continuação de uma série de publicações anteriores .







Decomposição



Como fazemos tudo do zero, dividimos a tarefa em três etapas:







  1. Formação de dados de teste.
  2. Cálculo da data de vencimento de cada empréstimo.
  3. Cálculo e visualização da dinâmica para uma determinada janela de tempo.


Suposições e disposições para o protótipo:







  1. Granularidade atualizada. Apenas uma transação em uma data. Se houver várias transações em um dia, seu pedido deverá ser estabelecido (para cumprir o princípio FIFO). Você pode usar adicionar. índices, você pode usar unixtimestamp, você pode inventar outra coisa. Isso é irrelevante para o protótipo.
  2. Não for



    deve haver nenhum loop explícito . Não deve haver cópias desnecessárias. Concentre-se no consumo mínimo de memória e no desempenho máximo.
  3. Consideraremos os seguintes grupos de atrasos: "<0", "0-30", "31-60", "61-90", "90+".


Etapa 1. Gerando o conjunto de dados



Apenas um conjunto de dados de teste, todas as correspondências são aleatórias. Para cada usuário, geraremos cerca de 10 registros. Para os cálculos, assumimos que o valor do empréstimo é positivo e o reembolso é negativo. E todo o ciclo de vida de cada usuário deve começar com um empréstimo.







Geração de conjunto de dados
library(tidyverse)
library(lubridate)
library(magrittr)
library(tictoc)
library(data.table)

total_users <- 100

events_dt <- tibble(
  date = sample(
    seq.Date(as.Date("2021-01-01"), as.Date("2021-04-30"), by = "1 day"),
    total_users * 10,
    replace = TRUE)
  ) %>%
  #    50 .
  mutate(amount = (runif(n(), -2000, 1000)) %/% 50 * 50) %>%
  #   
  mutate(user_id = sample(!!total_users, n(), replace = TRUE)) %>%
  setDT(key = "date") %>%
  #     
  .[.[, .I[1L], by = user_id]$V1, amount := abs(amount)] %>%
  #        , 
  #          
  #       
  unique(by = c("user_id", "date"))
      
      





Etapa 2. Calcule a data de vencimento de cada empréstimo



data.table



permite que você altere objetos por referência, mesmo dentro de funções, vamos usar isso ativamente.







Cálculo da data de vencimento
#  
accu_dt <- events_dt[amount < 0, .(accu = cumsum(amount), date), by = user_id]

ff <- function(dt){
  #           
  #   
  accu_dt[dt, amount := i.amount, on = "user_id"]
  accu_dt[is.na(amount) == FALSE, accu := accu + amount][accu > 0, accu := NA, by = user_id]
  calc_dt <- accu_dt[!is.na(accu), head(date, 1), by = user_id]

  #     data.frame,   
  calc_dt[dt, on = "user_id"]$V1
}

repay_dt <- events_dt[amount > 0] %>%
  .[, repayment_date := ff(.SD), by = date] %>%
  .[order(user_id, date)]
      
      





Etapa 3. Cálculo da dinâmica da estrutura para o período



Cálculo de dinâmica
calcDebt <- function(report_date){
  as_tibble(repay_dt) %>%
    #  ,      
    filter(is.na(repayment_date) | repayment_date > !! report_date) %>%
    mutate(delay = as.numeric(!!report_date - date)) %>%
    #  
    mutate(tag = santoku::chop(delay, breaks = c(0, 31, 61, 90),
                               labels = c("< 0", "0-30", "31-60", "61-90", "90+"),
                               extend = TRUE, drop = FALSE)) %>%
    #  
    group_by(tag) %>%
    summarise(amount = sum(amount)) %>%
    mutate_at("tag", as.character)
}

#   
df <- seq.Date(as.Date("2021-04-01"), as.Date("2021-04-30"), by = "1 day") %>%
  tibble(date = ., tbl = purrr::map(., calcDebt)) %>%
  unnest(tbl)

#  
ggplot(df, aes(date, amount, colour = tag)) +
  geom_point(alpha = 0.5, size = 3) +
  geom_line() +
  ggthemes::scale_colour_tableau("Tableau 10") +
  theme_minimal()
      
      





Podemos obter algo assim.







Uma tela de código, conforme necessário.







Post anterior - "Storytelling R Report vs. BI, A Pragmatic Approach . "








All Articles