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 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
+