Nixtla
Papel no sistema
Os adapters em src/infra/modeling/nixtla/ são a ponte entre o contrato
interno da engine e as bibliotecas concretas de forecast.
No runtime:
- o
ModelDefinitionpersistestrategy_key,library_family,params_schema,evaluation_spec,validation_policy,series_projection_recipe,feature_recipeechampion_reuse_policy; - os jobs Airflow montam um
DefaultStrategyCatalog; register_nixtla_strategies(...)registra o provider Nixtla no catálogo;- o caso de uso resolve a estratégia pelo
strategy_keye executa treino ou predição.
Isso mantém domínio e aplicação sem dependência direta de statsforecast,
mlforecast ou scikit-learn.
Famílias suportadas
library_family | Adapter | Catálogo padrão | Modos de treino | Observações |
|---|---|---|---|---|
nixtla-statsforecast | NixtlaStatsForecastStrategy | statsforecast/catalog.py | series | suporta modelos estatísticos e alguns intervalos |
nixtla-mlforecast | NixtlaMLForecastStrategy | mlforecast/catalog.py | series | usa regressão sobre colunas geradas por feature_recipe |
strategy_key e library_family são normalizados para slug no domínio. O
lookup real acontece pelo strategy_key; o library_family serve para validar
o contrato e proteger contra combinações incompatíveis.
Como a configuração é interpretada
Cada StrategySpec persiste um params_schema com esta forma:
{ "model": { "name": "seasonal-naive", "hyperparams": {} }, "intervals": { "levels": [] }, "execution": { "max_workers": 1 }}Regras relevantes:
model.nameprecisa bater com o modelo concreto esperado pelo adapter;execution.max_workerscontrola paralelismo bounded entre séries independentes;- preparo reutilizável vive em
feature_recipe; quando uma estratégia declara sua própria receita, o boundary de data-preparation aplica essa receita depois da projeção e antes do adapter Nixtla receber o frame por série; intervals.levelsaceita inteiros entre1e99;nixtla-mlforecastenixtla-statsforecasttreinam uma série por chamada de estratégia.
Além disso, a promoção usa as métricas expostas pela própria estratégia. A engine:
- separa treino e holdout por série usando helpers frame-native guiados por
evaluation_spec; - chama
train(...)epredict(...)sobre o prefixo do holdout para validar o caminho de artefato e previsão; - treina o candidato final com o frame completo;
- persiste no
metric_snapshotas métricas retornadas porTrainResult.metrics.
Uma falha de avaliação ou treino invalida o run inteiro, sem promoção parcial, mesmo quando várias séries são executadas em paralelo.
Para o contrato completo de ModelDefinition, veja
Configuração de model definition.
Tradução de dados
Os adapters Nixtla não recebem qualquer payload arbitrário. A entrada precisa ser
um payload canônico por série, entregue pelo boundary de data-preparation para o
control. O contrato do control é genérico e separa payload de treino de
payload de forecast; o adapter aceita frames Polars vindos do boundary de
data-preparation e passa Polars diretamente para as integrações Nixtla.
No caminho de treino e predição:
- o adapter ordena por
period_start. - a série vira um
unique_idestável pororganization_id + series_kind + series_id + grain. period_startviradsequantityviray.- colunas extras geradas por
feature_recipeseguem como regressoras quando o adapter precisa delas.
Na volta:
- o adapter traduz
dsparaperiod_start; - a coluna prevista vira
value; uomé preservada a partir do frame de entrada;- intervalos viram
lower,uppereconfidencequando o modelo os expõe.
Limites importantes:
- o frame precisa seguir o contrato canônico de treino;
- a série precisa ter uma única
uom; - a integração assume as colunas canônicas de demanda, não aliases locais.
nixtla-statsforecast
NixtlaStatsForecastStrategy cobre modelos estatísticos já incluídos, como
seasonal-naive, auto-arima, auto-ets e outros do catálogo interno.
Semântica principal:
- implementa
train(...)epredict(...); - cada série gera seu próprio artefato e seu próprio run de treino;
- no MLflow, cada série abre um run pai com nome derivado do
SeriesKeye sufixonanoid; os runs de estratégia dessa série entram como filhos viamlflow.parentRunId; - a promoção do campeão não usa mais métricas fitted/in-sample do catálogo;
- para famílias sazonais,
season_lengthpode ser inferido dograin; - alguns modelos aceitam intervalos; outros são
point_onlysob a integração atual.
Na prática, nixtla-statsforecast é a família mais flexível para o MVP porque
não depende de pipeline de regressão.
nixtla-mlforecast
NixtlaMLForecastStrategy cobre regressões já incluídas, como ridge,
random-forest, extra-trees e hist-gradient-boosting.
Semântica principal:
- recebe as colunas de feature já materializadas pelo
feature_recipe; - usa colunas extras numéricas como regressoras e colunas categóricas via
OneHotEncoder; - grava no artefato a lista de colunas usadas pelo regressor e a receita de features treinada;
- retorna metadados de relatório com colunas concretas de feature, configuração resolvida do modelo e coeficientes/importâncias quando o estimador os fornece;
- na predição, usa a porta
FeatureEngineeredPredictionPortpara reconstruir as features a cada passo e realimentar as previsões no histórico antes do próximo ponto; - para modelos com componente aleatório, injeta
random_state=0se ele não vier configurado; - calcula métricas supervisionadas sobre a matriz de treino já preparada.
Esse adapter é útil quando a série precisa de regressão sobre lags e features estáticas, sempre no contrato de treino por série.
A composição Nixtla injeta a implementação Polars dessa porta no catálogo de estratégias. Assim o mesmo caminho vale para treino local, jobs Airflow e execução de predição, sem o adapter MLForecast construir a implementação por conta própria.
Artefatos e validação
Os dois adapters serializam artefatos no mesmo formato: um zip com:
manifest.jsonmodel.pkl
O manifesto registra:
strategy_keyresolved_configfeature_recipefeature_columnsnos modelos MLForecast
Na predição, o adapter valida que o manifesto bate com o strategy_key
resolvido. O restante do manifesto é dado operacional do próprio caminho de
predição: configuração resolvida, receita de features e colunas do regressor
quando existirem. Não há camada de compatibilidade para manifestos antigos.
Isso evita aceitar artefatos de outra estratégia sem manter metadados duplicados que já existem no catálogo ou no comando de treino.
URI de artefato
Na leitura do artefato, a integração Nixtla aceita:
file://...- caminho local simples
s3://bucket/key
Se o URI for s3://, o adapter depende de um cliente boto3 compatível
injetado no bootstrap.
Limitações atuais
- global/panel modeling ainda não é um conceito exposto; se necessário, deve entrar como estratégia explícita própria, não como configuração de execução;
- alguns modelos
statsforecastexpõem apenas point forecast; - a integração espera schema canônico de demanda, sem etapa de mapeamento flexível.
Onde estender
Para adicionar um novo modelo nessa família:
- inclua a spec no catálogo correto;
- mantenha o
strategy_keyestável; - registre o catálogo no bootstrap dos jobs;
- documente o uso na página de configuração, se o contrato mudar.