jlprep 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jlprep-0.1.0/PKG-INFO +160 -0
- jlprep-0.1.0/README.md +144 -0
- jlprep-0.1.0/jlprep/__init__.py +36 -0
- jlprep-0.1.0/jlprep/cleaning.py +209 -0
- jlprep-0.1.0/jlprep/comparison.py +55 -0
- jlprep-0.1.0/jlprep/diagnostics.py +129 -0
- jlprep-0.1.0/jlprep/encoding.py +116 -0
- jlprep-0.1.0/jlprep/exploration.py +254 -0
- jlprep-0.1.0/jlprep/quality.py +122 -0
- jlprep-0.1.0/jlprep/reporting.py +288 -0
- jlprep-0.1.0/jlprep.egg-info/PKG-INFO +160 -0
- jlprep-0.1.0/jlprep.egg-info/SOURCES.txt +23 -0
- jlprep-0.1.0/jlprep.egg-info/dependency_links.txt +1 -0
- jlprep-0.1.0/jlprep.egg-info/requires.txt +3 -0
- jlprep-0.1.0/jlprep.egg-info/top_level.txt +1 -0
- jlprep-0.1.0/pyproject.toml +30 -0
- jlprep-0.1.0/setup.cfg +4 -0
- jlprep-0.1.0/tests/test_check_class_balance.py +44 -0
- jlprep-0.1.0/tests/test_clean_missing.py +14 -0
- jlprep-0.1.0/tests/test_comparison.py +18 -0
- jlprep-0.1.0/tests/test_diagnostics.py +18 -0
- jlprep-0.1.0/tests/test_encode_label.py +17 -0
- jlprep-0.1.0/tests/test_encode_onehot.py +19 -0
- jlprep-0.1.0/tests/test_remove_outliers.py +24 -0
- jlprep-0.1.0/tests/test_value_counts_plot.py +12 -0
jlprep-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jlprep
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Biblioteca Python para pré-processamento e análise da qualidade de dados
|
|
5
|
+
Author: Joao Lucas Moreira de Sousa
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Classifier: Programming Language :: Python :: 3
|
|
8
|
+
Classifier: Operating System :: OS Independent
|
|
9
|
+
Classifier: Intended Audience :: Science/Research
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
11
|
+
Requires-Python: >=3.10
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
Requires-Dist: pandas
|
|
14
|
+
Requires-Dist: numpy
|
|
15
|
+
Requires-Dist: matplotlib
|
|
16
|
+
|
|
17
|
+
# jlprep
|
|
18
|
+
|
|
19
|
+
Biblioteca em Python para **análise e pré-processamento de dados** voltada para aplicações de Machine Learning.
|
|
20
|
+
|
|
21
|
+
A `jlprep` foi desenvolvida como parte de um **Trabalho de Conclusão de Curso (TCC)**, com foco na análise e melhoria da qualidade de dados utilizados em modelos de Machine Learning.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Objetivo
|
|
26
|
+
|
|
27
|
+
A biblioteca busca centralizar etapas comuns do pré-processamento de dados, como:
|
|
28
|
+
|
|
29
|
+
* Limpeza de dados
|
|
30
|
+
* Codificação de variáveis categóricas
|
|
31
|
+
* Análise exploratória
|
|
32
|
+
* Avaliação da qualidade dos dados
|
|
33
|
+
|
|
34
|
+
Além disso, fornece **diagnósticos interpretáveis**, auxiliando na tomada de decisão antes do treinamento de modelos de Machine Learning.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Contexto do TCC
|
|
39
|
+
|
|
40
|
+
Este projeto foi desenvolvido no contexto do tema:
|
|
41
|
+
|
|
42
|
+
> **Qualidade dos dados em Machine Learning (dados faltantes, desbalanceados e ruidosos)**
|
|
43
|
+
|
|
44
|
+
A proposta da `jlprep` é oferecer uma abordagem prática para identificação e tratamento desses problemas, reunindo funcionalidades essenciais em uma única biblioteca.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Funcionalidades
|
|
49
|
+
|
|
50
|
+
### Limpeza de dados
|
|
51
|
+
|
|
52
|
+
* Remoção de valores duplicados
|
|
53
|
+
* Tratamento de valores faltantes
|
|
54
|
+
* Remoção de outliers
|
|
55
|
+
|
|
56
|
+
### Transformação
|
|
57
|
+
|
|
58
|
+
* Label Encoding
|
|
59
|
+
* One-Hot Encoding
|
|
60
|
+
|
|
61
|
+
### Exploração de dados
|
|
62
|
+
|
|
63
|
+
* Resumo estatístico do dataset
|
|
64
|
+
* Visualização da distribuição de valores
|
|
65
|
+
|
|
66
|
+
### Qualidade dos dados
|
|
67
|
+
|
|
68
|
+
* Verificação de inconsistências
|
|
69
|
+
* Análise de desbalanceamento de classes
|
|
70
|
+
* Sugestões de pré-processamento
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Instalação
|
|
75
|
+
|
|
76
|
+
Clone o repositório e acesse a pasta do projeto.
|
|
77
|
+
|
|
78
|
+
Em seguida, instale as dependências necessárias utilizando o arquivo `requirements.txt`:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
python -m pip install -r requirements.txt
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
As principais dependências utilizadas pelo projeto são:
|
|
85
|
+
|
|
86
|
+
* `pandas`
|
|
87
|
+
* `matplotlib`
|
|
88
|
+
* `pytest`
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Testes
|
|
93
|
+
|
|
94
|
+
Os testes automatizados estão localizados na pasta `tests/`.
|
|
95
|
+
|
|
96
|
+
Para executar todos os testes, utilize:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
python -m pytest
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Para executar um teste específico:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
python -m pytest tests/test_encode_onehot.py
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Exemplo de uso
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
import pandas as pd
|
|
114
|
+
|
|
115
|
+
from jlprep import check_class_balance
|
|
116
|
+
|
|
117
|
+
df = pd.DataFrame({
|
|
118
|
+
"classe": ["A", "A", "B", "B", "A"]
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
resultado = check_class_balance(
|
|
122
|
+
df,
|
|
123
|
+
target="classe"
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
print(resultado)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
A função retorna um dicionário contendo informações sobre a quantidade de classes, o tipo de classificação, o nível de desbalanceamento e uma sugestão de tratamento.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Estrutura do projeto
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
JlPrep/
|
|
137
|
+
├── jlprep/
|
|
138
|
+
│ ├── __init__.py
|
|
139
|
+
│ ├── cleaning.py
|
|
140
|
+
│ ├── encoding.py
|
|
141
|
+
│ ├── exploration.py
|
|
142
|
+
│ └── quality.py
|
|
143
|
+
│
|
|
144
|
+
├── tests/
|
|
145
|
+
│ ├── test_clean_missing.py
|
|
146
|
+
│ ├── test_encode_label.py
|
|
147
|
+
│ ├── test_encode_onehot.py
|
|
148
|
+
│ ├── test_remove_outliers.py
|
|
149
|
+
│ └── test_check_class_balance.py
|
|
150
|
+
│
|
|
151
|
+
├── examples/
|
|
152
|
+
├── requirements.txt
|
|
153
|
+
└── README.md
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Projeto acadêmico
|
|
159
|
+
|
|
160
|
+
A `jlprep` foi desenvolvida como parte de um Trabalho de Conclusão de Curso, com o objetivo de aplicar conceitos de programação em Python, pré-processamento de dados, qualidade de dados e testes automatizados em uma biblioteca voltada para aplicações de Machine Learning.
|
jlprep-0.1.0/README.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# jlprep
|
|
2
|
+
|
|
3
|
+
Biblioteca em Python para **análise e pré-processamento de dados** voltada para aplicações de Machine Learning.
|
|
4
|
+
|
|
5
|
+
A `jlprep` foi desenvolvida como parte de um **Trabalho de Conclusão de Curso (TCC)**, com foco na análise e melhoria da qualidade de dados utilizados em modelos de Machine Learning.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Objetivo
|
|
10
|
+
|
|
11
|
+
A biblioteca busca centralizar etapas comuns do pré-processamento de dados, como:
|
|
12
|
+
|
|
13
|
+
* Limpeza de dados
|
|
14
|
+
* Codificação de variáveis categóricas
|
|
15
|
+
* Análise exploratória
|
|
16
|
+
* Avaliação da qualidade dos dados
|
|
17
|
+
|
|
18
|
+
Além disso, fornece **diagnósticos interpretáveis**, auxiliando na tomada de decisão antes do treinamento de modelos de Machine Learning.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Contexto do TCC
|
|
23
|
+
|
|
24
|
+
Este projeto foi desenvolvido no contexto do tema:
|
|
25
|
+
|
|
26
|
+
> **Qualidade dos dados em Machine Learning (dados faltantes, desbalanceados e ruidosos)**
|
|
27
|
+
|
|
28
|
+
A proposta da `jlprep` é oferecer uma abordagem prática para identificação e tratamento desses problemas, reunindo funcionalidades essenciais em uma única biblioteca.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Funcionalidades
|
|
33
|
+
|
|
34
|
+
### Limpeza de dados
|
|
35
|
+
|
|
36
|
+
* Remoção de valores duplicados
|
|
37
|
+
* Tratamento de valores faltantes
|
|
38
|
+
* Remoção de outliers
|
|
39
|
+
|
|
40
|
+
### Transformação
|
|
41
|
+
|
|
42
|
+
* Label Encoding
|
|
43
|
+
* One-Hot Encoding
|
|
44
|
+
|
|
45
|
+
### Exploração de dados
|
|
46
|
+
|
|
47
|
+
* Resumo estatístico do dataset
|
|
48
|
+
* Visualização da distribuição de valores
|
|
49
|
+
|
|
50
|
+
### Qualidade dos dados
|
|
51
|
+
|
|
52
|
+
* Verificação de inconsistências
|
|
53
|
+
* Análise de desbalanceamento de classes
|
|
54
|
+
* Sugestões de pré-processamento
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Instalação
|
|
59
|
+
|
|
60
|
+
Clone o repositório e acesse a pasta do projeto.
|
|
61
|
+
|
|
62
|
+
Em seguida, instale as dependências necessárias utilizando o arquivo `requirements.txt`:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
python -m pip install -r requirements.txt
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
As principais dependências utilizadas pelo projeto são:
|
|
69
|
+
|
|
70
|
+
* `pandas`
|
|
71
|
+
* `matplotlib`
|
|
72
|
+
* `pytest`
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Testes
|
|
77
|
+
|
|
78
|
+
Os testes automatizados estão localizados na pasta `tests/`.
|
|
79
|
+
|
|
80
|
+
Para executar todos os testes, utilize:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python -m pytest
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Para executar um teste específico:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
python -m pytest tests/test_encode_onehot.py
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Exemplo de uso
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
import pandas as pd
|
|
98
|
+
|
|
99
|
+
from jlprep import check_class_balance
|
|
100
|
+
|
|
101
|
+
df = pd.DataFrame({
|
|
102
|
+
"classe": ["A", "A", "B", "B", "A"]
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
resultado = check_class_balance(
|
|
106
|
+
df,
|
|
107
|
+
target="classe"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
print(resultado)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
A função retorna um dicionário contendo informações sobre a quantidade de classes, o tipo de classificação, o nível de desbalanceamento e uma sugestão de tratamento.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Estrutura do projeto
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
JlPrep/
|
|
121
|
+
├── jlprep/
|
|
122
|
+
│ ├── __init__.py
|
|
123
|
+
│ ├── cleaning.py
|
|
124
|
+
│ ├── encoding.py
|
|
125
|
+
│ ├── exploration.py
|
|
126
|
+
│ └── quality.py
|
|
127
|
+
│
|
|
128
|
+
├── tests/
|
|
129
|
+
│ ├── test_clean_missing.py
|
|
130
|
+
│ ├── test_encode_label.py
|
|
131
|
+
│ ├── test_encode_onehot.py
|
|
132
|
+
│ ├── test_remove_outliers.py
|
|
133
|
+
│ └── test_check_class_balance.py
|
|
134
|
+
│
|
|
135
|
+
├── examples/
|
|
136
|
+
├── requirements.txt
|
|
137
|
+
└── README.md
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Projeto acadêmico
|
|
143
|
+
|
|
144
|
+
A `jlprep` foi desenvolvida como parte de um Trabalho de Conclusão de Curso, com o objetivo de aplicar conceitos de programação em Python, pré-processamento de dados, qualidade de dados e testes automatizados em uma biblioteca voltada para aplicações de Machine Learning.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# jlprep/__init__.py
|
|
2
|
+
|
|
3
|
+
__version__ = "0.1.0"
|
|
4
|
+
|
|
5
|
+
# Importando funções diretamente para facilitar o uso
|
|
6
|
+
from .cleaning import remove_duplicates, remove_outliers, clean_missing
|
|
7
|
+
from .encoding import encode_label, encode_onehot
|
|
8
|
+
from .exploration import summarize_data, value_counts_plot, check_data_quality
|
|
9
|
+
from .quality import check_class_balance
|
|
10
|
+
from .diagnostics import analyze_dataset
|
|
11
|
+
from .comparison import compare_datasets
|
|
12
|
+
from .reporting import generate_report
|
|
13
|
+
|
|
14
|
+
__all__ = ["remove_duplicates",
|
|
15
|
+
"remove_outliers",
|
|
16
|
+
"clean_missing",
|
|
17
|
+
"encode_label",
|
|
18
|
+
"encode_onehot",
|
|
19
|
+
"summarize_data",
|
|
20
|
+
"value_counts_plot",
|
|
21
|
+
"check_class_balance",
|
|
22
|
+
"check_data_quality",
|
|
23
|
+
"analyze_dataset",
|
|
24
|
+
"compare_datasets",
|
|
25
|
+
"generate_report"]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
"""
|
|
29
|
+
JlPrep - Biblioteca de pré-processamento de dados para Machine Learning
|
|
30
|
+
|
|
31
|
+
Desenvolvida por João Lucas para facilitar tarefas como:
|
|
32
|
+
- Limpeza de dados
|
|
33
|
+
- Tratamento de valores ausentes
|
|
34
|
+
- Codificação de variáveis categóricas
|
|
35
|
+
- Análise exploratória (em futuras versões)
|
|
36
|
+
"""
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
__all__ = ["remove_duplicates",
|
|
2
|
+
"remove_outliers",
|
|
3
|
+
"clean_missing"]
|
|
4
|
+
|
|
5
|
+
import pandas as pd
|
|
6
|
+
|
|
7
|
+
def remove_duplicates(data: pd.DataFrame,
|
|
8
|
+
visualization: bool = False,
|
|
9
|
+
remove: bool = False) -> pd.DataFrame:
|
|
10
|
+
"""
|
|
11
|
+
Remove ou visualiza duplicatas de um dataframe.
|
|
12
|
+
|
|
13
|
+
:param data: Dataframe com os dados a serem analisados.
|
|
14
|
+
:param visualization: Se True, visualiza as duplicatas no Dataframe.
|
|
15
|
+
:param remove: Se True, remove as duplicatas no Dataframe.
|
|
16
|
+
:return: Dataframe com ou sem duplicatas, dependendo do parâmetro 'remove'
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
#Verificando o comportamento
|
|
20
|
+
if visualization and remove:
|
|
21
|
+
print("Exibindo duplicatas")
|
|
22
|
+
print(data[data.duplicated()])
|
|
23
|
+
print("\nRemovendo duplicatas...")
|
|
24
|
+
return data.drop_duplicates()
|
|
25
|
+
|
|
26
|
+
elif visualization:
|
|
27
|
+
|
|
28
|
+
print("Exibindo duplicatas:")
|
|
29
|
+
return data[data.duplicated()]
|
|
30
|
+
|
|
31
|
+
elif remove:
|
|
32
|
+
|
|
33
|
+
print("Removendo duplicatas...")
|
|
34
|
+
return data.drop_duplicates()
|
|
35
|
+
|
|
36
|
+
else:
|
|
37
|
+
|
|
38
|
+
print("Nenhuma ação foi realizada. Use 'visualization' para visualizar ou 'remove' para remover duplicatas.")
|
|
39
|
+
return data
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def remove_outliers(data: pd.DataFrame,
|
|
44
|
+
method:str = "iqr",
|
|
45
|
+
threshold: float = 1.5,
|
|
46
|
+
columns: list[str] | None = None) -> pd.DataFrame:
|
|
47
|
+
|
|
48
|
+
"""
|
|
49
|
+
Remove outliers de um DataFrame com base em métodos estatísticos.
|
|
50
|
+
|
|
51
|
+
Parâmetros
|
|
52
|
+
----------
|
|
53
|
+
data : pandas.DataFrame
|
|
54
|
+
Conjunto de dados a ser processado.
|
|
55
|
+
method : str, opcional (default='iqr')
|
|
56
|
+
Método usado para detecção de outliers. Pode ser:
|
|
57
|
+
- 'iqr': usa o intervalo interquartil (Q1 - 1.5*IQR, Q3 + 1.5*IQR)
|
|
58
|
+
- 'zscore': usa o desvio padrão em relação à média.
|
|
59
|
+
threshold : float, opcional (default=1.5)
|
|
60
|
+
Fator usado para definir o limite dos outliers.
|
|
61
|
+
- Para 'iqr': multiplicador do IQR.
|
|
62
|
+
- Para 'zscore': valor absoluto do Z-score máximo permitido.
|
|
63
|
+
columns : list ou None, opcional
|
|
64
|
+
Lista de colunas numéricas a serem analisadas. Se None, aplica em todas as colunas numéricas.
|
|
65
|
+
|
|
66
|
+
Retorna
|
|
67
|
+
-------
|
|
68
|
+
pandas.DataFrame
|
|
69
|
+
DataFrame sem os outliers detectados.
|
|
70
|
+
|
|
71
|
+
Lança
|
|
72
|
+
-----
|
|
73
|
+
ValueError
|
|
74
|
+
Se o método informado não for reconhecido ou se o threshold for menor ou igual a zero.
|
|
75
|
+
|
|
76
|
+
KeyError
|
|
77
|
+
Se alguma coluna informada não existir no DataFrame.
|
|
78
|
+
|
|
79
|
+
TypeError
|
|
80
|
+
Se alguma coluna informada não for numérica.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
df = data.copy()
|
|
84
|
+
|
|
85
|
+
# Seleciona as colunas numéricas
|
|
86
|
+
if columns is None:
|
|
87
|
+
columns = df.select_dtypes(include=["number"]).columns.tolist()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# Valida as colunas
|
|
91
|
+
for col in columns:
|
|
92
|
+
if col not in df.columns:
|
|
93
|
+
raise KeyError(f"A coluna '{col}' não existe no DataFrame.")
|
|
94
|
+
|
|
95
|
+
# Verifica se as colunas são numéricas
|
|
96
|
+
if not pd.api.types.is_numeric_dtype(df[col]):
|
|
97
|
+
raise TypeError(f"A coluna '{col}' deve ser numérica")
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
if threshold <= 0:
|
|
101
|
+
raise ValueError("O threshold deve ser maior que zero.")
|
|
102
|
+
|
|
103
|
+
# Verifica o método escolhido
|
|
104
|
+
match method:
|
|
105
|
+
case "iqr":
|
|
106
|
+
|
|
107
|
+
for col in columns:
|
|
108
|
+
Q1 = df[col].quantile(0.25)
|
|
109
|
+
Q3 = df[col].quantile(0.75)
|
|
110
|
+
IQR = Q3 - Q1
|
|
111
|
+
|
|
112
|
+
lower_limit = Q1 - threshold * IQR
|
|
113
|
+
upper_limit = Q3 + threshold * IQR
|
|
114
|
+
|
|
115
|
+
df = df[(df[col] >= lower_limit) & (df[col] <= upper_limit)]
|
|
116
|
+
|
|
117
|
+
return df
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
case "zscore":
|
|
121
|
+
|
|
122
|
+
for col in columns:
|
|
123
|
+
mean = df[col].mean()
|
|
124
|
+
std = df[col].std()
|
|
125
|
+
|
|
126
|
+
z_scores = (df[col] - mean) / std
|
|
127
|
+
|
|
128
|
+
df = df[z_scores.abs() <= threshold]
|
|
129
|
+
|
|
130
|
+
return df
|
|
131
|
+
|
|
132
|
+
case _:
|
|
133
|
+
raise ValueError(f"Método '{method}' não reconhecido. Use 'iqr' ou 'zscore'.")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def clean_missing(
|
|
139
|
+
data: pd.DataFrame,
|
|
140
|
+
strategy: str = "drop",
|
|
141
|
+
columns: list[str] | None = None,
|
|
142
|
+
value: object | None = None,
|
|
143
|
+
threshold: float | None = None,
|
|
144
|
+
visualize: bool = False
|
|
145
|
+
) -> pd.DataFrame:
|
|
146
|
+
|
|
147
|
+
"""
|
|
148
|
+
Trata valores ausentes em um DataFrame com diferentes estratégias.
|
|
149
|
+
|
|
150
|
+
Parâmetros:
|
|
151
|
+
- data: DataFrame do pandas.
|
|
152
|
+
- strategy: Estratégia de tratamento. Pode ser 'drop', 'mean', 'median', 'mode', 'value' ou 'interpolate'.
|
|
153
|
+
- columns: Lista de colunas a serem tratadas. Se None, serão escolhidas com base na estratégia.
|
|
154
|
+
- value: Valor específico para preenchimento (usado apenas se strategy='value').
|
|
155
|
+
- threshold: Proporção de valores ausentes para remover colunas (usado apenas com strategy='drop').
|
|
156
|
+
- visualize: Se True, exibe o resumo de valores ausentes antes do tratamento.
|
|
157
|
+
|
|
158
|
+
Retorna:
|
|
159
|
+
- DataFrame com valores ausentes tratados.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
df = data.copy()
|
|
163
|
+
|
|
164
|
+
if columns is None:
|
|
165
|
+
if strategy in ["mean", "median", "zscore"]:
|
|
166
|
+
columns = df.select_dtypes(include=["number"]).columns
|
|
167
|
+
elif strategy in ["mode", "value", "drop", "interpolate"]:
|
|
168
|
+
columns = df.columns
|
|
169
|
+
else:
|
|
170
|
+
raise ValueError(f"Estratégia '{strategy}' não reconhecida.")
|
|
171
|
+
|
|
172
|
+
match strategy:
|
|
173
|
+
case "drop":
|
|
174
|
+
if threshold is not None:
|
|
175
|
+
|
|
176
|
+
df = df.loc[:, df.isnull().mean() < threshold]
|
|
177
|
+
else:
|
|
178
|
+
|
|
179
|
+
df = df.dropna(subset=columns)
|
|
180
|
+
|
|
181
|
+
case "mean":
|
|
182
|
+
for col in columns:
|
|
183
|
+
df[col] = df[col].fillna(df[col].mean())
|
|
184
|
+
|
|
185
|
+
case "median":
|
|
186
|
+
for col in columns:
|
|
187
|
+
df[col] = df[col].fillna(df[col].median())
|
|
188
|
+
|
|
189
|
+
case "mode":
|
|
190
|
+
for col in columns:
|
|
191
|
+
mode = df[col].mode()
|
|
192
|
+
if not mode.empty:
|
|
193
|
+
df[col] = df[col].fillna(mode[0])
|
|
194
|
+
|
|
195
|
+
case "value":
|
|
196
|
+
if value is None:
|
|
197
|
+
raise ValueError("Para a estratégia 'value', o parâmetro 'value' deve ser fornecido.")
|
|
198
|
+
for col in columns:
|
|
199
|
+
df[col] = df[col].fillna(value)
|
|
200
|
+
|
|
201
|
+
case "interpolate":
|
|
202
|
+
df[columns] = df[columns].interpolate()
|
|
203
|
+
|
|
204
|
+
case _:
|
|
205
|
+
raise ValueError(f"Estratégia '{strategy}' não reconhecida.")
|
|
206
|
+
|
|
207
|
+
return df
|
|
208
|
+
|
|
209
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
|
|
2
|
+
__all__ = ["comparison"]
|
|
3
|
+
|
|
4
|
+
import pandas as pd
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def compare_datasets(
|
|
8
|
+
original: pd.DataFrame,
|
|
9
|
+
processed: pd.DataFrame
|
|
10
|
+
) -> dict:
|
|
11
|
+
"""
|
|
12
|
+
Compara indicadores de dois DataFrames antes e depois
|
|
13
|
+
de um procedimento de pré-processamento.
|
|
14
|
+
"""
|
|
15
|
+
if not isinstance(original, pd.DataFrame):
|
|
16
|
+
raise TypeError("original deve ser um DataFrame.")
|
|
17
|
+
|
|
18
|
+
if not isinstance(processed, pd.DataFrame):
|
|
19
|
+
raise TypeError("processed deve ser um DataFrame.")
|
|
20
|
+
|
|
21
|
+
def metrics(df):
|
|
22
|
+
total_cells = df.shape[0] * df.shape[1]
|
|
23
|
+
missing = int(df.isna().sum().sum())
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
"rows": len(df),
|
|
27
|
+
"columns": len(df.columns),
|
|
28
|
+
"missing_values": missing,
|
|
29
|
+
"missing_percentage": round(
|
|
30
|
+
missing / total_cells * 100, 2
|
|
31
|
+
) if total_cells else 0.0,
|
|
32
|
+
"duplicates": int(df.duplicated().sum()),
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
before = metrics(original)
|
|
36
|
+
after = metrics(processed)
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
"before": before,
|
|
40
|
+
"after": after,
|
|
41
|
+
"changes": {
|
|
42
|
+
"row_difference": after["rows"] - before["rows"],
|
|
43
|
+
"column_difference": (
|
|
44
|
+
after["columns"] - before["columns"]
|
|
45
|
+
),
|
|
46
|
+
"missing_difference": (
|
|
47
|
+
after["missing_values"]
|
|
48
|
+
- before["missing_values"]
|
|
49
|
+
),
|
|
50
|
+
"duplicate_difference": (
|
|
51
|
+
after["duplicates"] - before["duplicates"]
|
|
52
|
+
),
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
|