Geração de dados para todos os fins — Conheçam o GGenerator!

Alexandre Cardoso
datenworks
Published in
6 min readMar 31, 2020

Desde o "início dos tempos", quando a Datenworks abriu as portas, eu imaginava que seria inevitável e também muito importante aprofundar a minha relação pessoal com o mundo opensource, de onde já usufrui tanto em mais de 20 anos fazendo software e de onde, direta ou indiretamente, todas as empresas de tecnologia do mundo inteiro também servem ou se servem.

Procurar bons e válidos motivos para contribuição opensource não faltam (aprender mais e melhor, networking, diversão, etc). Pessoalmente, acredito que a melhor contribuição que podemos dar ao opensource é transformar problemas não (ou mal) resolvidos do cotidiano em soluções abertas para uso pela comunidade e que ajuda a nós mesmos como time/empresa a ir mais longe, no melhor estilo ao famoso modelo "eat your own dog food". 🐕 🐶

Na Datenworks, trabalhamos com dados. Todos os dias, em todos os desafios internos e projetos de nossos clientes, lidamos com aquisição, modelagem, testes funcionais e não-funcionais e publicação de processos dos mais simples aos mais complexos envolvendo dados. Uma coisa que quase ninguém te conta antes de iniciar um novo projeto de dados é: Quase sempre vc não terá dados que precisa para testar seus processos! 🤔

Por quê isso acontece? 😒

  • A realidade de dados, diferente da realidade de software, é implacável -> Cada 9 entre 10 projetos, só existem dados/ambiente de produção.
  • Em tempos de LGPD/GDPR, não espere ter/receber dados de produção para efetuar testes. Isso coloca a privacidade e o sigilo de pessoas e empresas em risco.
  • Silos externos (API's, SaaS, cloud, etc.)? Muitos deles sequer dispõem de um sandbox. Ou seja, não há dados ou ambiente de desenvolvimento data-driven.
  • Produzir dados para fins de testes, nas características desejadas e no volume que pode ser exigido, é um trabalho árduo! "Fazer na mão"? Inviável. Ferramentas comerciais? Há algumas, como o Test Data Manager, que podem não caber em todos os bolsos.

Problemas que todos tem ou vão ter, maior ou menor grau, certo? 😅

Depois de vários projetos entregues e boas lições aprendidas, começamos a fazer a pergunta: Como lidar com este cenário de dados para escalar projetos, mitigar riscos de violação de privacidade, entregar processos com maior qualidade e implantar com mais confiança?

Resposta: Uma ferramenta opensource que vamos usar (muito), aperfeiçoar e compartilhar para uso pela comunidade de tecnologia. Conheçam o GGenerator! 🎆 👏

GGenerator? O que é, afinal?

Sabe qual o primeiro desafio na construção de um projeto opensource? Escolher um nome! 😆

Depois de avaliar vários bons candidatos (alguns nem tanto), o que melhor definiu o espírito por trás de um nome foi a frase do nosso tech lead Lucas Fernando certa vez: "Quer um dataset? Só baixar a ferramenta, rodar um comando e GG! 😅". O resto da história você pode deduzir, certo? 😃

O GGenerator é a nossa iniciativa opensource para lidar com os problemas listados acima de uma forma mais controlada, previsível e escalável. Estamos falando de gerar dados fake com características similares aos dados que nossos processos vão encontrar no ambiente de produção, muito antes de uma implantação em produção. Estamos falando de produzir esses dados com interação direta com ambientes cloud computing como AWS e Google Cloud. Também estamos falando de produzir uma grande variedade de dados com características aproximadas ao mundo real, como nomes de pessoas, endereços, até mesmo CPF e RG brasileiros!

“Bacana, hein?! Me conta um pouco mais!” 😄

A proposta básica do GGenerator é a simplicidade. Gerar dados fake não deve ser um novo projeto de dados em si, nem ciência de foguete! Tendo isso em mente, a ferramenta nasceu com a proposta de uma command line tool com funções simples e diretas para produzir datasets (CSV ou JSON) conforme uma especificação definida e mantida pelo usuário. Usando desta especificação, o usuário tem controle total sobre os dados (quantidade de linhas, colunas, tipo de dado, etc) que serão produzidos. Exemplo 👇

{
"datasets": {
"ggenerator": {
"size": 100,
"locale": "pt_BR",
"fields": [
{
"name": "id",
"type": "integer:sequence",
"generator": {
"start_at": 1
}
},
{
"name": "datetime",
"type": "timestamp:sequence",
"generator": {
"start_at": "2020-03-01T03:02:01Z",
"datepart": "minute",
"step": 3
}
},
{
"name": "temperature",
"type": "pyfloat",
"generator": {}
},
{
"name": "person_name",
"type": "name",
"generator": {}
}
],
"format": {
"type": "csv",
"options": {
"header": true,
"sep": ";"
}
},
"serializers": {
"to": [
{
"type": "file",
"uri": "/home/user/dataset.csv"
}
]
}
}
}
}

No exemplo acima, vamos construir um dataset em formato CSV com 4 colunas e 100 linhas de tamanho, gravado na estação do usuário em /home/user/dataset.csv . Um simples comando… 👇

$ ggenerator generate --spec /home/user/ggenerator_spec.json

… e seus dados serão gerados em pouquíssimo tempo e conforme especificado.

Um possível exemplo 👇

___________________   ____________  ___  __________  ____
/ ____/ ____/ ____/ | / / ____/ __ \/ |/_ __/ __ \/ __ \
/ / __/ / __/ __/ / |/ / __/ / /_/ / /| | / / / / / / /_/ /
/ /_/ / /_/ / /___/ /| / /___/ _, _/ ___ |/ / / /_/ / _, _/
\____/\____/_____/_/ |_/_____/_/ |_/_/ |_/_/ \____/_/ |_|
version: 0.1
-------------------
Dataset: ggenerator
datetime : timestamp:sequence
temperature : pyfloat
person_name : name
-------------------
First 10 rows:
╒════╤═════════════════════╤══════════════════╤════════════════════╕
│ │ datetime │ temperature │ person_name │
╞════╪═════════════════════╪══════════════════╪════════════════════╡
│ 0 │ 2020-03-01 03:02:01 │ 48.5552 │ João Viana │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 1 │ 2020-03-01 03:05:01 │ -8.72448e+14 │ Beatriz Ferreira │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 2 │ 2020-03-01 03:08:01 │ 56.158 │ Sr. Pietro Fernandes │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 3 │ 2020-03-01 03:11:01 │ 6.34762e+11 │ Pietra Porto │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 4 │ 2020-03-01 03:14:01 │ 352666 │ Isabelly Lopes │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 5 │ 2020-03-01 03:17:01 │ 6.37314e+09 │ Sophia Cardoso │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 6 │ 2020-03-01 03:20:01 │ -8.43073 │ Vitória Gomes │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 7 │ 2020-03-01 03:23:01 │ 1.89601e+07 │ Lucas Souza │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 8 │ 2020-03-01 03:26:01 │ -2.96596e+13 │ Isaac Santos │
├────┼─────────────────────┼──────────────────┼────────────────────┤
│ 9 │ 2020-03-01 03:29:01 │ 3.54828e+07 │ Enrico Santos │
╘════╧═════════════════════╧══════════════════╧════════════════════╛
-------------------

“Fantástico!! O que mais posso fazer com o GGenerator” 👀

Neste primeiro release, além de gerar dados na sua própria máquina, você também pode produzir suas amostras diretamente para a nuvem! Através da especificação do seu dataset (veja wiki), você pode salvar seus dados diretamente no AWS Simples Storage Service ou no Google Cloud Storage. Pra salvar em nuvem, você deve ter acessos previamente concedidos, blz? 😊

Quer obter referência dos tipos possíveis que o GGenerator suporta? Basta executar o comando abaixo:

$ ggenerator list-generators 👇

Saída inicial do comando ˜list-generators˜

Quer gerar uma amostra de dado fake pra saber o que seu dataset pode ser?

$ ggenerate generate-sample --type license_plate 👇

___________________   ____________  ___  __________  ____
/ ____/ ____/ ____/ | / / ____/ __ \/ |/_ __/ __ \/ __ \
/ / __/ / __/ __/ / |/ / __/ / /_/ / /| | / / / / / / /_/ /
/ /_/ / /_/ / /___/ /| / /___/ _, _/ ___ |/ / / /_/ / _, _/
\____/\____/_____/_/ |_/_____/_/ |_/_/ |_/_/ \____/_/ |_|
version: 0.1
-------------------
Sample: LGJ-5703

“Show de bola!! Quero usar #comofaz” 🤗

Tudo que precisa fazer é acessar a página do projeto no Github e seguir as instruções. Você só precisa ter uma instalação padrão de Python (3.7 ou superior) em sua máquina. Testamos bastante em Linux, MacOS e Windows 10!

GGenerator — Uma iniciativa opensource!

Como falei no início do post, partimos do princípio de que há problemas relevantes a serem resolvidos em escala e que podemos contribuir para melhorar a vida de muitos. Por isso, o GGenerator nasceu como um projeto opensource que será mantido e aperfeiçoado por nós e quem mais quiser e puder contribuir. Todos são bem-vindos!

Gostou do que estamos fazendo? Quer sugerir novas funcionalidades, criticar (de forma construtiva) ou reportar bugs? Acesse o projeto no Github e crie um issue com o máximo de detalhes que puder.

Quer contribuir com este projeto? Faça um fork do projeto e ofereça sua contritução via pull request.

Forte abraço!

--

--