Forecasting utilities
Project Links
Meta
Author: Nixtla
Requires Python: >=3.9
Classifiers
Development Status
- 3 - Alpha
Intended Audience
- Developers
Natural Language
- English
License
- OSI Approved :: Apache Software License
Programming Language
- Python :: 3.9
- Python :: 3.10
- Python :: 3.11
- Python :: 3.12
- Python :: 3.13
Install
PyPI
pip install utilsforecast
Conda
conda install -c conda-forge utilsforecast
How to use
Generate synthetic data
from utilsforecast.data import generate_series
series = generate_series(3, with_trend=True, static_as_categorical=False)
series
| | unique_id | ds | y |
|-----|-----------|------------|------------|
| 0 | 0 | 2000-01-01 | 0.422133 |
| 1 | 0 | 2000-01-02 | 1.501407 |
| 2 | 0 | 2000-01-03 | 2.568495 |
| 3 | 0 | 2000-01-04 | 3.529085 |
| 4 | 0 | 2000-01-05 | 4.481929 |
| ... | ... | ... | ... |
| 481 | 2 | 2000-06-11 | 163.914625 |
| 482 | 2 | 2000-06-12 | 166.018479 |
| 483 | 2 | 2000-06-13 | 160.839176 |
| 484 | 2 | 2000-06-14 | 162.679603 |
| 485 | 2 | 2000-06-15 | 165.089288 |
Plotting
from utilsforecast.plotting import plot_series
fig = plot_series(series, plot_random=False, max_insample_length=50, engine='matplotlib')
fig.savefig('imgs/index.png', bbox_inches='tight')
Preprocessing
from utilsforecast.preprocessing import fill_gaps
serie = series[series['unique_id'].eq(0)].tail(10)
# drop some points
with_gaps = serie.sample(frac=0.5, random_state=0).sort_values('ds')
with_gaps
Example output with missing dates:
| | unique_id | ds | y |
|-----|-----------|------------|-----------|
| 213 | 0 | 2000-08-01 | 18.543147 |
| 214 | 0 | 2000-08-02 | 19.941764 |
| 216 | 0 | 2000-08-04 | 21.968733 |
| 220 | 0 | 2000-08-08 | 19.091509 |
| 221 | 0 | 2000-08-09 | 20.220739 |
fill_gaps(with_gaps, freq='D')
Returns:
| | unique_id | ds | y |
|-----|-----------|------------|-----------|
| 0 | 0 | 2000-08-01 | 18.543147 |
| 1 | 0 | 2000-08-02 | 19.941764 |
| 2 | 0 | 2000-08-03 | NaN |
| 3 | 0 | 2000-08-04 | 21.968733 |
| 4 | 0 | 2000-08-05 | NaN |
| 5 | 0 | 2000-08-06 | NaN |
| 6 | 0 | 2000-08-07 | NaN |
| 7 | 0 | 2000-08-08 | 19.091509 |
| 8 | 0 | 2000-08-09 | 20.220739 |
Evaluating
from functools import partial
import numpy as np
from utilsforecast.evaluation import evaluate
from utilsforecast.losses import mape, mase
valid = series.groupby('unique_id').tail(7).copy()
train = series.drop(valid.index)
rng = np.random.RandomState(0)
valid['seas_naive'] = train.groupby('unique_id')['y'].tail(7).values
valid['rand_model'] = valid['y'] * rng.rand(valid['y'].shape[0])
daily_mase = partial(mase, seasonality=7)
evaluate(valid, metrics=[mape, daily_mase], train_df=train)
| | unique_id | metric | seas_naive | rand_model |
|-----|-----------|--------|------------|------------|
| 0 | 0 | mape | 0.024139 | 0.440173 |
| 1 | 1 | mape | 0.054259 | 0.278123 |
| 2 | 2 | mape | 0.042642 | 0.480316 |
| 3 | 0 | mase | 0.907149 | 16.418014 |
| 4 | 1 | mase | 0.991635 | 6.404254 |
| 5 | 2 | mase | 1.013596 | 11.365040 |
Oct 06, 2025
0.2.14
Oct 06, 2025
0.2.13.dev0
Feb 24, 2025
0.2.12
Jan 16, 2025
0.2.11
Nov 29, 2024
0.2.10
Nov 22, 2024
0.2.9
Nov 05, 2024
0.2.8
Oct 23, 2024
0.2.7
Oct 22, 2024
0.2.6
Sep 13, 2024
0.2.5
Sep 03, 2024
0.2.4
Aug 05, 2024
0.2.3
Jul 30, 2024
0.2.2
Jul 26, 2024
0.2.1
Jul 17, 2024
0.2.0
Jun 27, 2024
0.1.12
Jun 12, 2024
0.1.11
May 15, 2024
0.1.10
May 08, 2024
0.1.9
May 08, 2024
0.1.8
Apr 22, 2024
0.1.7
Apr 22, 2024
0.1.6
Apr 19, 2024
0.1.5
Apr 16, 2024
0.1.4
Apr 09, 2024
0.1.3
Mar 26, 2024
0.1.2
Mar 06, 2024
0.1.1
Mar 04, 2024
0.1.0
Feb 15, 2024
0.0.27
Jan 24, 2024
0.0.26
Jan 23, 2024
0.0.25
Jan 02, 2024
0.0.24
Dec 18, 2023
0.0.23
Dec 14, 2023
0.0.22
Dec 06, 2023
0.0.21
Dec 05, 2023
0.0.20
Nov 30, 2023
0.0.19
Nov 30, 2023
0.0.18
Nov 23, 2023
0.0.17
Nov 22, 2023
0.0.16
Nov 21, 2023
0.0.15
Nov 10, 2023
0.0.14
Nov 08, 2023
0.0.13
Oct 23, 2023
0.0.12
Oct 23, 2023
0.0.11
Oct 18, 2023
0.0.10
Oct 17, 2023
0.0.9
Oct 16, 2023
0.0.8
Oct 05, 2023
0.0.7
Sep 29, 2023
0.0.6
Sep 14, 2023
0.0.5
Sep 12, 2023
0.0.4
Sep 04, 2023
0.0.3
Aug 29, 2023
0.0.2
Aug 24, 2023
0.0.1