Formatos de arquivos para ciência de dados

Caros amigos,

Para nós que estamos no caminho da ciência de dados é um grande desafio a movimentação dos dados de um lado para o outro. Encontrar um único formato que sirva a todos os propósitos é praticamente impossível. O mais comum em nossos fluxos de trabalho é lidar com o bom e velho CSV. No entanto, existem outros formatos que tenho experimentado, com o objetivo de fazer pequenas extrações de nossos bancos e criar alguns datasets.

O que tenho procurado é um formato de arquivo que permita algum nível de compressão, que seja fácil de compartilhar, que esteja disponível nos próximos 5~10+ anos e com bom suporte na maioria das linguagens de programação utilizadas para ciência de dados na atualidade: R, Python, MatLab, etc.

Gostei muito dos formatos Parquet e HDF5, também tem o Feather desenvolvido pelo pessoal do RStudio. Portanto, abro esse tópico para iniciarmos a troca de ideias e experimentos em torno desses [ou outros que vierem a ser sugeridos] formatos de arquivo bem populares para manipular e compartilhar dados.

1 Curtida

Vejo que tem ganhado alguma tração nos círculos de dados abertos o formato Tabular Data Packages, do projeto Frictionless Data, da Open Knowledge Foundation. Ele tem ganho bibliotecas em diversas linguagens de programação para manipular os dados, além de serviços online que ajudam na sua criação, validação contínua de dados, etc.

O Data Package é mais genérico, no sentido de enriquecer com metadados os dados em qualquer formato. Já o Tabular Data Package pretende enriquecer os dados CSV com informações como o dicionário de dados explicando as colunas, validações de tipos e de limites de dados, chaves primárias e estrangeiras, etc.

1 Curtida

:thinking: Gostei da ideia. Vou dar uma estudada e pensar como integrar ao Pandas. Pode ser uma boa opção para persistir os dados de um dataset. Dependendo da aplicação a performance pode ser um problema.

1 Curtida

Fiz uma pesquisa e encontrei esse artigo exatamente sobre sua ideia de integrar com o Pandas: Using Data Packages with Pandas. É curtinho e vale a leitura por que ele explica inclusive sobre os conceitos de Data Frame do Pandas, resume a estrutura do Tabular Data Package e explica como exemplifica como utilizar juntos. Também lista outros plugins pro Tabular Data Packages, sugerido pelo @augusto.herrmann.

2 Curtidas

Muito bom, @nitai!

Essa postagem e esse pacote são um pouco antigos, sendo que o último commit do pacote foi em 2017. Pesquisando na lista de ferramentas do Frictionless Data, encontrei um outro pacote com atualizações mais recentes (deste ano), mas não sei se de fato tem algo melhor. Pelos exemplos mostrados na postagem, o primeiro parece ter mais funcionalidade porque possibilita ler múltiplas tabelas de um Data Package.

1 Curtida

Nos meus estudos de como atacar a problemática descrita pelo tópico: carga e compartilhamento de dados em projetos de ciência de dados; eu encontrei também o Intake (https://github.com/intake/intake), vale a pena ficar de olho. Acho que resolve boa parte dos problemas descritos =D

1 Curtida

O Intake parece solucionar bem essa questão da carga dos dados. Mas a sua pergunta original era sobre formatos. :slight_smile: E parece que ele trabalha com um outro tipo de data packages.

1 Curtida

Sim, sim. Porque eu estava tentando lidar com esses problemas, como persistir dados de análises, ou seja, algum dataset extraído de nossos bancos de dados e que após algum trabalho inicial de limpeza, remodelagem, etc, eu precisava salvar mantendo os datatypes, etc.

Também procurava um jeito de manter esses dados de forma que fosse facilmente compartilháveis. O Intake parece resolver bem esses problemas, o mais legal é que estou conseguindo utilizá-lo com o Dask que me permite manipular uma massa de dados maior do que a memória do computador.

Pelo que entendi da documentação do Intake, para fazer um pacote de dados você tem que documentar os metadados em um formato próprio YAML dele. Não é uma especificação formal e versionada, como o Tabular Data Package. E se você quiser distribui-los, você tem que criar um pacote conda.

De qualquer forma, sugeri a eles passar a suportar o Tabular Data Packages. Acredito que, se implementarem, vai potencializar ainda mais o uso da ferramenta, pois poderão ser reaproveitados os metadados e tipos de colunas dos datasets que já seguem esse padrão.

Também estava vendo isso. Muito bom @augusto.herrmann; Muito dos nossos dados abertos são CSV puro e simples, né? Alguns usuários reclamam de dificuldades na hora de importar esses dados em seus sistemas. Os próximos pedidos de extração que eu receber vou começar a exportar para o Tabular Data Packages já com o esqueminha bonitinho :heart_eyes:

1 Curtida

Sim, Kafran. Enquanto ainda estava havendo reuniões regulares e existia o Comitê Gestor da INDA, cheguei a colocar o tema como possível pauta futura de deliberação, para que se tornasse um padrão da INDA. Apesar de eu, pessoalmente, acompanhá-lo desde o início, o Frictionless Data só começou a ganhar mais maturidade e tração somente no ano passado. Agora espero que a CGU recrie o comitê e dê espaço para esse tipo de discussão para a adoção de padrões técnicos no comitê.

Depois disso ainda haverá outro desafio que é o da capacitação e da disseminação para os órgãos que publicam os dados. Então acho que ainda vai demorar bastante até um dia termos algum volume de dados abertos em Tabular Data Packages.

Maravilha! :tada:

1 Curtida

Fiz um teste aqui do pacote feather no R, seguindo as instruções do Hadley.

A diferença é gritante :astonished: a favor do feather em relação ao CSV:

Leitura do arquivo em CSV:

system.time(df <- read_csv("df.csv"))
Parsed with column specification:
cols(
  V1 = col_double(),
  V2 = col_double(),
  V3 = col_double(),
  V4 = col_double(),
  V5 = col_double(),
  V6 = col_double(),
  V7 = col_double(),
  V8 = col_double(),
  V9 = col_double(),
  V10 = col_double()
)
|====================================================================| 100% 1682 MB
   user  system elapsed 
  15.78    0.30   15.73 

Leitura dos dados em formato feather:

system.time(df <- read_feather("df.feather"))
   user  system elapsed 
   0.29    0.44    0.74  

O feather leu cerca de 21.26 vezes mais rápido.

1 Curtida