Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

AutoHybTS

Python 3.11+ Documentação CI Licença MIT

AutoHybTS

Automated Hybrid Time Series Forecasting. Biblioteca Python que automatiza a comparação de modelos individuais de previsão e a descoberta de sistemas híbridos residuais (modelo-base + corretor do erro), aceitando complexidade adicional só quando critérios de validação temporal definidos pelo usuário são satisfeitos.

A interface é inspirada no PyCaret — um experimento, métodos curtos, resultados prontos para tabela e gráfico —, mas o foco é outro: reunir num só fluxo, com validação sem vazamento, os modelos híbridos residuais para previsão de séries temporais e as estratégias de montá-los (correção aditiva, vários estágios, decomposição, combinação).

Status: candidata à v1 (1.0.0rc1). A API funciona para uma série ou um painel de séries, nas variantes A (multipasso) e B (rolling de um passo com parâmetros congelados). Esta é uma pré-versão para validação; a 1.0.0 estável depende da conferência final e do estudo em séries reais. Veja as notas e a política de compatibilidade.

Instalação

Requer Python 3.11 ou mais novo.

Para testar o código antes da publicação da candidata, instale direto do repositório:

pip install "autohybts[stats,plot] @ git+https://github.com/jvataidee/AutoHybTS.git"

A publicação de v1.0.0rc1 será feita primeiro no TestPyPI. As instruções para instalar a candidata pelo índice de testes estão nas notas de release.

Para usar modelos próprios em PyTorch ou TensorFlow, acrescente os extras torch e/ou tensorflow (ex.: autohybts[stats,plot,torch]).

Início rápido

from autohybts import AutoHybridExperiment, load_model, save_model
from autohybts.datasets import get_data

y = get_data("synthetic_daily")  # pd.Series diária
exp = AutoHybridExperiment(fh=14, session_id=42).fit(y)  # sela os últimos 14 pontos

result = exp.compare_models()  # busca em V_search + seleção incremental em V_select
result.leaderboard  # todas as candidatas avaliadas na busca
result.decisions  # cada desafiante (ex.: arima-mlp): aceito ou não, e por quê

final = exp.finalize_model(result.best)  # reajuste no histórico anterior ao teste
exp.predict_model(final).predictions  # previsões indexadas por data
exp.evaluate_external(final).metrics  # teste selado, uma única vez

path = save_model(final, "artifacts/champion")
model = load_model(path, trusted=True)  # trusted=True: só para arquivos de confiança

Carregar um modelo executa código (pickle). Para artefatos que passam por outras mãos, assine com save_model(..., signing_key=chave) e confira com load_model(..., signing_key=chave), ou fixe o hash com load_model(..., sha256=...).

Estratégias de montar o sistema híbrido

result = exp.compare_models(
    include=("standalone", "residual", "multistage", "decomposition", "combination")
)
result.strategies  # melhor e mediana de cada estratégia
result.plot("pareto")  # erro × custo; também x="complexity" e "strategies"

exp.create_hybrid("arima", "mlp")  # ŷ = b + α·r̂
exp.create_hybrid("arima", "mlp", extra_stages=["linear"])  # correção da correção
exp.create_decomposition("linear", "mlp", method="ma")  # suave + volátil
exp.create_combination(["arima", "knn"], weights="inverse_mse")
exp.tune_model("knn", n_trials=20)  # só em V_search; Optuna se instalado

Comparação e validação cruzada temporal

cv = exp.cross_validate(folds=8, step=7)  # mesmas origens para todos os modelos
cv.summary  # média, desvio, posto médio
cv.tests()  # Wilcoxon e Diebold-Mariano com Holm (relatório)
cv.plot("critical_difference")  # também: leaderboard, boxplot, win_rate, forecasts
exp.nested_cross_validate(outer_folds=3)  # o procedimento inteiro, dobra a dobra

Modelos próprios (PyTorch, TensorFlow, qualquer biblioteca)

from autohybts.models import keras_model, keras_zoo, torch_model
from autohybts.models.torch_zoo import LSTMNet, MambaNet

exp.register_model(
    "lstm",
    torch_model(LSTMNet, hidden=32, lags=28, differencing=1),
    family="deep",
    requires={"torch": ">=2.2"},
    version="1",
)
exp.register_model(
    "mamba",
    torch_model(MambaNet, d_model=32, lags=28, differencing=1),
    family="deep",
    requires={"torch": ">=2.2"},
    version="1",
)
exp.register_model(
    "keras_lstm",
    keras_model(keras_zoo.lstm, units=32, lags=28),
    family="deep",
    requires={"tensorflow": ">=2.16"},
    version="1",
)
# depois, os nomes valem em base_models, correctors, create_hybrid, tune_model ...

Várias séries

exp = AutoHybridExperiment(fh=14).fit({"loja_a": y_a, "loja_b": y_b})
result = exp.compare_models()  # ranking pela média dos postos entre séries
model = exp.finalize_model(result.best)  # PanelForecaster: um modelo por série
exp.evaluate_external(model).metrics  # uma linha por série + média

Datasets

Copie o nome e passe para get_data; o resultado é uma pd.Series pronta para o fit.

from autohybts.datasets import get_data

y = get_data("ozone")
Nome O que é Frequência Pontos
synthetic_daily sintética: tendência, sazonalidade semanal e ruído AR(1) (offline) diária 730
white_noise_daily sintética: nível + ruído branco, controle negativo (offline) diária 730
air_passengers passageiros aéreos, 1949–1960 mensal 144
nottem temperatura em Nottingham, 1920–1939 mensal 240
us_acc_deaths mortes acidentais nos EUA, 1973–1978 mensal 72
sunspots_monthly manchas solares, 1749–1983 mensal 2820
uk_gas consumo de gás no Reino Unido, 1960–1986 trimestral 108
johnson_johnson lucro por ação da Johnson & Johnson, 1960–1980 trimestral 84
ozone ozônio total em Halley Bay (Antártida), 1956–2000 anual 45
nile vazão do rio Nilo, 1871–1970 anual 100
lynx linces capturados no Canadá, 1821–1934 anual 114
lake_huron nível do lago Huron, 1875–1972 anual 98
sunspots manchas solares, 1700–1988 anual 289
m4:D1 M4: troque D1 por Y…, Q…, M…, W…, D… ou H… (100 mil séries) várias —
m3:N1402 M3: 3.003 séries; exige o extra datasets várias —

As sintéticas são geradas na hora. As outras são baixadas na primeira vez e ficam em cache (~/.cache/autohybts/datasets); as reais vêm do Rdatasets.

Nas séries do M4 e do M3 o teste oficial da competição vem no fim; sele-o com test_size:

from autohybts.datasets import load_benchmark

series = load_benchmark("m4", subset="daily", series_id="D1")
exp = AutoHybridExperiment(fh=series.descriptor.horizon, test_size=len(series.test)).fit(
    series.full()
)

Qualquer outra série do Rdatasets entra por load_dataset, dizendo qual coluna é o tempo, qual é o alvo e a frequência (veja a documentação, Datasets). A biblioteca não preenche valores ausentes: trate-os antes do fit.

Documentação e tutoriais

Para configurar a publicação no Read the Docs, veja Publicação no Read the Docs. O projeto em português (/pt-br/latest/) deve usar Language: Portuguese (Brazil) e Build configuration file: documentation/.readthedocs.yaml. O YAML da raiz (.readthedocs.yaml) compila a versão em inglês.

Princípios

  • Validade temporal antes de automação: nenhuma informação posterior à origem de previsão entra como feature, e o teste selado nunca alimenta busca ou seleção.
  • Seleção incremental guardada: um desafiante só substitui o campeão atual se superar critérios pareados de ganho e vitórias; caso contrário, a estrutura anterior (inclusive um modelo individual) é mantida.
  • Rastreabilidade: candidatas, tentativas e decisões têm identidade estável e ficam registradas, inclusive rejeições e falhas.

Limitações atuais

  • Decomposição, combinação fixa e estágios múltiplos só entram na busca quando pedidos em compare_models(include=...); a CV aninhada é só para uma série; a seleção dinâmica (dynamic) só existe na variante B.
  • compare_models com o orçamento padrão (small), o espaço completo e 7 origens por camada leva alguns minutos numa série de ~700 pontos, sobretudo por causa do ARIMA com ordem automática; use budget="smoke", fold=3 ou base_models=[...] para explorar.
  • A regra de aceite (ganho mediano ≥ 5 %, vitórias ≥ 60 %, variabilidade ≥ 0,05, com 7 origens por camada quando a série comporta) foi calibrada em controles sintéticos: aceitou estruturas espúrias em 2–4 % das séries de ruído branco e ganhos reais em 54–56 % das séries com resíduo previsível. Não é controle de erro estatístico; em séries curtas, com menos origens, a taxa de falso aceite é maior (veja o guia de seleção).

Créditos

Inspirada na ergonomia do PyCaret; o PyCaret não é dependência.

Licença

MIT © João Ataíde.

Metadata

Release files for autohybts 1.0.0rc1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for autohybts 1.0.0rc1
File Size Uploaded Provenance
autohybts-1.0.0rc1.tar.gz 311.6 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for autohybts 1.0.0rc1
File Interpreter ABI Platform
autohybts-1.0.0rc1-py3-none-any.whl Python 3 none any Details

Total release size: 549.3 kB

Release files / autohybts-1.0.0rc1.tar.gz

Download URL autohybts-1.0.0rc1.tar.gz
Size 311.6 kB
Tags Source
SHA-256 checksum
How to use checksums
1d8685fd25304f0a433200a3caf3ede79e2c158632012570f6e1df1870365b16
BLAKE2b-256 checksum
How to use checksums
7d47d20cef689932a39703551c2aa695223b4f3ab42ce5b30ff9102570f133dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Release files / autohybts-1.0.0rc1-py3-none-any.whl

Download URL autohybts-1.0.0rc1-py3-none-any.whl
Size 237.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9d198ef2c939748ae8380806eb2e5d769dfcbf72e3091baf79d7bd955f69b39a
BLAKE2b-256 checksum
How to use checksums
7c7d12b37d8c16e51070ab158384b91f32f45859a6b25fb8dd31640089d7e07e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

Security for autohybts 1.0.0rc1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for autohybts-1.0.0rc1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page