Criando um Dataframe com dados randômicos do jeito que você precisa

Aprenda a criar um dataframe randômico e condicional com python que atenda às suas necessidades para testar seus códigos

Vitor Azambuja
8 min readOct 23, 2021

Objetivo

Esses dias eu queria testar um código e eu precisava de uma base específica para testa-lo. Então eu fui atrás de um conhecimento extra e acabei criando um dataframe para eu realizar meus testes exatamente como eu precisava. É muito simples e mesmo você não entendendo muito de python, acredito que conseguirá acompanhar.

Nossa história fictícia

No meu caso, eu queria um dataframe que me traduzisse com uma certa semelhança como seria uma base de originação de cartões. Para você que não conhece muito bem esse mundo do produto financeiro cartão de crédito, vou dar uma breve resumida em como funciona.

Hoje se você vai em um banco ou uma das grandes lojas varejistas, tem a opção de fazer um cartão da loja ou do banco, caso queria. E caso você queira, você vai falar com um atendente em uma loja física ou entrar em um aplicativo, ou no site da empresa emissora do cartão e vai fornecer alguns de seus dados, pois a empresa precisa conhecer você melhor, saber se você tem capacidade de pagar, quanto ela pode lhe oferecer de limite de cartão, entre outras coisas.

Pois bem, a base que eu quero criar é uma base de propostas de cartão solicitadas por clientes para esse banco fictício que vai conter algumas informações de input do cliente e algumas informações de output do sistema do banco. Para isso, eu vou listar abaixo as variáveis exemplo que eu quero ver e que nós vamos criar randomicamente com algumas condições:

  • agencia: Essa variável vai representar o número da agência em que foi feita a proposta. Caso a proposta tenha sido feita via Internet Banking ou aplicativo mobile, elas serão chamadas respectivamente de agência 100 ou 900.
  • decisão: Aqui será mostrado a decisão do banco em relação aquela proposta. A resposta pode ser que a proposta foi aprovada automaticamente pelo sistema, foi negada automaticamente ou foi enviada para uma mesa de análise manual.
  • canal: Essa variável vai nos indicar se a proposta foi feita pelos canais de internet banking, Mobile banking (aplicativo) ou ou feita em uma agência física do banco.
  • DT_PROPOSTA: Autoexplicativa, essa variável informa a data em que a proposta foi realizada.
  • regra: Aqui mostra a regra que a pessoa caiu no motor de crédito do banco. Dependendo das informações fornecidas pela pessoa, ela pode cair em vários tipos de regra diferentes que vão determinar se ela vai ser aprovada, negada ou se vai ter a proposta derivada para análise manual.
  • publico: Aqui distingue se foi uma proposta Pessoa Física ou Sócio de Pessoa Jurídica
  • segmento: Essa variável vai distinguir os proponentes de acordo com sua segmentação de renda, como cliente altíssima renda, alta renda, média renda ou massificado.
  • cheque_especial: Essa variável informará se o cliente optou pelo produto cheque especial no cartão que ele está solicitando, sim ou não.
  • qtd: Para facilitar, vou montar essa base como se ela estivesse agrupada e essa variável vai nos informar a quantidade de propostas somadas naquele perfil.
  • Scores: Aqui eu vou criar 2 scores de crédito (Score A e B) que o nosso banco fictício utiliza. Se você não sabe, o Score de crédito é uma medida estatística e/ou comportamental baseado na capacidade de pagamento das pessoas e os bancos utilizam muito essa variável para tomada de decisões sobre a concessão de crédito.
  • TimeOut Scores: Nesse caso os scores serão uma chamada externa que o sistema do banco faz durante o recebimento dos dados da proposta para descobrir o score dos clientes. E por ser uma chamada externa, as vezes a rede pode oscilar e a chamada pode ser interrompida para não demorar muito. E isso é o que chamamos de TimeOut. Nesse exemplo, vamos ter dados de TimeOut para os 2 scores.
  • Limite: Aqui é o limite concedido pelo banco para os cartões que foram aprovados
  • Lat e Lon: Aqui são os dados de latitude e longitude de onde a proposta foi preenchida.

Acho que com essas informações, já da pra termos um cheiro do que seria uma base do produto cartão de crédito de um banco real. O meu objetivo aqui não é fazer tudo bater 100%. As informações como serão geradas de forma randômica, as vezes não vão fazer sentido com o mundo real (Pode ser que por exemplo, o número de propostas negadas seja muito grande, o que é algo que não seria plausível no mundo real pois), mas ainda assim eu quero fazer com que algumas informações façam sentido umas em relação as outras. Então vamos lá, começar!

Colocando a mão na massa!

Bom, eu vou abrir o editor de texto e começar a codar e sugiro que você me acompanhe fazendo o mesmo.

Primeiro eu vou importar as libs que preciso que são as 3 que estão abaixo. Eu importo a lib warnings e já uso o filterwarnings com action=”ignore” para ignorar os warnings, pois quando nós utilizarmos o método do numpy mais a que gera inteiros randômicos mais a frente, ele vai encher o log do seu terminal de warnings e isso é bem chato (E essa foi a forma que eu resolvi…).

E após isso eu vou criar um dataframe com números inteiros randômicos. No caso abaixo eu estou utilizando np.random.random_integers(20, size=(10000, 9)) e isso significa que eu estou gerando um dataframe com 9 colunas diferentes, 10.000 observações cada que vão receber um inteiro randômico que varia de 1 a 20. Eu explico melhor isso no comentário do código abaixo.

Após rodar o código acima, nós vamos ter um dataframe de 10.000 linhas, 9 colunas com seus respectivos nomes e com valores que vão variar de 1 a 20, conforme print abaixo.

Bom, eu realmente não preciso que todas as variáveis tenham valores que variem de 1 a 20. Então no código abaixo eu vou alterar cada variável do dataframe para ela gerar uma quantidade randômica específica de resultados esperados para que depois eu possa substituir esse números pelos resultados que eu espero em em formato de string.

Mas antes, para ficar mais fácil de entender o que vou fazer com cada variável, como exemplo eu vou pegar a variável segmento.

E quando nós executamos o código em cinza abaixo, ele vai pegar apenas a coluna segmento e vai gerar 10.000 casos que vão receber valores randômicos de 1, 2, 3 ou 4. E para provar isso, o código df[‘segmento’].unique() vai nos dar como resposta: array([3, 1, 2, 4]). Ou seja, só existem valores iguais a 1, 2, 3 ou 4 agora na coluna segmento.

df['segmento'] = np.random.random_integers(4, size=(10000, 1))
df['segmento'].unique()

Beleza, mas por que eu quis que a variável segmento tivesse comos resposta os valores 1, 2, 3 e 4? Nó código cinza abaixo eu mostro o motivo.

Na primeira linah eu tranformo toda a coluna segmento que no momento é composta por inteiros em string. Na segunda linha do código eu substituo respectivamente essas strings que ‘1’, ‘2’, ‘3’ e ‘4’ por strings que eu denominei como ‘Altíssima Renda’, ‘Alta Renda’, ‘Média Renda’, ‘Massificado’. Para provar isso, a terceira linha nos retorna os novos valores únicos da coluna df[‘segmento’] e nos retorna a resposta array([‘Média Renda’, ‘Massificado’, ‘Alta Renda’, ‘Altíssima Renda’], dtype=object).

df['segmento'] = df['segmento'].astype(str)df['segmento'] = df['segmento'].replace(['1', '2', '3', '4'],['Altíssima Renda', 'Alta Renda', 'Média Renda', 'Massificado'])df['segmento'].unique()

Entendendo o que eu fiz com a coluna segmento você conseguirá ver que eu fiz coisas parecidas também com as outras variáveis conforme o código abaixo.

Agora eu vou criar outras colunas, mas estas serão condicionadas ao valor de outras colunas, por exemplo, o TimeOut dos scores A e B.

Conforme o código em cinza abaixo, primeiro eu crio as colunas Score_A e Score_B e dou a elas valores randômicos de score. O Score_A vai receber valores randômicos de 1 a 550 e o Score_B de 1 a 110.

df[‘Score_A’] = np.random.random_integers(550, size=(10000, 1))
df[‘Score_B’] = np.random.random_integers(110, size=(10000, 1))

Após isso eu crio as colunas de TimeOut_A e TimeOut_B. E para isso eu vou utilizar o np.where(). Esse método recebe 3 atributos, o primeiro é uma condição, o segundo é o resultado caso a condição seja verdadeira e o terceiro é o resultado caso seja falso. Ou seja, no caso abaixo, na primeira linha de código, eu estou criando a coluna TimeOut_A e em toda linha que a condição Score_A > 500 será criado o valor ‘TimeOut’, caso contrário será criado o valor ‘Consulta OK’.

df['TimeOut_A'] = np.where(df['Score_A'] > 500, 'TimeOut', 'Consulta OK')df['TimeOut_B'] = np.where(df['Score_B'] > 100, 'TimeOut', 'Consulta OK')

Da para comprovar no print abaixo que todos com score até 500 estão com o TimeOut_A == ‘Consulta OK’ e quem está acima de 500 está como ‘TimeOut’.

No código abaixo, eu continuo criando outras variáveis condicionais. Se tomarmos a coluna publico como exemplo, antes de alterá-la, eu crio uma variável chamada keep_canal na linha 1 que vai guardar uma lista contendo os valores de canais de Pessoa Física . Já na linha 3, eu altero a coluna publico marcando como True a linha que tiver a resposta da coluna canal pertencendo a lista keep_canal.

Após isso, conforme o print abaixo, as duas variáveis ficarão assim.

E por fim, rodando a linha 4 do código, eu substituo todo mundo que publico == True por ‘PF’ e quem é igual a False por ‘PJ’. De após isso, como podem ver, ainda no código acima, depois eu faço praticamente a mesma coisa para substituir a variável decisão baseada nas regras. Eu defini nesse exmplo que as regras de ‘01’ a ‘05’ iriam negar, as regras ‘06’ a ‘09’ derivar a proposta e a regra ‘10’ iria aprovar.

E para finalizar, na linha1 do código abaixo, eu crio uma variável de Limite que varia de 500 a 2.000 e só é preenchida para as linahs que possuem decisao == ‘APROVAR’.

Na linha 3 e 4 eu crio colunas de lat e longitude randomicas, meio que baseadas na lat e long de São Paulo. E por fim, na linah 7, eu exporto esse dataframe como um CSV para uma pasta local na minah máquina para que eu possa usar essa base para realizar algunstestes de código futuros.

Rodando o arquivo completo, você deve ter um dataframe conforme a imagem abaixo.

O Código completo você encontra no repositório do link abaixo no meu GitHub.

Se você curtiu ou eu te ajudei de alguma forma, me deixe sabendo interagindo ou comentando aqui pelo medium ou pela plataforma que vc leu esse artigo ;)

Até mais! E no próximo artigo eu vou mostrar como eu utilizei essa base para criar uma aplicação web de um dashboard bem bonitão em python sem precisar saber em NADA de framework! Me siga aqui no medium para ficar sabendo!

--

--