--- title: CleanSight API emoji: 🧹 colorFrom: blue colorTo: green sdk: docker pinned: false license: mit --- # CleanSight — REST API API REST em **Flask** para **pré-processamento de dados** (upload, análise, limpeza, codificação, normalização, PCA 2D/3D, outliers e perfilamento rápido). Endpoints sob `/api/*`. Verificação de saúde em `/health`. > **Importante:** o subdomínio final depende do nome do Space e do usuário. > Ex.: `https://-cleansight-api.hf.space`. --- ## Sumário - [Visão Geral](#visão-geral) - [Endpoints](#endpoints) - [Esquemas de Requisição/Resposta](#esquemas-de-requisiçãoresposta) - [Variáveis de Ambiente](#variáveis-de-ambiente) - [Como Executar Localmente](#como-executar-localmente) - [Implantação no Hugging Face (SDK: Docker)](#implantação-no-hugging-face-sdk-docker) - [Exemplos (cURL)](#exemplos-curl) - [Limites e Observações](#limites-e-observações) - [Resolução de Problemas](#resolução-de-problemas) - [Licença](#licença) --- ## Visão Geral O **CleanSight API** transforma arquivos brutos em datasets prontos para análise e modelagem de Machine Learning. Principais operações: - Upload e leitura robusta (detecção de *encoding* e *delimiter*). - Análise de *target* (distribuição, balanceamento, completude). - Pipeline de pré-processamento configurável: - Remoção de duplicatas - Tratamento de ausentes (numérico/categórico) - Codificação de categóricas/booleanas - Normalização (z-score) - Seleção simples de *features* - Balanceamento de classes (oversampling simples) - Estatísticas e gráficos (matriz de correlação, distribuições, boxplots, *heatmap* de ausentes, **PCA 2D/3D** com variância explicada). - *Download* do dataset processado. --- ## Endpoints | Método | Rota | Descrição | |:------:|-----------------|----------------------------------------------------------| | GET | `/health` | Verifica a saúde da API | | POST | `/api/upload` | Upload do dataset (`.csv`, `.txt`, `.tsv`) | | POST | `/api/analyze` | Análise inicial com base na coluna **target** | | POST | `/api/process` | Pré-processamento completo com parâmetros configuráveis | | POST | `/api/statistics` | Estatísticas (describe, gráficos, profiling* minimal) | | POST | `/api/pca` | Gera **PCA 2D** (imagem base64) | | POST | `/api/pca3d` | Gera **PCA 3D** (HTML Plotly embutido) | | POST | `/api/outliers` | Gráfico de outliers (imagem base64) | | GET | `/api/download` | *Download* do dataset processado (`processed_dataset.csv`) | | POST | `/api/clear` | Limpa arquivos temporários e estado de sessão | \* O *profiling* via `ydata-profiling` é gerado no modo **minimal**, quando disponível. --- ## Esquemas de Requisição/Resposta ### 1) `POST /api/upload` - **Form-Data**: `file` (obrigatório) — tipos suportados: `.csv`, `.txt`, `.tsv` (até 50–100 MB, ver limites). - **Resposta (sucesso)**: ```json { "success": true, "info": { "filename": "dataset.csv", "shape": [linhas, colunas], "columns": ["col1", "col2", "..."], "dtypes": {"col1": "float64", "col2": "object"}, "missing_values": {"col1": 0, "col2": 3}, "unique_values": {"col1": 100, "col2": 5}, "sample_values": {"col2": ["A","B","..."]}, "duplicates": 0, "numeric_columns": ["..."], "categorical_columns": ["..."], "boolean_columns": ["..."], "datetime_columns": ["..."], "data_quality": {"completeness": 98.2, "uniqueness": 100.0, "consistency": 100}, "encoding_used": "utf-8", "delimiter_used": "," } } ```` ### 2) `POST /api/analyze` * **JSON**: ```json { "target_column": "classe" } ``` * **Resposta (sucesso)**: ```json { "success": true, "analysis": { "target_column": "classe", "target_type": "object", "target_classes": {"A": 120, "B": 80}, "target_balance_ratio": 0.67, "missing_target_values": 0, "total_missing_percentage": 1.5, "duplicates_count": 0, "numeric_columns_count": 10, "categorical_columns_count": 3, "boolean_columns_count": 1, "datetime_columns_count": 0, "dataset_shape": [200, 14], "data_quality": {"completeness": 98.5, "uniqueness": 100, "consistency": 100}, "ml_readiness": { "target_quality": "good", "class_balance": "imbalanced", "data_completeness": 98.5, "recommendation": ["Considerar balanceamento de classes"] }, "needs_balancing": true } } ``` ### 3) `POST /api/process` * **JSON**: ```json { "target_column": "classe", "config": { "remove_duplicates": true, "treat_missing": true, "encode_categories": true, "normalize_data": false, "select_features": true, "num_features_percent": 50, "balance_classes": false } } ``` * **Resposta (sucesso)**: ```json { "success": true, "processing_stats": { "original_rows": 200, "original_columns": 14, "missing_values_treated": 12, "duplicates_removed": 0, "outliers_removed": 0, "categorical_encoded": 30, "boolean_encoded": 10, "normalized_columns": 0, "balanced_samples": 0, "final_rows": 200, "final_columns": 8, "features_selected": 7, "target_mapping": {"A": "0", "B": "1"}, "categorical_mappings": {"col_cat": {"x": "0", "y": "1"}}, "improvement_ratio": 1.0 }, "final_shape": [200, 8], "final_columns": ["f1","f2","...","classe"], "data_quality_improvement": { "completeness_before": 98.5, "completeness_after": 100, "duplicates_removed": 0, "features_optimized": 6 } } ``` ### 4) `POST /api/statistics` * **JSON**: ```json { "target_column": "classe" } ``` * **Resposta (sucesso)**: contém **imagens base64** e, quando possível, `profiling_report` (HTML minimal). ```json { "success": true, "plots": { "correlation_matrix": "data:image/png;base64,...", "distribution_plots": "data:image/png;base64,...", "boxplots": "data:image/png;base64,...", "target_distribution": "data:image/png;base64,...", "missing_values_heatmap": "data:image/png;base64,..." }, "statistics_summary": { "total_features": 14, "numeric_features": 10, "categorical_features": 3, "data_quality_score": 98.5 }, "describe_table": { "...": "..." }, "profiling_report": "..." } ``` ### 5) `POST /api/pca` * **JSON**: ```json { "target_column": "classe" } ``` * **Resposta (sucesso)**: ```json { "success": true, "pca_plot": "data:image/png;base64,...", "explained_variance": [0.523, 0.287], "cumulative_variance": 0.81, "pca_interpretation": { "pc1_description": "PC1 explica 52.3% da variância", "pc2_description": "PC2 explica 28.7% da variância", "recommendation": "Use as componentes para visualizar separação das classes" } } ``` ### 6) `POST /api/pca3d` * **JSON**: ```json { "target_column": "classe" } ``` * **Resposta (sucesso)**: ```json { "success": true, "pca_plot": "
...
", "explained_variance": [0.41, 0.23, 0.12], "cumulative_variance": 0.76 } ``` ### 7) `POST /api/outliers` * **Resposta (sucesso)**: ```json { "success": true, "outliers_plot": "data:image/png;base64,...", "outliers_count": 18, "outliers_percentage": 2.1, "detection_method": "Isolation Forest + Z-Score", "recommendation": "Outliers detectados podem ser tratados ou removidos" } ``` ### 8) `GET /api/download` * Retorna `processed_dataset.csv` (se disponível). ### 9) `POST /api/clear` * Limpa arquivos e estado (upload/processados). --- ## Variáveis de Ambiente | Variável | Padrão | Descrição | | ----------------- | --------------------------------------------------- | ------------------------------------------ | | `PORT` | `7860` | Porta de execução (exigida pelo HF Spaces) | | `ALLOWED_ORIGINS` | `https://.github.io,http://localhost:3000` | Origens autorizadas para CORS | | `SECRET_KEY` | `cleansight-secret` | Chave Flask | | `MPLBACKEND` | `Agg` | Backend para renderização headless | --- ## Como Executar Localmente ```bash # Clonar seu repositório (ex.: branch backend do Space) git clone https://huggingface.co/spaces//CleanSight-API cd CleanSight-API # Python 3.11+ python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -r requirements.txt export FLASK_ENV=development export PORT=5000 export ALLOWED_ORIGINS="http://localhost:3000,http://localhost:5173" # Executar (dev) python -c "from src.main import create_app; app=create_app(); app.run(host='0.0.0.0', port=5000, debug=True)" # ou com gunicorn (prod-like) gunicorn -w 2 -k gthread -b 0.0.0.0:5000 src.main:app --timeout 120 ``` --- ## Implantação no Hugging Face (SDK: Docker) 1. Crie um **Space**: * **Name**: `CleanSight-API` * **SDK**: `Docker` 2. Estrutura mínima: ``` CleanSight-API/ ├─ src/ │ ├─ routes/ │ │ └─ preprocessing_enhanced.py │ └─ main.py ├─ requirements.txt ├─ Dockerfile └─ README.md ``` 3. *Push*: ```bash git add . git commit -m "Initial CleanSight API (Flask + Docker + CORS)" git push ``` 4. Após o build, teste: ```bash curl -s https://-cleansight-api.hf.space/health ``` --- ## Exemplos (cURL) > Substitua `` por `https://-cleansight-api.hf.space`. ```bash # Health curl -s /health # Upload curl -s -X POST -F "file=@./meu_dataset.csv" /api/upload # Analyze (target) curl -s -X POST -H "Content-Type: application/json" \ -d '{"target_column":"classe"}' /api/analyze # Process (pipeline completo) curl -s -X POST -H "Content-Type: application/json" \ -d '{ "target_column": "classe", "config": { "remove_duplicates": true, "treat_missing": true, "encode_categories": true, "normalize_data": false, "select_features": true, "num_features_percent": 50, "balance_classes": false } }' \ /api/process # Estatísticas + gráficos curl -s -X POST -H "Content-Type: application/json" \ -d '{"target_column":"classe"}' /api/statistics # PCA 2D curl -s -X POST -H "Content-Type: application/json" \ -d '{"target_column":"classe"}' /api/pca # PCA 3D curl -s -X POST -H "Content-Type: application/json" \ -d '{"target_column":"classe"}' /api/pca3d # Outliers curl -s -X POST /api/outliers # Download do processado curl -L -o processed_dataset.csv /api/download # Limpar sessão curl -s -X POST /api/clear ``` --- ## Limites e Observações * **Tamanho de upload**: até **100 MB** (ajustável por `MAX_CONTENT_LENGTH` e limites do Space). * **Armazenamento**: `/tmp` é **efêmero** (reinícios perdem arquivos). * **Tempo de execução**: mantenha requisições < 120s (ajustável no `--timeout` do gunicorn). * **Profiling**: `ydata-profiling` em modo minimal; pode ser desativado removendo a dependência. --- ## Resolução de Problemas * **CORS bloqueado**: inclua seu domínio GitHub Pages em `ALLOWED_ORIGINS`. Ex.: `ALLOWED_ORIGINS="https://.github.io,http://localhost:3000"` * **Build lento/falha por dependências**: fixe versões no `requirements.txt` ou remova `ydata-profiling`. * **Timeout em processamento pesado**: reduza tamanho do dataset, ative opções do pipeline de forma incremental ou aumente `--timeout`. * **400/404 em rotas**: confirme o *path* (`/api/*`) e `target_column` existente no dataset. --- ## Licença Este projeto é licenciado sob **MIT License**. Sinta-se livre para usar, modificar e compartilhar.