Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ __pycache__/
*$py.class


book/**/*.html
**/lightning_logs/**
**/*files/
book/site_libs

# C extensions
*.so
Expand Down
34 changes: 17 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -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.
20 changes: 10 additions & 10 deletions book/_quarto.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
File renamed without changes.
21 changes: 1 addition & 20 deletions notebooks/part1/index.ipynb → notebooks/part1/00_intro.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -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."
]
}
],
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -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)."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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)"
],
Expand Down Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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,
Expand Down