Utilizando a biblioteca DARTS para forecasting

Notebook desenvolvido para o curso Financial Analytics - Insper

Referências: - https://unit8.com/resources/darts-time-series-made-easy-in-python/ - https://levelup.gitconnected.com/a-python-library-that-makes-it-simple-to-forecast-time-series-6a403da71542 - https://pypi.org/project/statsforecast/

1. Imports and data upload

Código
# DARTS now is lightweight install: please see https://github.com/unit8co/darts/blob/master/INSTALL.md#enabling-optional-dependencies
# you have to install manually some dependencies:

!pip install darts # descomentar para instalação inicial
!pip install prophet
!pip install statsforecast
Requirement already satisfied: darts in /usr/local/lib/python3.12/dist-packages (0.38.0)

Requirement already satisfied: holidays>=0.11.1 in /usr/local/lib/python3.12/dist-packages (from darts) (0.82)

Requirement already satisfied: joblib>=0.16.0 in /usr/local/lib/python3.12/dist-packages (from darts) (1.5.2)

Requirement already satisfied: matplotlib>=3.3.0 in /usr/local/lib/python3.12/dist-packages (from darts) (3.10.0)

Requirement already satisfied: narwhals>=1.25.1 in /usr/local/lib/python3.12/dist-packages (from darts) (2.9.0)

Requirement already satisfied: nfoursid>=1.0.0 in /usr/local/lib/python3.12/dist-packages (from darts) (1.0.2)

Requirement already satisfied: numpy>=1.19.0 in /usr/local/lib/python3.12/dist-packages (from darts) (2.0.2)

Requirement already satisfied: pandas>=1.0.5 in /usr/local/lib/python3.12/dist-packages (from darts) (2.2.2)

Requirement already satisfied: pyod>=0.9.5 in /usr/local/lib/python3.12/dist-packages (from darts) (2.0.5)

Requirement already satisfied: requests>=2.22.0 in /usr/local/lib/python3.12/dist-packages (from darts) (2.32.4)

Requirement already satisfied: scikit-learn>=1.6.0 in /usr/local/lib/python3.12/dist-packages (from darts) (1.6.1)

Requirement already satisfied: scipy>=1.3.2 in /usr/local/lib/python3.12/dist-packages (from darts) (1.16.2)

Requirement already satisfied: shap>=0.40.0 in /usr/local/lib/python3.12/dist-packages (from darts) (0.49.1)

Requirement already satisfied: statsmodels>=0.14.0 in /usr/local/lib/python3.12/dist-packages (from darts) (0.14.5)

Requirement already satisfied: tqdm>=4.60.0 in /usr/local/lib/python3.12/dist-packages (from darts) (4.67.1)

Requirement already satisfied: typing-extensions in /usr/local/lib/python3.12/dist-packages (from darts) (4.15.0)

Requirement already satisfied: xarray>=0.17.0 in /usr/local/lib/python3.12/dist-packages (from darts) (2025.10.1)

Requirement already satisfied: pytorch-lightning<2.5.3,>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from darts) (2.5.2)

Requirement already satisfied: tensorboardX>=2.1 in /usr/local/lib/python3.12/dist-packages (from darts) (2.6.4)

Requirement already satisfied: torch>=1.8.0 in /usr/local/lib/python3.12/dist-packages (from darts) (2.8.0+cu126)

Requirement already satisfied: python-dateutil in /usr/local/lib/python3.12/dist-packages (from holidays>=0.11.1->darts) (2.9.0.post0)

Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (1.3.3)

Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (0.12.1)

Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (4.60.1)

Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (1.4.9)

Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (25.0)

Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (11.3.0)

Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=3.3.0->darts) (3.2.5)

Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.0.5->darts) (2025.2)

Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.0.5->darts) (2025.2)

Requirement already satisfied: numba>=0.51 in /usr/local/lib/python3.12/dist-packages (from pyod>=0.9.5->darts) (0.60.0)

Requirement already satisfied: PyYAML>=5.4 in /usr/local/lib/python3.12/dist-packages (from pytorch-lightning<2.5.3,>=2.0.0->darts) (6.0.3)

Requirement already satisfied: fsspec>=2022.5.0 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (2025.3.0)

Requirement already satisfied: torchmetrics>=0.7.0 in /usr/local/lib/python3.12/dist-packages (from pytorch-lightning<2.5.3,>=2.0.0->darts) (1.8.2)

Requirement already satisfied: lightning-utilities>=0.10.0 in /usr/local/lib/python3.12/dist-packages (from pytorch-lightning<2.5.3,>=2.0.0->darts) (0.15.2)

Requirement already satisfied: charset_normalizer<4,>=2 in /usr/local/lib/python3.12/dist-packages (from requests>=2.22.0->darts) (3.4.4)

Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.12/dist-packages (from requests>=2.22.0->darts) (3.11)

Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.12/dist-packages (from requests>=2.22.0->darts) (2.5.0)

Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.12/dist-packages (from requests>=2.22.0->darts) (2025.10.5)

Requirement already satisfied: threadpoolctl>=3.1.0 in /usr/local/lib/python3.12/dist-packages (from scikit-learn>=1.6.0->darts) (3.6.0)

Requirement already satisfied: slicer==0.0.8 in /usr/local/lib/python3.12/dist-packages (from shap>=0.40.0->darts) (0.0.8)

Requirement already satisfied: cloudpickle in /usr/local/lib/python3.12/dist-packages (from shap>=0.40.0->darts) (3.1.1)

Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.12/dist-packages (from statsmodels>=0.14.0->darts) (1.0.2)

Requirement already satisfied: protobuf>=3.20 in /usr/local/lib/python3.12/dist-packages (from tensorboardX>=2.1->darts) (5.29.5)

Requirement already satisfied: filelock in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (3.20.0)

Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (75.2.0)

Requirement already satisfied: sympy>=1.13.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (1.13.3)

Requirement already satisfied: networkx in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (3.5)

Requirement already satisfied: jinja2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (3.1.6)

Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.77)

Requirement already satisfied: nvidia-cuda-runtime-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.77)

Requirement already satisfied: nvidia-cuda-cupti-cu12==12.6.80 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.80)

Requirement already satisfied: nvidia-cudnn-cu12==9.10.2.21 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (9.10.2.21)

Requirement already satisfied: nvidia-cublas-cu12==12.6.4.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.4.1)

Requirement already satisfied: nvidia-cufft-cu12==11.3.0.4 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (11.3.0.4)

Requirement already satisfied: nvidia-curand-cu12==10.3.7.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (10.3.7.77)

Requirement already satisfied: nvidia-cusolver-cu12==11.7.1.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (11.7.1.2)

Requirement already satisfied: nvidia-cusparse-cu12==12.5.4.2 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.5.4.2)

Requirement already satisfied: nvidia-cusparselt-cu12==0.7.1 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (0.7.1)

Requirement already satisfied: nvidia-nccl-cu12==2.27.3 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (2.27.3)

Requirement already satisfied: nvidia-nvtx-cu12==12.6.77 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.77)

Requirement already satisfied: nvidia-nvjitlink-cu12==12.6.85 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (12.6.85)

Requirement already satisfied: nvidia-cufile-cu12==1.11.1.6 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (1.11.1.6)

Requirement already satisfied: triton==3.4.0 in /usr/local/lib/python3.12/dist-packages (from torch>=1.8.0->darts) (3.4.0)

Requirement already satisfied: aiohttp!=4.0.0a0,!=4.0.0a1 in /usr/local/lib/python3.12/dist-packages (from fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (3.13.1)

Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.12/dist-packages (from numba>=0.51->pyod>=0.9.5->darts) (0.43.0)

Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil->holidays>=0.11.1->darts) (1.17.0)

Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.12/dist-packages (from sympy>=1.13.3->torch>=1.8.0->darts) (1.3.0)

Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.12/dist-packages (from jinja2->torch>=1.8.0->darts) (3.0.3)

Requirement already satisfied: aiohappyeyeballs>=2.5.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (2.6.1)

Requirement already satisfied: aiosignal>=1.4.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (1.4.0)

Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (25.4.0)

Requirement already satisfied: frozenlist>=1.1.1 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (1.8.0)

Requirement already satisfied: multidict<7.0,>=4.5 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (6.7.0)

Requirement already satisfied: propcache>=0.2.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (0.4.1)

Requirement already satisfied: yarl<2.0,>=1.17.0 in /usr/local/lib/python3.12/dist-packages (from aiohttp!=4.0.0a0,!=4.0.0a1->fsspec[http]>=2022.5.0->pytorch-lightning<2.5.3,>=2.0.0->darts) (1.22.0)

Requirement already satisfied: prophet in /usr/local/lib/python3.12/dist-packages (1.1.7)

Requirement already satisfied: cmdstanpy>=1.0.4 in /usr/local/lib/python3.12/dist-packages (from prophet) (1.2.5)

Requirement already satisfied: numpy>=1.15.4 in /usr/local/lib/python3.12/dist-packages (from prophet) (2.0.2)

Requirement already satisfied: matplotlib>=2.0.0 in /usr/local/lib/python3.12/dist-packages (from prophet) (3.10.0)

Requirement already satisfied: pandas>=1.0.4 in /usr/local/lib/python3.12/dist-packages (from prophet) (2.2.2)

Requirement already satisfied: holidays<1,>=0.25 in /usr/local/lib/python3.12/dist-packages (from prophet) (0.82)

Requirement already satisfied: tqdm>=4.36.1 in /usr/local/lib/python3.12/dist-packages (from prophet) (4.67.1)

Requirement already satisfied: importlib_resources in /usr/local/lib/python3.12/dist-packages (from prophet) (6.5.2)

Requirement already satisfied: stanio<2.0.0,>=0.4.0 in /usr/local/lib/python3.12/dist-packages (from cmdstanpy>=1.0.4->prophet) (0.5.1)

Requirement already satisfied: python-dateutil in /usr/local/lib/python3.12/dist-packages (from holidays<1,>=0.25->prophet) (2.9.0.post0)

Requirement already satisfied: contourpy>=1.0.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (1.3.3)

Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (0.12.1)

Requirement already satisfied: fonttools>=4.22.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (4.60.1)

Requirement already satisfied: kiwisolver>=1.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (1.4.9)

Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (25.0)

Requirement already satisfied: pillow>=8 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (11.3.0)

Requirement already satisfied: pyparsing>=2.3.1 in /usr/local/lib/python3.12/dist-packages (from matplotlib>=2.0.0->prophet) (3.2.5)

Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.0.4->prophet) (2025.2)

Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.0.4->prophet) (2025.2)

Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil->holidays<1,>=0.25->prophet) (1.17.0)

Collecting statsforecast

  Downloading statsforecast-2.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (29 kB)

Requirement already satisfied: cloudpickle in /usr/local/lib/python3.12/dist-packages (from statsforecast) (3.1.1)

Collecting coreforecast>=0.0.12 (from statsforecast)

  Downloading coreforecast-0.0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.7 kB)

Requirement already satisfied: numba>=0.55.0 in /usr/local/lib/python3.12/dist-packages (from statsforecast) (0.60.0)

Requirement already satisfied: numpy>=1.21.6 in /usr/local/lib/python3.12/dist-packages (from statsforecast) (2.0.2)

Requirement already satisfied: pandas>=1.3.5 in /usr/local/lib/python3.12/dist-packages (from statsforecast) (2.2.2)

Collecting scipy<1.16.0,>=1.7.3 (from statsforecast)

  Downloading scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (61 kB)

     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.0/62.0 kB 5.1 MB/s eta 0:00:00

Requirement already satisfied: statsmodels>=0.13.2 in /usr/local/lib/python3.12/dist-packages (from statsforecast) (0.14.5)

Requirement already satisfied: tqdm in /usr/local/lib/python3.12/dist-packages (from statsforecast) (4.67.1)

Collecting fugue>=0.8.1 (from statsforecast)

  Downloading fugue-0.9.1-py3-none-any.whl.metadata (18 kB)

Collecting utilsforecast>=0.1.4 (from statsforecast)

  Downloading utilsforecast-0.2.14-py3-none-any.whl.metadata (5.5 kB)

Requirement already satisfied: threadpoolctl>=3 in /usr/local/lib/python3.12/dist-packages (from statsforecast) (3.6.0)

Collecting triad>=0.9.7 (from fugue>=0.8.1->statsforecast)

  Downloading triad-0.9.8-py3-none-any.whl.metadata (6.3 kB)

Collecting adagio>=0.2.4 (from fugue>=0.8.1->statsforecast)

  Downloading adagio-0.2.6-py3-none-any.whl.metadata (1.8 kB)

Requirement already satisfied: llvmlite<0.44,>=0.43.0dev0 in /usr/local/lib/python3.12/dist-packages (from numba>=0.55.0->statsforecast) (0.43.0)

Requirement already satisfied: python-dateutil>=2.8.2 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.3.5->statsforecast) (2.9.0.post0)

Requirement already satisfied: pytz>=2020.1 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.3.5->statsforecast) (2025.2)

Requirement already satisfied: tzdata>=2022.7 in /usr/local/lib/python3.12/dist-packages (from pandas>=1.3.5->statsforecast) (2025.2)

Requirement already satisfied: patsy>=0.5.6 in /usr/local/lib/python3.12/dist-packages (from statsmodels>=0.13.2->statsforecast) (1.0.2)

Requirement already satisfied: packaging>=21.3 in /usr/local/lib/python3.12/dist-packages (from statsmodels>=0.13.2->statsforecast) (25.0)

Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.12/dist-packages (from python-dateutil>=2.8.2->pandas>=1.3.5->statsforecast) (1.17.0)

Requirement already satisfied: pyarrow>=6.0.1 in /usr/local/lib/python3.12/dist-packages (from triad>=0.9.7->fugue>=0.8.1->statsforecast) (18.1.0)

Requirement already satisfied: fsspec>=2022.5.0 in /usr/local/lib/python3.12/dist-packages (from triad>=0.9.7->fugue>=0.8.1->statsforecast) (2025.3.0)

Collecting fs (from triad>=0.9.7->fugue>=0.8.1->statsforecast)

  Downloading fs-2.4.16-py2.py3-none-any.whl.metadata (6.3 kB)

Collecting appdirs~=1.4.3 (from fs->triad>=0.9.7->fugue>=0.8.1->statsforecast)

  Downloading appdirs-1.4.4-py2.py3-none-any.whl.metadata (9.0 kB)

Requirement already satisfied: setuptools in /usr/local/lib/python3.12/dist-packages (from fs->triad>=0.9.7->fugue>=0.8.1->statsforecast) (75.2.0)

Downloading statsforecast-2.0.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (344 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 344.8/344.8 kB 17.3 MB/s eta 0:00:00

Downloading coreforecast-0.0.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (287 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 287.4/287.4 kB 24.5 MB/s eta 0:00:00

Downloading fugue-0.9.1-py3-none-any.whl (278 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 278.2/278.2 kB 22.7 MB/s eta 0:00:00

Downloading scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (37.3 MB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 37.3/37.3 MB 23.4 MB/s eta 0:00:00

Downloading utilsforecast-0.2.14-py3-none-any.whl (41 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 41.0/41.0 kB 2.5 MB/s eta 0:00:00

Downloading adagio-0.2.6-py3-none-any.whl (19 kB)

Downloading triad-0.9.8-py3-none-any.whl (62 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 62.3/62.3 kB 5.4 MB/s eta 0:00:00

Downloading fs-2.4.16-py2.py3-none-any.whl (135 kB)

   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 135.3/135.3 kB 12.1 MB/s eta 0:00:00

Downloading appdirs-1.4.4-py2.py3-none-any.whl (9.6 kB)

Installing collected packages: appdirs, scipy, fs, coreforecast, utilsforecast, triad, adagio, fugue, statsforecast

  Attempting uninstall: scipy

    Found existing installation: scipy 1.16.2

    Uninstalling scipy-1.16.2:

      Successfully uninstalled scipy-1.16.2

Successfully installed adagio-0.2.6 appdirs-1.4.4 coreforecast-0.0.16 fs-2.4.16 fugue-0.9.1 scipy-1.15.3 statsforecast-2.0.2 triad-0.9.8 utilsforecast-0.2.14
Unable to display output for mime type(s): application/vnd.colab-display-data+json
Código
from darts.models import (
    NaiveSeasonal,
    NaiveDrift,
    Prophet,
    ExponentialSmoothing,
    ARIMA,
    AutoARIMA,
    TBATS
)

from darts import TimeSeries
from darts.metrics import mape, mase, mae, mse, ope, r2_score, rmse, rmsle
from statsmodels.tsa.stattools import adfuller

import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Código
# importing data
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
df = pd.read_csv(url, parse_dates = ['Month'],index_col = ['Month'])
series = TimeSeries.from_dataframe(df)
Código
df
Passengers
Month
1949-01-01 112
1949-02-01 118
1949-03-01 132
1949-04-01 129
1949-05-01 121
... ...
1960-08-01 606
1960-09-01 508
1960-10-01 461
1960-11-01 390
1960-12-01 432

144 rows × 1 columns

Código
# split train and test using DARTS split features
train, val = series.split_before(pd.Timestamp('19600101'))
Código
train
<TimeSeries (Month: 132, component: 1, sample: 1)> Size: 1kB
array([[[112.]],

       [[118.]],

       [[132.]],

       [[129.]],

       [[121.]],

       [[135.]],

       [[148.]],

       [[148.]],

       [[136.]],

       [[119.]],

...

       [[406.]],

       [[396.]],

       [[420.]],

       [[472.]],

       [[548.]],

       [[559.]],

       [[463.]],

       [[407.]],

       [[362.]],

       [[405.]]])
Coordinates:
  * Month      (Month) datetime64[ns] 1kB 1949-01-01 1949-02-01 ... 1959-12-01
  * component  (component) object 8B 'Passengers'
Dimensions without coordinates: sample
Attributes:
    static_covariates:  None
    hierarchy:          None
    metadata:           None

2. Quick example on how to use DARTS

Código
# training a Exponential Smoothing model and plotting prediction
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val))

series.plot(label='actual')
prediction.plot(label='forecast', lw=3)
plt.legend();

Código
series
<TimeSeries (Month: 144, component: 1, sample: 1)> Size: 1kB
array([[[112.]],

       [[118.]],

       [[132.]],

       [[129.]],

       [[121.]],

       [[135.]],

       [[148.]],

       [[148.]],

       [[136.]],

       [[119.]],

...

       [[419.]],

       [[461.]],

       [[472.]],

       [[535.]],

       [[622.]],

       [[606.]],

       [[508.]],

       [[461.]],

       [[390.]],

       [[432.]]])
Coordinates:
  * Month      (Month) datetime64[ns] 1kB 1949-01-01 1949-02-01 ... 1960-12-01
  * component  (component) object 8B 'Passengers'
Dimensions without coordinates: sample
Attributes:
    static_covariates:  None
    hierarchy:          None
    metadata:           None

3. Testing for stationarity

Código
# get order of first differencing: the higher of KPSS and ADF test results
result = adfuller(series.to_dataframe())
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
if result[1] <= 0.05:
    print("Reject the null hypothesis: The series is stationary")
else:
    print("Fail to reject the null hypothesis: The series is non-stationary")
ADF Statistic: 0.815369
p-value: 0.991880
Critical Values:
    1%: -3.482
    5%: -2.884
    10%: -2.579
Fail to reject the null hypothesis: The series is non-stationary

4. Algorithms setup: setting the algorithm’s hyparameters

Código
# exponential smoothing
m_expon = ExponentialSmoothing()

# prepare Prophet forecaster: multiplicative seas
m_prophet_m = Prophet(seasonality_mode="multiplicative")

# prepare Prophet forecaster: additive seas
m_prophet_a = Prophet(seasonality_mode="additive")

# prepare autoARIMA from StatsForecast
m_autoarima_stats = AutoARIMA(season_length=12)
Código
# list of models to be evaluated

models = [
    m_expon,
    m_prophet_m,
    m_prophet_a,
    m_autoarima_stats]

5. Creating an evaluating function to run many models

Código
## fit the chosen forecaster model and compute predictions

def eval_model(model, train, val):
    t_start =  time.perf_counter()
    print("beginning: " + str(model))


    # fit the model and compute predictions
    res = model.fit(train)
    forecast = model.predict(len(val))

    # compute accuracy metrics and processing time
    res_mape = mape(val, forecast)
    res_mae = mae(val, forecast)
    res_r2 = r2_score(val, forecast)
    res_rmse = rmse(val, forecast)
    res_rmsle = rmsle(val, forecast)
    res_time = time.perf_counter() - t_start
    res_accuracy = {"MAPE":res_mape, "MAE":res_mae, "R squared":-res_r2, "RMSE":res_rmse, "RMSLE":res_rmsle, "time":res_time}

    results = [forecast, res_accuracy, res]
    print("completed: " + str(model) + ":" + str(res_time) + "sec")
    return results
Código
eval_model(m_prophet_m, train, val)[1]
beginning: Prophet(seasonality_mode=multiplicative)
completed: Prophet(seasonality_mode=multiplicative):0.27867658200011647sec
{'MAPE': np.float64(4.443829749162533),
 'MAE': np.float64(21.908813279003937),
 'R squared': np.float64(-0.8794305116779759),
 'RMSE': np.float64(25.84359362409569),
 'RMSLE': np.float64(0.05137792905621055),
 'time': 0.27867658200011647}
Código
eval_model(m_autoarima_stats, train, val)[1]
beginning: AutoARIMA(season_length=12)
completed: AutoARIMA(season_length=12):0.7895365719998608sec
{'MAPE': np.float64(4.1796926177437514),
 'MAE': np.float64(18.515823497791207),
 'R squared': np.float64(-0.8967154852992124),
 'RMSE': np.float64(23.919483693648484),
 'RMSLE': np.float64(0.05350335125515268),
 'time': 0.7895365719998608}

Running all the models

Código
# call the forecasters one after the other
model_predictions = [eval_model(model, train, val) for model in models]
beginning: ExponentialSmoothing()
completed: ExponentialSmoothing():0.12557467699980407sec
beginning: Prophet(seasonality_mode=multiplicative)
completed: Prophet(seasonality_mode=multiplicative):0.13173181999991357sec
beginning: Prophet(seasonality_mode=additive)
completed: Prophet(seasonality_mode=additive):0.09849881199988886sec
beginning: AutoARIMA(season_length=12)
completed: AutoARIMA(season_length=12):0.37064578100012113sec
Código
# RUN the forecasters and tabulate their prediction accuracy and processing time

df_acc = pd.DataFrame.from_dict(model_predictions[0][1], orient="index")
df_acc.columns = [str(models[0])]

for i, m in enumerate(models):
    if i > 0:
        df = pd.DataFrame.from_dict(model_predictions[i][1], orient="index")
        df.columns = [str(m)]
        df_acc = pd.concat([df_acc, df], axis=1)
    i +=1

pd.set_option("display.precision",3)
df_acc.style.highlight_min(color="lightgreen", axis=1).highlight_max(color="yellow", axis=1)
  ExponentialSmoothing() Prophet(seasonality_mode=multiplicative) Prophet(seasonality_mode=additive) AutoARIMA(season_length=12)
MAPE 2.803136 4.443830 6.614227 4.179693
MAE 13.382162 21.908813 33.434485 18.515823
R squared -0.947945 -0.879431 -0.665160 -0.896715
RMSE 16.981068 25.843594 43.067799 23.919484
RMSLE 0.035501 0.051378 0.081915 0.053503
time 0.125575 0.131732 0.098499 0.370646

6. Cross validation using DARTS

Código
import logging

logging.getLogger("prophet").setLevel(logging.WARNING)
logging.getLogger("cmdstanpy").disabled=True
Código
models_backtest = [m_expon, m_prophet_m, m_autoarima_stats]
backtests = [model.historical_forecasts(series, start=.5, forecast_horizon=12) for model in models_backtest]

plt.figure(figsize=(10, 6))
series.plot(label='data')
for i, m in enumerate(models_backtest):
    err = mape(backtests[i], series)
    backtests[i].plot(lw=3, label='{}, MAPE={:.2f}%'.format(m, err))

plt.title('Backtests with 12-months forecast horizon')
plt.legend()

De volta ao topo