Skip to main content

Uma abstração moderna e inteligente para zen-engine com otimizações avançadas para Spark/Databricks

Project description

🚀 Wise Decision Engine

Uma abstração moderna e inteligente para zen-engine com otimizações avançadas para Spark/Databricks

Python 3.8+ License: MIT Databricks Ready CI/CD codecov PyPI version Code style: black


Por Que Usar o WiseDecisionEngine?

O WiseDecisionEngine transforma a complexidade do zen-engine + PySpark em uma experiência simples, rápida e automatizada:

🎯 Antes vs Depois

ANTES (zen-engine + PySpark manual) DEPOIS (WiseDecisionEngine)
😰 ~30 linhas de código boilerplate ✅ 3 linhas de código
🐌 Schema manual e propenso a erros 🚀 Schema inference automático
🔄 Recarrega decisão a cada execução ⚡ Cache inteligente integrado
🛠️ Configuração complexa de UDFs 🎯 UDFs otimizadas prontas
📊 Expansão manual de resultados JSON 🔍 Expansão automática + tipos

🚀 Funcionalidades Principais

🎯 Aplicação Ultra-Simples de Decisões

# Uma linha faz tudo!
resultado = DatabricksHelper.quick_decision_apply(
    "wisedecisions_catalog", "public", "decision", 
    "credito-pj", clientes_df
)

🧠 Schema Inference Automático

# Detecta automaticamente tipos e estruturas JSON
resultado = DatabricksHelper.quick_decision_apply(
    "wisedecisions_catalog", "public", "decision", 
    "credito-pj", clientes_df,
    auto_schema=True,              # 🔥 Magia automática!
    schema_strategy="aggressive"   # conservative|aggressive|flat_only
)

⚡ Cache Inteligente Integrado

  • Cache automático de definições de decisão
  • Invalidação inteligente baseada em timestamps
  • Performance 10x superior em re-execuções

📊 Adaptadores Flexíveis

  • FileAdapter: Para arquivos JSON locais
  • DatabricksAdapter: Integração nativa com tabelas
  • Extensível: Crie seus próprios adaptadores facilmente

📦 Instalação

pip install wise-decision-engine

Dependências

  • zen-engine >= 0.1.0
  • pandas >= 1.3.0
  • pyspark >= 3.1.0 (para Databricks/Spark)

🎯 Uso Rápido - 30 Segundos

1. Aplicação Direta (Método mais rápido)

from wise_decision_engine import DatabricksHelper

# Aplica decisão com schema inference automático
resultado_df = DatabricksHelper.quick_decision_apply(
    catalog="wisedecisions_catalog",
    schema="public", 
    table="decision",
    decision_name="credito-pj",
    input_df=clientes_df,
    auto_schema=True,              # ✨ Detecta tipos automaticamente
    schema_strategy="aggressive",  # Máximo aproveitamento dos dados
    show_schema_info=True          # Mostra o que foi detectado
)

# Pronto! DataFrame com colunas expandidas automaticamente 🎉
resultado_df.show()

2. Engine Configurável (Controle total)

from wise_decision_engine import WiseDecisionEngine, DatabricksAdapter

# Cria adapter personalizado
adapter = DatabricksAdapter(
    catalog="wisedecisions_catalog",
    schema="public", 
    table="decision",
    enable_cache=True,    # Cache automático
    cache_ttl=3600       # Cache por 1 hora
)

# Inicializa engine
engine = WiseDecisionEngine(
    adapter=adapter,
    decision_name="credito-pj"
)

# Aplica com configurações avançadas
resultado_df = engine.apply_to_dataframe(
    clientes_df,
    auto_expand_results=True,         # Expande JSON automaticamente
    inference_strategy="conservative" # Estratégia de schema
)

🧠 Schema Inference: O Diferencial

3 Estratégias Inteligentes

Estratégia Quando Usar O Que Detecta
conservative 🛡️ Produção segura, JSONs dinâmicos Tipos básicos (int, string, bool)
aggressive 🚀 Máximo aproveitamento, JSONs estáveis Arrays, objetos aninhados, tipos complexos
flat_only 📋 Performance máxima, só campos principais Apenas primeiro nível de campos

Exemplo: Detecção Automática

// JSON de entrada
{
  "result": {
    "score": 750,
    "approved": true,
    "details": {"income": "high", "risk": 0.1},
    "recommendations": ["increase_limit", "offer_premium"]
  }
}
# CONSERVATIVE: Tipos básicos
# score (int), approved (bool), details (string), recommendations (string)

# AGGRESSIVE: Estruturas completas  
# score (int), approved (bool), 
# details (struct<income:string, risk:double>), 
# recommendations (array<string>)

# FLAT_ONLY: Só essencial
# score (int), approved (bool)

📊 Exemplos Avançados

🔥 Comparação de Performance

# ❌ ANTES: Método manual (~30 linhas)
decision_json = spark.table("wisedecisions_catalog.public.decision")\
    .filter(col("name") == "credito-pj")\
    .select("content").collect()[0]["content"]

decision_obj = zenengine.Decision.from_json(decision_json)

def evaluate_decision(data_json):
    try:
        data = json.loads(data_json)
        result = decision_obj.evaluate(data)
        return json.dumps(result.to_dict())
    except:
        return None

evaluate_udf = udf(evaluate_decision, StringType())
result_df = clientes_df.withColumn("wd_result", evaluate_udf(to_json(struct("*"))))

# Manual schema parsing... +15 linhas
# ...

# ✅ DEPOIS: WiseDecisionEngine (3 linhas)
resultado_df = DatabricksHelper.quick_decision_apply(
    "wisedecisions_catalog", "public", "decision", "credito-pj", clientes_df, auto_schema=True
)

🎯 Múltiplas Decisões

# Aplicar múltiplas decisões facilmente
decisoes = ["credito-pj", "limite-credito", "deteccao-fraude"]

for decisao in decisoes:
    resultado_df = DatabricksHelper.quick_decision_apply(
        "wisedecisions_catalog", "public", "decision", 
        decisao, clientes_df, 
        auto_schema=True,
        result_column=f"resultado_{decisao}"
    )

🔍 Análise e Debug

from wise_decision_engine import AutoSchemaHelper

# Visualiza schema inference
AutoSchemaHelper.print_schema_info(resultado_df, "wd_result")

# Saída:
# 📊 Schema Inferido:
#    score: IntegerType()
#    approved: BooleanType()  
#    limit: IntegerType()
#    reason: StringType()

🏗️ Arquitetura

Componentes Principais

WiseDecisionEngine/
├── 🏛️  Core Engine          # Engine principal
├── 🔌  Adapters             # Fonte de dados (File, Databricks, Custom)  
├── ⚡  Spark Utilities      # UDFs otimizadas para Spark
├── 🧠  Schema Inference     # Detecção automática de tipos
├── 💾  Caching             # Sistema de cache inteligente
└── 🛠️  Helpers            # Utilities e funções de conveniência

Extensibilidade

# Criar adapter personalizado
class CustomAdapter(BaseAdapter):
    def load_decision(self, name: str) -> Dict[str, Any]:
        # Sua lógica customizada
        pass

# Usar com WiseDecisionEngine
engine = WiseDecisionEngine(adapter=CustomAdapter())

⚙️ Configuração no Databricks

Notebook Databricks

# Instalar zen-engine (se necessário)
%pip install zen-engine

# Importar e usar
from wise_decision_engine import DatabricksHelper

# Aplicar decisão
resultado = DatabricksHelper.quick_decision_apply(
    "wisedecisions_catalog", "public", "decision",
    "credito-pj", spark.table("workspace.default.credito_pj"),
    auto_schema=True
)

resultado.display()  # Visualização automática no Databricks

🧪 Desenvolvimento

Configuração do Ambiente

# Clonar
git clone https://github.com/five-acts/wise-decision-engine.git
cd wise-decision-engine

# Instalar dependências de desenvolvimento
pip install -e ".[dev,test]"

# Configurar pre-commit hooks
pre-commit install

# Executar testes
pytest

# Executar exemplos
python examples/schema_inference_example.py

🔖 Versionamento e Releases

O projeto usa versionamento semântico automático baseado em Conventional Commits:

📝 Tipos de Commit

# PATCH (0.1.0 → 0.1.1)
fix: corrige bug no schema inference
perf: melhora performance do cache
style: ajusta formatação

# MINOR (0.1.0 → 0.2.0)  
feat: adiciona suporte a arrays aninhados

# MAJOR (0.1.0 → 1.0.0)
feat!: remove suporte ao Python 3.7
BREAKING CHANGE: muda API do adaptador

🚀 Release Automático

  1. Commit com tipo: O pipeline detecta automaticamente o tipo
  2. Tag criada: Versão calculada e tag v1.2.3 criada
  3. Build & Deploy: Package publicado automaticamente no PyPI
  4. GitHub Release: Release notes geradas automaticamente

🛠️ Release Manual

# Criar tag manualmente (se necessário)
git tag -a v0.2.0 -m "Release v0.2.0"
git push origin v0.2.0

Estrutura do Projeto

wise-decision-engine/
├── wise_decision_engine/     # Código principal
│   ├── __init__.py          # API pública
│   ├── core.py             # WiseDecisionEngine
│   ├── adapters/           # Adaptadores de fonte
│   ├── spark_utils.py      # Utilitários Spark
│   ├── schema_inference.py # Schema automático
│   └── cache.py           # Sistema de cache
├── examples/               # Exemplos práticos  
├── tests/                 # Testes unitários
├── notebooks/             # Notebooks Databricks
└── docs/                  # Documentação

📈 Benefícios Quantificados

Métrica Manual WiseDecisionEngine Melhoria
Linhas de código ~30 3 10x menos
Tempo de desenvolvimento 2-4 horas 5 minutos 50x mais rápido
Erros de schema Frequentes Raros 95% redução
Performance (re-execução) Lenta Rápida 10x cache
Manutenção Alta Zero Eliminada

🤝 Contribuição

Contribuições são muito bem-vindas!

Como Contribuir:

  1. Fork o projeto
  2. Crie uma branch (git checkout -b feature/nova-funcionalidade)
  3. Commit suas mudanças (git commit -am 'Adiciona nova funcionalidade')
  4. Push para a branch (git push origin feature/nova-funcionalidade)
  5. Abra um Pull Request

📄 Licença

Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.


🙋 Suporte


Reconhecimento

Se o WiseDecisionEngine ajudou você, considere dar uma ⭐ no projeto!

Construído com 💙 pela equipe Five Acts


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wise_decision_engine-0.1.0.tar.gz (37.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wise_decision_engine-0.1.0-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

Details for the file wise_decision_engine-0.1.0.tar.gz.

File metadata

  • Download URL: wise_decision_engine-0.1.0.tar.gz
  • Upload date:
  • Size: 37.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for wise_decision_engine-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3abe47b307cb430a62d77c17de00a0d49b1389fe0828d4fc2bde202d798e1c5e
MD5 58621b94d833fbe12050cb8103048bc9
BLAKE2b-256 7ac24799dff3b513fcf7d31eefb1fcd51e9a64ca4481303f33704686cf26c8ef

See more details on using hashes here.

File details

Details for the file wise_decision_engine-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for wise_decision_engine-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 01c74cd50d1715cf08547600cbd39221c0dbc13a4f1ddfd0b97c8119b83d082f
MD5 a65c0277d20f3332dc525655e0dfeb1b
BLAKE2b-256 464b686d4465d3772ebd08b9a60d3080a5080b8fcd1afb215f9ffa1fb5fe7328

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page