Skip to content

Python ​

Tipo
Referência
Para
Engenharia de dados, Desenvolvedor
Na tela
HorusETL › Dataflows › editor do Dataflow

Um script Python escrito no nó Python (Pandas) roda no computador do Agente ETL. As entradas chegam como DataFrames do pandas, e o DataFrame que o script deixa em result vira a saída do nó. Serve para o que o SQL não resolve bem: chamar uma biblioteca, aplicar um modelo, tratar texto com regras longas.

Na bibliotecakind no YAMLGrupoEntradas
Python (Pandas)PythonProcessorTransformaçõesnenhuma ou mais

Para gerar variáveis em vez de linhas, o nó é o Configurador Python, descrito em Configuradores.

Campos ​

Na telaNo YAML (options)TipoRegra
Editar Código PythonSourcecodetextoO script
sem campo na telaFileNametextoNós antigos guardavam o script num arquivo no armazenamento do Lumo. Só é lido quando Sourcecode está vazio

O editor tem um assistente de IA que escreve o script a partir de uma descrição, uma lista de trechos salvos e o histórico de versões do código.

O que o script recebe ​

NomeO que é
input_0, input_1...Um DataFrame por entrada, na ordem em que foram ligadas, com os nomes das colunas em maiúsculas
variáveis do DataflowUma variável Python por variável do Dataflow, com o mesmo nome: texto vira str, número vira número, booleano vira bool, data vira datetime.datetime, vazio vira None
pd, datetime, math, jsonJá importados

O {NOME} não é trocado dentro do script: use a variável pelo nome, como StartDate.

O que o script devolve ​

  • Deixe o resultado em result. df também vale, mas result tem preferência quando os dois estão preenchidos.
  • Sem nenhum dos dois, o nó falha com "Nenhum dado foi retornado pelo script."
  • Os nomes das colunas da saída vão para maiúsculas.
  • O índice do DataFrame é descartado. Para guardar o índice, use result = result.reset_index().
python
# input_0: pedidos; input_1: clientes
pedidos = input_0[input_0["DATA_EMISSAO"] >= StartDate]

result = (
    pedidos.merge(input_1[["CLIENTE_ID", "SEGMENTO"]], on="CLIENTE_ID", how="left")
           .groupby(["SEGMENTO"], as_index=False)["VALOR"].sum()
)

Onde o script roda ​

Cada execução abre um processo Python separado no computador do Agente ETL. Não há limite de tempo. Tudo o que o script escreve com print ou na saída de erro vai para o log da execução, linha a linha. Se o processo terminar com erro, a mensagem de erro do Python vira a mensagem do nó. Para parar a carga de propósito, use raise Exception("Entrada vazia").

O Agente ETL usa o primeiro Python 3 que encontrar, nesta ordem:

Agente ETLOrdem de buscaPython e bibliotecas
Windows1. PythonEmbed\python.exe, na pasta do Agente
2. python.exe, python ou python3 do PATH do sistema
O embutido é 3.9, com versão fixa por versão do Agente e um conjunto próprio de bibliotecas: teste o import antes de depender de uma. O do sistema só é usado se a pasta PythonEmbed sumiu ou não responde; aí valem a versão e as bibliotecas instaladas nele
Linux (contêiner horusbi/etl)1. /usr/bin/python3
2. python ou python3 do PATH
O Python da imagem: 3.13 a partir da 0.9.23 (Debian 13), 3.11 até a 0.9.22. Bibliotecas: pandas, numpy, pyarrow, fastparquet, polars, duckdb, scipy, scikit-learn, statsmodels, prophet, pmdarima, xgboost, lightgbm, optuna, hyperopt, shap, lime, mlxtend, kneed, umap-learn, dask, ray, joblib, multiprocess, celery, nltk, requests, urllib3, aiohttp, beautifulsoup4, scrapy, orjson, openpyxl, gspread, oauth2client, firebase_admin, google-cloud-firestore, kafka-python, psycopg2-binary, mysql-connector-python, pymssql, pymongo, firebird-driver

Não dá para instalar biblioteca pelo nó. No Windows, instalar uma biblioteca no Python do sistema não adianta enquanto o PythonEmbed existir, porque o Agente usa o embutido primeiro. Um script feito num Agente ETL em contêiner pode falhar num Agente ETL Windows pela versão do Python ou por falta de biblioteca.

Se nenhum Python responde, a execução falha com Python não encontrado neste agente., seguido de cada caminho tentado e o motivo. No Windows, a mensagem diz também se a pasta PythonEmbed existe; reinstalar ou atualizar o Agente recria a pasta.

O Python 3.13 não traz mais alguns módulos antigos da biblioteca padrão, como distutils, imp, cgi, imghdr e telnetlib. Um script que importa um deles para de rodar no contêiner a partir da 0.9.23 com ModuleNotFoundError. Troque pelo substituto indicado na documentação do Python.

Para filtro, join e agrupamento, o SQL (DuckDB) roda dentro do próprio Agente ETL, sem abrir um processo Python nem gravar a saída em arquivo para ler de volta. No Python, prefira operações do pandas sobre a coluna inteira a um laço com iterrows.

Relacionado ​

Pelo Lumo CLI

O nó também pode ser escrito e versionado em YAML. Veja a referência de flow.