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 72% rename from book/content/pt/part1/index.qmd rename to book/content/pt/part1/00_intro.qmd index a08ff34..30f02b1 100644 --- a/book/content/pt/part1/index.qmd +++ b/book/content/pt/part1/00_intro.qmd @@ -31,22 +31,3 @@ Considerando que cada observação é indexada por uma variável temporal, podem * 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 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 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