From 964c29b8f6cb17f5669c16fac5bd1cb3d9640738 Mon Sep 17 00:00:00 2001 From: felipeangelimvieira Date: Tue, 21 Oct 2025 20:36:46 -0300 Subject: [PATCH 1/3] Reorder files --- .gitignore | 3 ++ README.md | 34 +++++++++---------- book/_quarto.yml | 20 +++++------ .../pt/part1/{index.qmd => 00_intro.qmd} | 21 +----------- .../pt/part1/{naive.qmd => 01_naive.qmd} | 0 ...nd_diff.qmd => 02_components_and_diff.qmd} | 0 .../{ets_and_ar.qmd => 03_ets_and_ar.qmd} | 0 .../part1/{metricas.qmd => 04_metricas.qmd} | 0 ...og_variables.qmd => 01_exog_variables.qmd} | 0 .../part2/{ml_models.qmd => 02_ml_models.qmd} | 0 .../{panel_data.qmd => 03_panel_data.qmd} | 0 ...ng.qmd => 04_hierarchical_forecasting.qmd} | 0 ...deep_learning.qmd => 05_deep_learning.qmd} | 0 13 files changed, 31 insertions(+), 47 deletions(-) rename book/content/pt/part1/{index.qmd => 00_intro.qmd} (71%) rename book/content/pt/part1/{naive.qmd => 01_naive.qmd} (100%) rename book/content/pt/part1/{components_and_diff.qmd => 02_components_and_diff.qmd} (100%) rename book/content/pt/part1/{ets_and_ar.qmd => 03_ets_and_ar.qmd} (100%) rename book/content/pt/part1/{metricas.qmd => 04_metricas.qmd} (100%) rename book/content/pt/part2/{exog_variables.qmd => 01_exog_variables.qmd} (100%) rename book/content/pt/part2/{ml_models.qmd => 02_ml_models.qmd} (100%) rename book/content/pt/part2/{panel_data.qmd => 03_panel_data.qmd} (100%) rename book/content/pt/part2/{hierarchical_forecasting.qmd => 04_hierarchical_forecasting.qmd} (100%) rename book/content/pt/part2/{deep_learning.qmd => 05_deep_learning.qmd} (100%) diff --git a/.gitignore b/.gitignore index 485d8bd..91faed9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,10 @@ __pycache__/ *$py.class +book/**/*.html **/lightning_logs/** +**/*files/ +book/site_libs # C extensions *.so diff --git a/README.md b/README.md index fcf0f58..34dfb05 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,27 @@ -# littlebooktimeseries +# Python Brasil 2025 Workshop -Timeseries in 3 hours +Repositório com notebooks para Python Brasil 2025 -## Environment setup +## Setup -Choose one of the options below to get the workshop notebooks ready. +Escolha seu método preferido para configurar o ambiente de desenvolvimento: ### Poetry -- Install Poetry: `curl -sSL https://install.python-poetry.org | python3 -` -- Install dependencies: `poetry install` -- Start the shell: `poetry shell` -- Launch Jupyter: `jupyter lab` +- Instale o Poetry: `curl -sSL https://install.python-poetry.org | python3 -` +- Instale as dependências: `poetry install` +- Inicie o shell: `poetry shell` +- Inicie o Jupyter: `jupyter lab` ### pip -- Create a virtual environment: `python3 -m venv .venv` -- Activate it: `source .venv/bin/activate` -- Install dependencies: `pip install -r requirements.txt` -- Launch Jupyter: `jupyter lab` +- Crie um ambiente virtual: `python3 -m venv .venv` +- Ative-o: `source .venv/bin/activate` +- Instale as dependências: `pip install -r requirements.txt` +- Inicie o Jupyter: `jupyter lab` ### uv -- Install uv: `pip install uv` -- Sync dependencies: `uv sync` -- Activate the environment: `source .venv/bin/activate` -- Launch Jupyter: `jupyter lab` +- Instale o uv: `pip install uv` +- Sincronize as dependências: `uv sync` +- Ative o ambiente: `source .venv/bin/activate` +- Inicie o Jupyter: `jupyter lab` -> All options require Python 3.11 or 3.12. The notebooks live under `notebooks/`; open them in Jupyter Lab during the session. +> Todas as opções requerem Python 3.11 ou 3.12. Os notebooks estão na pasta `notebooks/`; abra-os no Jupyter Lab durante a sessão. diff --git a/book/_quarto.yml b/book/_quarto.yml index 1bb9eb2..13880d3 100644 --- a/book/_quarto.yml +++ b/book/_quarto.yml @@ -15,18 +15,18 @@ book: - index.qmd - part: "Part I: Básico" chapters: - - content/pt/part1/index.qmd - - content/pt/part1/naive.qmd - - content/pt/part1/components_and_diff.qmd - - content/pt/part1/ets_and_ar.qmd - - content/pt/part1/metricas.qmd + - content/pt/part1/00_intro.qmd + - content/pt/part1/01_naive.qmd + - content/pt/part1/02_components_and_diff.qmd + - content/pt/part1/03_ets_and_ar.qmd + - content/pt/part1/04_metricas.qmd - part: "Part II: Intermediário" chapters: - - content/pt/part2/exog_variables.qmd - - content/pt/part2/ml_models.qmd - - content/pt/part2/panel_data.qmd - - content/pt/part2/hierarchical_forecasting.qmd - - content/pt/part2/deep_learning.qmd + - content/pt/part2/01_exog_variables.qmd + - content/pt/part2/02_ml_models.qmd + - content/pt/part2/03_panel_data.qmd + - content/pt/part2/04_hierarchical_forecasting.qmd + - content/pt/part2/05_deep_learning.qmd - part: "Part III: Apêndices" chapters: - content/pt/extra/sktime_custom.qmd diff --git a/book/content/pt/part1/index.qmd b/book/content/pt/part1/00_intro.qmd similarity index 71% rename from book/content/pt/part1/index.qmd rename to book/content/pt/part1/00_intro.qmd index a08ff34..d819a0c 100644 --- a/book/content/pt/part1/index.qmd +++ b/book/content/pt/part1/00_intro.qmd @@ -30,23 +30,4 @@ Considerando que cada observação é indexada por uma variável temporal, podem * Saúde: número diário de novos casos de uma doença * Clima: temperatura diária, precipitação mensal -Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura. - -O conteúdo está organizado nas seguintes seções: - -1. **Introdução a séries temporais**: - 1. Modelo Naive, Modelo Naive sazonal - 2. Séries integradas, diferenciação e estacionariedade - 3. Modelo de Suavização Exponencial (Exponential Smoothing) - 4. Modelos autoregressivos (AR) - 5. Métricas de avaliação de modelos de séries temporais - 6. Engenharia de features para séries temporais -2. **Modelos avançados e caso de uso** - 1. Forecast com modelos de Machine Learning - 2. Forecast com modelos fundacionais - 3. Previsão de vendas totais agregadas - 4. Previsão de vendas por região e modelos globais - 5. Previsão hierárquica e reconciliação -3. **Customização de modelos com sktime** - 1. Como customizar e criar modelos em sktime - 2. Criando um wrapper de biblioteca externa \ No newline at end of file +Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura. \ No newline at end of file diff --git a/book/content/pt/part1/naive.qmd b/book/content/pt/part1/01_naive.qmd similarity index 100% rename from book/content/pt/part1/naive.qmd rename to book/content/pt/part1/01_naive.qmd diff --git a/book/content/pt/part1/components_and_diff.qmd b/book/content/pt/part1/02_components_and_diff.qmd similarity index 100% rename from book/content/pt/part1/components_and_diff.qmd rename to book/content/pt/part1/02_components_and_diff.qmd diff --git a/book/content/pt/part1/ets_and_ar.qmd b/book/content/pt/part1/03_ets_and_ar.qmd similarity index 100% rename from book/content/pt/part1/ets_and_ar.qmd rename to book/content/pt/part1/03_ets_and_ar.qmd diff --git a/book/content/pt/part1/metricas.qmd b/book/content/pt/part1/04_metricas.qmd similarity index 100% rename from book/content/pt/part1/metricas.qmd rename to book/content/pt/part1/04_metricas.qmd diff --git a/book/content/pt/part2/exog_variables.qmd b/book/content/pt/part2/01_exog_variables.qmd similarity index 100% rename from book/content/pt/part2/exog_variables.qmd rename to book/content/pt/part2/01_exog_variables.qmd diff --git a/book/content/pt/part2/ml_models.qmd b/book/content/pt/part2/02_ml_models.qmd similarity index 100% rename from book/content/pt/part2/ml_models.qmd rename to book/content/pt/part2/02_ml_models.qmd diff --git a/book/content/pt/part2/panel_data.qmd b/book/content/pt/part2/03_panel_data.qmd similarity index 100% rename from book/content/pt/part2/panel_data.qmd rename to book/content/pt/part2/03_panel_data.qmd diff --git a/book/content/pt/part2/hierarchical_forecasting.qmd b/book/content/pt/part2/04_hierarchical_forecasting.qmd similarity index 100% rename from book/content/pt/part2/hierarchical_forecasting.qmd rename to book/content/pt/part2/04_hierarchical_forecasting.qmd diff --git a/book/content/pt/part2/deep_learning.qmd b/book/content/pt/part2/05_deep_learning.qmd similarity index 100% rename from book/content/pt/part2/deep_learning.qmd rename to book/content/pt/part2/05_deep_learning.qmd From b5f39b42ad8d3f8eb9420c0900ffa5f69a8fb58a Mon Sep 17 00:00:00 2001 From: felipeangelimvieira Date: Tue, 21 Oct 2025 20:37:26 -0300 Subject: [PATCH 2/3] Update notebooks --- .../part1/{index.ipynb => 00_intro.ipynb} | 21 +------------------ .../part1/{naive.ipynb => 01_naive.ipynb} | 0 ...iff.ipynb => 02_components_and_diff.ipynb} | 0 .../{ets_and_ar.ipynb => 03_ets_and_ar.ipynb} | 0 .../{metricas.ipynb => 04_metricas.ipynb} | 0 ...ariables.ipynb => 01_exog_variables.ipynb} | 13 +++++++----- .../{ml_models.ipynb => 02_ml_models.ipynb} | 6 +++--- .../{panel_data.ipynb => 03_panel_data.ipynb} | 5 ++--- ...pynb => 04_hierarchical_forecasting.ipynb} | 4 ++-- ..._learning.ipynb => 05_deep_learning.ipynb} | 0 10 files changed, 16 insertions(+), 33 deletions(-) rename notebooks/part1/{index.ipynb => 00_intro.ipynb} (72%) rename notebooks/part1/{naive.ipynb => 01_naive.ipynb} (100%) rename notebooks/part1/{components_and_diff.ipynb => 02_components_and_diff.ipynb} (100%) rename notebooks/part1/{ets_and_ar.ipynb => 03_ets_and_ar.ipynb} (100%) rename notebooks/part1/{metricas.ipynb => 04_metricas.ipynb} (100%) rename notebooks/part2/{exog_variables.ipynb => 01_exog_variables.ipynb} (94%) rename notebooks/part2/{ml_models.ipynb => 02_ml_models.ipynb} (98%) rename notebooks/part2/{panel_data.ipynb => 03_panel_data.ipynb} (99%) rename notebooks/part2/{hierarchical_forecasting.ipynb => 04_hierarchical_forecasting.ipynb} (99%) rename notebooks/part2/{deep_learning.ipynb => 05_deep_learning.ipynb} (100%) diff --git a/notebooks/part1/index.ipynb b/notebooks/part1/00_intro.ipynb similarity index 72% rename from notebooks/part1/index.ipynb rename to notebooks/part1/00_intro.ipynb index fad77f3..32feeee 100644 --- a/notebooks/part1/index.ipynb +++ b/notebooks/part1/00_intro.ipynb @@ -36,26 +36,7 @@ "* Saúde: número diário de novos casos de uma doença\n", "* Clima: temperatura diária, precipitação mensal\n", "\n", - "Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura.\n", - "\n", - "O conteúdo está organizado nas seguintes seções:\n", - "\n", - "1. **Introdução a séries temporais**: \n", - " 1. Modelo Naive, Modelo Naive sazonal\n", - " 2. Séries integradas, diferenciação e estacionariedade\n", - " 3. Modelo de Suavização Exponencial (Exponential Smoothing)\n", - " 4. Modelos autoregressivos (AR)\n", - " 5. Métricas de avaliação de modelos de séries temporais\n", - " 6. Engenharia de features para séries temporais\n", - "2. **Modelos avançados e caso de uso**\n", - " 1. Forecast com modelos de Machine Learning\n", - " 2. Forecast com modelos fundacionais\n", - " 3. Previsão de vendas totais agregadas\n", - " 4. Previsão de vendas por região e modelos globais\n", - " 5. Previsão hierárquica e reconciliação\n", - "3. **Customização de modelos com sktime**\n", - " 1. Como customizar e criar modelos em sktime\n", - " 2. Criando um wrapper de biblioteca externa" + "Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura." ] } ], diff --git a/notebooks/part1/naive.ipynb b/notebooks/part1/01_naive.ipynb similarity index 100% rename from notebooks/part1/naive.ipynb rename to notebooks/part1/01_naive.ipynb diff --git a/notebooks/part1/components_and_diff.ipynb b/notebooks/part1/02_components_and_diff.ipynb similarity index 100% rename from notebooks/part1/components_and_diff.ipynb rename to notebooks/part1/02_components_and_diff.ipynb diff --git a/notebooks/part1/ets_and_ar.ipynb b/notebooks/part1/03_ets_and_ar.ipynb similarity index 100% rename from notebooks/part1/ets_and_ar.ipynb rename to notebooks/part1/03_ets_and_ar.ipynb diff --git a/notebooks/part1/metricas.ipynb b/notebooks/part1/04_metricas.ipynb similarity index 100% rename from notebooks/part1/metricas.ipynb rename to notebooks/part1/04_metricas.ipynb diff --git a/notebooks/part2/exog_variables.ipynb b/notebooks/part2/01_exog_variables.ipynb similarity index 94% rename from notebooks/part2/exog_variables.ipynb rename to notebooks/part2/01_exog_variables.ipynb index b9a41b8..fb34047 100644 --- a/notebooks/part2/exog_variables.ipynb +++ b/notebooks/part2/01_exog_variables.ipynb @@ -274,13 +274,16 @@ "\n", "Para isso, podemos usar o transformador Lag do sktime.\n", "Ao utilizar defasagens (lags), surgem dois desafios principais:\n", - "\t1.\tO aparecimento de valores NaN, que muitos modelos de previsão não conseguem tratar.\n", - "\t2.\tO número de variáveis exógenas pode aumentar significativamente, o que pode levar a overfitting ou, no caso do nosso conjunto de dados, a um número de features maior que o número de amostras — o que pode gerar erros no processo de ajuste (fitting).\n", + "\n", + "1.\tO aparecimento de valores NaN, que muitos modelos de previsão não conseguem tratar.\n", + "\n", + "2.\tO número de variáveis exógenas pode aumentar significativamente, o que pode levar a overfitting ou, no caso do nosso conjunto de dados, a um número de features maior que o número de amostras — o que pode gerar erros no processo de ajuste (fitting).\n", "\n", "Para lidar com isso, no exemplo abaixo utilizamos um TransformerPipeline que realiza as seguintes etapas:\n", - "\t•\tSeleção de variáveis: executa uma seleção das variáveis exógenas, mantendo apenas as mais relevantes.\n", - "\t•\tDefasagem: aplica o transformador Lag para criar versões defasadas das variáveis exógenas.\n", - "\t•\tImputação: usa o transformador Imputer para preencher os valores NaN criados pelo processo de defasagem. Neste caso, é usado o método backfill (preenchimento a partir de valores posteriores)." + "\n", + "* Seleção de variáveis: executa uma seleção das variáveis exógenas, mantendo apenas as mais relevantes.\n", + "* Defasagem: aplica o transformador Lag para criar versões defasadas das variáveis exógenas.\n", + "* Imputação: usa o transformador Imputer para preencher os valores NaN criados pelo processo de defasagem. Neste caso, é usado o método backfill (preenchimento a partir de valores posteriores)." ] }, { diff --git a/notebooks/part2/ml_models.ipynb b/notebooks/part2/02_ml_models.ipynb similarity index 98% rename from notebooks/part2/ml_models.ipynb rename to notebooks/part2/02_ml_models.ipynb index 611f822..2247392 100644 --- a/notebooks/part2/ml_models.ipynb +++ b/notebooks/part2/02_ml_models.ipynb @@ -153,10 +153,10 @@ "metadata": {}, "source": [ "from tsbook.forecasting.reduction import ReductionForecaster\n", - "from sklearn.ensemble import RandomForestRegressor\n", + "from lightgbm import LGBMRegressor\n", "\n", "model = ReductionForecaster(\n", - " RandomForestRegressor(n_estimators=100, random_state=42),\n", + " LGBMRegressor(n_estimators=100, random_state=42),\n", " window_length=30,\n", ")\n", "\n", @@ -194,7 +194,7 @@ "source": [ "from sktime.transformations.series.difference import Differencer\n", "\n", - "regressor = RandomForestRegressor(n_estimators=100, random_state=42)\n", + "regressor = LGBMRegressor(n_estimators=100, random_state=42)\n", "\n", "model = Differencer() * ReductionForecaster(\n", " regressor,\n", diff --git a/notebooks/part2/panel_data.ipynb b/notebooks/part2/03_panel_data.ipynb similarity index 99% rename from notebooks/part2/panel_data.ipynb rename to notebooks/part2/03_panel_data.ipynb index fa3bb05..8f0ec19 100644 --- a/notebooks/part2/panel_data.ipynb +++ b/notebooks/part2/03_panel_data.ipynb @@ -311,7 +311,7 @@ "from lightgbm import LGBMRegressor\n", "\n", "global_forecaster1 = ReductionForecaster(\n", - " LGBMRegressor(n_estimators=100, verbose=-1),\n", + " LGBMRegressor(n_estimators=100, verbose=-1, random_state=42),\n", " window_length=30,\n", ")\n", "\n", @@ -398,7 +398,6 @@ "source": [ "from sktime.transformations.series.difference import Differencer\n", "\n", - "\n", "global_forecaster2 = Differencer() * global_forecaster1\n", "global_forecaster2.fit(y_train, X_train)" ], @@ -458,7 +457,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Note como já superamos o modelo global incial, e o modelo local. Isso é para\n", + "Note como já superamos o modelo global incial. Isso é para\n", "destacar que é **essencial** realizar um bom preprocessamento e engenharia de features para que modelos de Machine Learning tenham bom desempenho em dados em painel.\n", "\n", "### Normalização por janela\n", diff --git a/notebooks/part2/hierarchical_forecasting.ipynb b/notebooks/part2/04_hierarchical_forecasting.ipynb similarity index 99% rename from notebooks/part2/hierarchical_forecasting.ipynb rename to notebooks/part2/04_hierarchical_forecasting.ipynb index 3c87fb4..95e9393 100644 --- a/notebooks/part2/hierarchical_forecasting.ipynb +++ b/notebooks/part2/04_hierarchical_forecasting.ipynb @@ -187,7 +187,7 @@ "from lightgbm import LGBMRegressor\n", "\n", "forecaster = ReductionForecaster(\n", - " LGBMRegressor(n_estimators=50, verbose=-1, objective=\"tweedie\"),\n", + " LGBMRegressor(n_estimators=100, verbose=-1, objective=\"tweedie\", random_state=42),\n", " window_length=30,\n", " normalization_strategy=\"divide_mean\",\n", ")\n", @@ -450,7 +450,7 @@ " \"OptimalReconciler (ols)\": metric(y_test, y_pred_optimal, y_train=y_train),\n", " \"Mint Reconciler\": metric(y_test, y_pred_mint, y_train=y_train),\n", " },\n", - " index=[\"Mean Absolute Scaled Error\"],\n", + " index=[\"Mean Absolute Squared Error\"],\n", ")" ], "execution_count": null, diff --git a/notebooks/part2/deep_learning.ipynb b/notebooks/part2/05_deep_learning.ipynb similarity index 100% rename from notebooks/part2/deep_learning.ipynb rename to notebooks/part2/05_deep_learning.ipynb From 0984f227c7bd76aca6c7e833eb1569649ad9db7a Mon Sep 17 00:00:00 2001 From: felipeangelimvieira Date: Tue, 21 Oct 2025 20:38:34 -0300 Subject: [PATCH 3/3] Remove toc --- book/content/pt/part1/00_intro.qmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/content/pt/part1/00_intro.qmd b/book/content/pt/part1/00_intro.qmd index d819a0c..30f02b1 100644 --- a/book/content/pt/part1/00_intro.qmd +++ b/book/content/pt/part1/00_intro.qmd @@ -30,4 +30,4 @@ Considerando que cada observação é indexada por uma variável temporal, podem * Saúde: número diário de novos casos de uma doença * Clima: temperatura diária, precipitação mensal -Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura. \ No newline at end of file +Esse livro é uma introdução prática a modelos de séries temporais, com objetivo de dar contexto das ferramentas mais relevantes em 3h de leitura.