Metadata-Version: 2.4
Name: wise-decision-engine
Version: 0.4.0
Summary: Uma abstração moderna e inteligente para zen-engine com otimizações avançadas para Spark/Databricks
License: MIT
License-File: LICENSE
Keywords: zen-engine,databricks,spark,decision-engine,schema-inference
Author: Five Acts
Author-email: dev@five-acts.com
Requires-Python: >=3.8,<4.0
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Database
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Provides-Extra: all
Provides-Extra: databricks
Provides-Extra: dev-local
Provides-Extra: spark
Requires-Dist: zen-engine (>=0.50.0,<0.51.0)
Project-URL: Documentation, https://github.com/five-acts/wise-decision-engine/wiki
Project-URL: Homepage, https://github.com/five-acts/wise-decision-engine
Project-URL: Repository, https://github.com/five-acts/wise-decision-engine
Description-Content-Type: text/markdown

# 🧠 Wise Decision Engine

**Motor de decisão que separa a definição das regras de negócio do seu local de processamento**

[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![Databricks Ready](https://img.shields.io/badge/Databricks-Ready-orange.svg)](https://databricks.com/)
[![CI/CD](https://github.com/five-acts/wise-decision-engine/workflows/CI/CD%20Pipeline/badge.svg)](https://github.com/five-acts/wise-decision-engine/actions)
[![codecov](https://codecov.io/gh/five-acts/wise-decision-engine/branch/main/graph/badge.svg)](https://codecov.io/gh/five-acts/wise-decision-engine)
[![PyPI version](https://badge.fury.io/py/wise-decision-engine.svg)](https://badge.fury.io/py/wise-decision-engine)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)

---

## 💼 **Problema de Negócio**

Em ambientes corporativos, **as regras de negócio mudam constantemente** mas estão frequentemente **acopladas ao código de processamento**. Isso gera:

- ⏳ **Demora para mudanças**: Alterações simples requerem deploy completo
- 🔄 **Dependência técnica**: Regras de negócio presas no pipeline de dados 
- 🚫 **Falta de governança**: Regras espalhadas e sem controle centralizado
- 💸 **Alto custo de manutenção**: Equipe técnica para mudanças de negócio

## 🎯 **Solução: Separação de Responsabilidades**

O **Wise Decision Engine** permite:

| **🏛️ DEFINIÇÃO DA REGRA** | **⚙️ PROCESSAMENTO DOS DADOS** |
|---------------------------|--------------------------------|
| Armazenada em **tabelas/arquivos** | Executado em **Spark/Databricks** |
| Modificável por **analistas** | Gerenciado por **engenheiros** |
| **Governança centralizada** | **Performance otimizada** |
| **Versionamento de regras** | **Processamento distribuído** |

## 🔧 **Como Funciona**

### 1. **Defina a Regra** (Uma vez)
```json
// Salva em tabela Databricks ou arquivo JSON
{
  "name": "aprovacao-credito",
  "rules": {
    "if": [{"var": "renda"}, ">", 5000],
    "then": {"aprovado": true, "limite": 10000},
    "else": {"aprovado": false, "limite": 0}
  }
}
```

### 2. **Processe os Dados** (Sempre que necessário)
```python
from wise_decision_engine import DatabricksHelper

# Uma linha aplica a regra para milhões de registros
resultado = DatabricksHelper.quick_decision_apply(
    catalog="regras_catalog",
    schema="public", 
    table="decisoes",
    decision_name="aprovacao-credito",
    input_df=clientes_df  # DataFrame com milhões de clientes
)

# ✅ Resultado: DataFrame com decisões aplicadas automaticamente
resultado.show()
```

### 3. **Mude a Regra** (Sem redeploy)
```sql
-- Analista de negócio altera diretamente na tabela
UPDATE regras_catalog.public.decisoes 
SET content = '{"rules": {"if": [{"var": "renda"}, ">", 8000], ...}}'
WHERE name = 'aprovacao-credito';

-- ✅ Próxima execução já usa a nova regra (cache automático)
```

## 📦 **Instalação**

```bash
pip install wise-decision-engine
```

## 🚀 **Casos de Uso Reais**

### **Aprovação de Crédito**
```python
# Regra armazenada em tabela Databricks
# Processamento em Spark para milhões de clientes
resultado = DatabricksHelper.quick_decision_apply(
    "financeiro_catalog", "regras", "decisoes",
    "aprovacao-pf", clientes_df
)
```

### **Detecção de Fraude**
```python
# Mesma interface, regra diferente
# Analista atualiza regra sem código
resultado = DatabricksHelper.quick_decision_apply(
    "risco_catalog", "regras", "decisoes", 
    "deteccao-fraude", transacoes_df
)
```

### **Precificação Dinâmica**
```python
# Regras de pricing atualizadas em tempo real
resultado = DatabricksHelper.quick_decision_apply(
    "comercial_catalog", "regras", "decisoes",
    "precificacao-produto", vendas_df
)
```

## 🎯 **Benefícios de Negócio**

### **Para Analistas de Negócio**
- ✅ **Autonomia total**: Alteram regras sem depender de TI
- ✅ **Versionamento**: Histórico completo de mudanças
- ✅ **Teste A/B**: Diferentes versões de regras facilmente
- ✅ **Governança**: Controle centralizado de todas as regras

### **Para Engenheiros de Dados** 
- ✅ **Menos deploy**: Mudanças de regra não requerem código
- ✅ **Performance**: Processamento otimizado para Spark
- ✅ **Manutenibilidade**: Código limpo e desacoplado
- ✅ **Escalabilidade**: Engine preparada para big data

### **Para Organização**
- 💰 **Redução de custos**: 80% menos tempo para mudanças
- ⚡ **Time-to-market**: Novas regras em minutos, não semanas
- 🔒 **Compliance**: Auditoria completa de regras aplicadas
- 📈 **Agilidade**: Resposta rápida a mudanças de mercado

## 🏗️ **Arquitetura da Solução**

```
┌─────────────────┐    ┌──────────────────┐    ┌─────────────────┐
│   📋 REGRAS     │    │  🔄 PROCESSING   │    │  📊 RESULTADO   │
│                 │    │                  │    │                 │
│ • Tabela Delta  │───▶│ • Spark Engine   │───▶│ • DataFrame     │
│ • Arquivos JSON │    │ • Cache Auto     │    │ • Schema Auto   │
│ • Versionadas   │    │ • UDFs Otimizas  │    │ • Performance   │
└─────────────────┘    └──────────────────┘    └─────────────────┘
```

### **Separação Clara de Responsabilidades**
- **📋 Camada de Regras**: Definição e governança (Analistas)
- **🔄 Camada de Processamento**: Performance e escala (Engenheiros)  
- **📊 Camada de Resultado**: Consumo e análise (Usuários finais)

## 🔍 **Auto-Schema: Expansão Automática de Colunas**

### **Problema: Schema Manual Complexo**
Antes, criar colunas a partir dos resultados das decisões requeria **~20 linhas de código manual**:

```python
# ❌ Schema manual (complexo e propenso a erros)
exemplo_json = resultado_df.select("wd_result").limit(1).collect()[0]["wd_result"]
exemplo_result = json.loads(exemplo_json).get("result", {})

# Define tipos manualmente para cada campo
result_fields = []
for k, v in exemplo_result.items():
    field_type = type_map.get(type(v), StringType())
    result_fields.append(StructField(k, field_type, True))

result_schema = StructType(result_fields)
# ... mais 10+ linhas para aplicar schema ...
```

### **Solução: Auto-Schema Inteligente**
Com auto-schema, isso vira **1 parâmetro**:

```python
# ✅ Auto-schema (automático e inteligente)
resultado = DatabricksHelper.quick_decision_apply(
    "catalog", "schema", "decisoes", "minha-regra", df,
    auto_schema=True,              # 🔥 Detecção automática de tipos
    schema_strategy="aggressive",   # Estratégia inteligente
    show_schema_info=True          # Mostra o que foi detectado
)

# ✅ Resultado: Todas as colunas expandidas automaticamente com tipos corretos!
```

### **Como Funciona o Auto-Schema**

1. **🔍 Análise Automática**: Coleta amostras dos resultados JSON
2. **🧠 Detecção Inteligente**: Identifica tipos automaticamente (int, bool, string, arrays, structs)
3. **📊 Schema Otimizado**: Cria schema Spark com tipos corretos
4. **⚡ Expansão Automática**: Converte para colunas individuais com prefixo `decision_*`

### **Estratégias Disponíveis**

| Estratégia | Descrição | Uso Recomendado |
|-----------|-----------|----------------|
| `conservative` | Tipos básicos apenas | Produção estável |
| `aggressive` | Inclui arrays e structs aninhados | Estruturas complexas |
| `flat_only` | Apenas campos de primeiro nível | Performance máxima |

### **Exemplo de Transformação**

**Input JSON:**
```json
{
  "result": {
    "score": 750,
    "approved": true,
    "limit": 10000.50,
    "reasons": ["good_credit", "stable_income"]
  }
}
```

**Schema Detectado Automaticamente:**
- `score` → `IntegerType()`
- `approved` → `BooleanType()`
- `limit` → `DoubleType()`
- `reasons` → `ArrayType(StringType())` (modo aggressive)

**DataFrame Final:**
```
Original columns + decision_score + decision_approved + decision_limit + decision_reasons
```

### **Benefícios do Auto-Schema**

| Aspecto | Schema Manual | Auto-Schema | Melhoria |
|---------|---------------|-------------|----------|
| **Linhas de código** | ~20 linhas | 1 parâmetro | **20x menos** |
| **Detecção de tipos** | Manual | Automática | **100% automático** |
| **Estruturas complexas** | Muito complexo | Simples | **10x mais simples** |
| **Manutenção** | Alta | Zero | **Eliminada** |
| **Erros de schema** | Frequentes | Raros | **95% redução** |
| **Tempo de desenvolvimento** | Horas | Segundos | **1000x mais rápido** |

### **Casos de Uso Ideais para Auto-Schema**
- ✅ Decisões com muitos campos de saída
- ✅ Estruturas que mudam frequentemente  
- ✅ Múltiplas decisões com schemas diferentes
- ✅ Prototipagem rápida
- ✅ Ambientes de produção com governança

---

## ⚙️ **Configuração Avançada**

### **Adapters Disponíveis**

```python
from wise_decision_engine import WiseDecisionEngine, DatabricksAdapter, FileAdapter

# Para tabelas Databricks
adapter = DatabricksAdapter(
    catalog="meu_catalog",
    schema="regras", 
    table="decisoes"
)

# Para arquivos JSON locais
adapter = FileAdapter(file_path="/path/to/rules.json")

# Engine configurável
engine = WiseDecisionEngine(adapter=adapter)
```

## 💡 **Exemplo Completo**

### **Notebook Databricks**

```python
# 1. Instalar
%pip install wise-decision-engine

# 2. Aplicar decisão
from wise_decision_engine import DatabricksHelper

resultado = DatabricksHelper.quick_decision_apply(
    catalog="regras_catalog",
    schema="public", 
    table="decisoes",
    decision_name="minha-regra",
    input_df=meus_dados_df
)

# 3. Visualizar resultado
resultado.display()
```

## 🤝 **Contribuição e Suporte**

### **Repositório**
- **Código**: [GitHub](https://github.com/five-acts/wise-decision-engine)
- **Issues**: [Reportar problemas](https://github.com/five-acts/wise-decision-engine/issues)
- **Documentação**: [Wiki](https://github.com/five-acts/wise-decision-engine/wiki)

### **Como Contribuir**
1. Fork o repositório
2. Crie sua feature branch
3. Commit suas mudanças
4. Abra um Pull Request


---

## 📄 **Licença**

MIT License - veja [LICENSE](LICENSE) para detalhes.

**Construído pela [Five Acts](https://github.com/five-acts)** 🎆

