Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Em que situações é ideal usar classes para representar pipelines de tratamento e limpeza de dados em pyhton?

+2 votos
65 visitas
perguntada Dez 10, 2019 em Dados e Bases de Dados por Neuremberg de Matos (56 pontos)  

Há algumas pessoas que afirmam que o paradigma de programação funcional seria os mais adequado para realizar transformações e tratamento de dados em formatos retangulares, como data frames do pandas. Entretanto, estabelecido um pipeline de limpeza e tratamento de dados, faz sentido usar classes para representá-lo?

Se sim, em que circunstâncias? Se não, qual a razão para isso?

Compartilhe

1 Resposta

+1 voto
respondida Dez 12, 2019 por danielcajueiro (6,046 pontos)  
selecionada Dez 13, 2019 por Neuremberg de Matos
 
Melhor resposta

Essas perguntas que envolvem paradigmas computacionais são complexas... Tendo dito isso, espero contribuir com algumas dimensões abaixo. Entretanto, devem ter muitas dimensões que não estou enxergando.

Sim. Programação Funcional tem sido muito usada para tratar bases de dados. Vejo alguns motivos para isso:

1) R é uma das linguagens mais usadas (provavelmente a segunda, mas decrescendo em termos de importância em tecnologias modernas) no que eh chamado de "ciência de dados". Não sou especialista em R, mas pessoas dizem que ela foi contruída tendo como base o paradigma de programação funcional. Por que? Não tenho uma resposta para isso, mas vejo que muitas das pessoas (não todas obviamente) que tem uma preferência por R, nunca estudaram implementação computacional com cuidado e o paradigma de programação funcional permite em poucos comandos (sem loops) realizar muitos métodos.

2) Python que é a linguagem mais importante atualmente e com importância crescente tem boas baterias de programação funcional. Usa a estrutura de dataframe que dizem ter sido inspirada na estrutura do R, mas na verdade essa estrutura é muito mais antiga. De qualquer forma, essa estrutura tb privilegia o paradigma de programação funcional.

3) O paradigma de programação funcional parte do pressuposto que dados não serão alterados e isso é particularmente interessante em termos de tratamento de dados.

Isso não significa que programação funcional deve ser a saída. Estou apenas elencando motivos para que ela esteja sendo muito usada. De fato, a forma mais usual hoje de lidar com base de dados envolve pelo menos duas etapas:

1) Levar os dados para uma base de dados como SQL, postgress..., pois em geral considerando que trabalhamos com bases de dados cada vez maiores, a memoria RAM do computador não será capaz de lidar com essas bases.

2) Selecionar parte dessa base de dados e assim tratar os dados de interesse.

Concluir que programação funcional é a saída é dizer que linguagens importantes que não tem baterias de programação funcional não podem ser usadas (e existem muitas delas)?

Sobre as classes:

Isso depende exatamente do objetivo. Como eu penso em relação aos problemas que uso...

Acho que deve ter pelo menos uma classe básica para cada uma das atividades importantes:

1) Interação com a base de dados;
2) Tratamento de dados;
3) Estimação de modelos
4) Visualização dos resultados.

Vc deve pensar em classes que depois de construídas possam gerar "filhos" para diversos problemas particulares.

comentou Dez 13, 2019 por Neuremberg de Matos (56 pontos)  
Um dos membros do core R, John Chambers, afirma que o R descende do S que descende do Lisp. Então ele tem muitas características de linguagens funcionais. Por exemplo, o if não é uma declaração, mas uma função assim como os operadores aritméticos.

Outro exemplo é que se pode usar o operador OU seguinte forma Reduce(`|`, lista_vetores_booleanos),  sendo `|` a forma infix do operador |. Que equivaleria: lista_vetores_booleanos[[1]] | lista_vetores_booleanos[[2]] | ... | lista_vetores_booleanos[[n]]. Essa forma infix dos operadores é especialmente poderosa quando combinada com funcionais lapply, mapply ....

Hadley argumenta que o uso do paradigma funcional manteria os dados imutáveis o que permitira se realizar de teste unitários em funções mais facilmente além de reduzir a existência de efeitos inesperados nos programas. Isso é inclusive um dos umas das razões(https://blog.nubank.com.br/o-que-e-clojure/) por qual o Nubank usa Clojure, que também é descendente do _Lisp_, em suas aplicações. Segundo eles, caso houvesse algum problema, eles conseguiriam recuperar dados iniciais. E essa também é umas das razões para o aumento do uso de Scala em aplicações financeiras.

Entretanto, isso tem custo. No R, é feito uma cópia do objeto quando ele é modificado tornando o consumo de memória relativamente alto. Já o pacote data.table não segue esse paradigma, isto é, a funções dele tem efeitos externos de modo que a cópias são evitadas. Isso o torna melhor no gerenciamento de memória e contribui para a sua velocidade.

Eu tenho certa dificuldade em como encapsular um data frame* num objeto. Por exemplo, cada coluna deveria ser atributo? Não sei como lidar com isso.

Por outro lado tenho visto implementações que as classes não têm atributos, mas apenas métodos e não sei até que ponto isso segue o paradigma OOP e se nesse caso não seria melhor usar funções?

Minha pegunta é principalmente para encontrar respostas para esses últimos dois questionamentos. Entendo que cada paradigma tem um escopo de aplicação.
comentou Dez 13, 2019 por danielcajueiro (6,046 pontos)  
Por que você transformaria um dataframe em um objeto? Ele já é um objeto. Vc nao vai criar um novo objeto porque vc deve, mas se vc achar que tera um melhor encapsulamento de dados. Se o dataframe da forma que esta é suficiente para vc, nao faz sentido criar um novo objeto.
comentou Dez 13, 2019 por Neuremberg de Matos (56 pontos)  
No caso, eu poderia querer que o data frame tivesse determinadas colunas, então a classe serviria para fazer essa validação do formato desejado.

Faria sentido criar uma classe para fazer esse tipo de coisa?
comentou Dez 13, 2019 por danielcajueiro (6,046 pontos)  
Sim. Se esse for um problema que vc tem. O que vc espera que uma classe que trate base de dados faça? Essa é uma pergunta que vc deve fazer. Vc deve pensar globalmente.
comentou Dez 13, 2019 por Neuremberg de Matos (56 pontos)  
Entendi. Obrigado, professor!
...