Skip to content

Commit

Permalink
Merge branch 'main' into deprecate-wops
Browse files Browse the repository at this point in the history
  • Loading branch information
jmoralez committed Nov 21, 2024
2 parents 892dfcb + 151f9e8 commit f341661
Show file tree
Hide file tree
Showing 25 changed files with 2,208 additions and 620 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/build-docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Clone docs repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: Nixtla/docs
ref: scripts
path: docs-scripts
- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: "3.10"
- name: Build docs
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@ jobs:
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY_NIXTLA_TMP }}
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Set up environment
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: ${{ matrix.python-version }}

Expand All @@ -47,10 +47,10 @@ jobs:
python-version: ["3.8", "3.9", "3.10", "3.11"]
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Set up environment
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: ${{ matrix.python-version }}

Expand All @@ -68,10 +68,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Set up python
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: "3.10"

Expand All @@ -84,27 +84,27 @@ jobs:
efficiency-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: "3.12"

- name: Install dependencies
run: pip install uv && uv pip install --system . pytest-codspeed pytest-xdist

- name: Run benchmarks
uses: CodSpeedHQ/action@ab07afd34cbbb7a1306e8d14b7cc44e029eee37a # 3.0.0
uses: CodSpeedHQ/action@fa1dcde8d58f2ab0b407a6a24d6cc5a8c1444a8c # 3.1.0
with:
token: ${{ secrets.CODESPEED_TOKEN }}
run: pytest tests/test_pipeline.py --codspeed -n 2

performance-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: "3.10"

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Set up python
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: '3.10'
cache: 'pip'
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ jobs:
id-token: write
steps:
- name: Clone repo
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

- name: Set up python
uses: actions/setup-python@39cd14951b08e74b54015e9e001cdefcf80e669f # 5.1.1
uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # 5.3.0
with:
python-version: '3.10'

Expand All @@ -31,4 +31,4 @@ jobs:
run: python -m build -sw

- name: Publish package to PyPI
uses: pypa/gh-action-pypi-publish@ec4db0b4ddc65acdf4bff5fa45ac92d78b56bdf0 # v1.9.0
uses: pypa/gh-action-pypi-publish@15c56dba361d8335944d31a2ecd17d700fc7bcbc # v1.12.2
2 changes: 1 addition & 1 deletion mlforecast/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
__version__ = "0.13.4"
__version__ = "0.15.0"
__all__ = ['MLForecast']
from mlforecast.forecast import MLForecast
20 changes: 20 additions & 0 deletions mlforecast/_modidx.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Combine.update': ( 'lag_transforms.html#combine.update',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Combine.update_samples': ( 'lag_transforms.html#combine.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExpandingMax': ( 'lag_transforms.html#expandingmax',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExpandingMean': ( 'lag_transforms.html#expandingmean',
Expand All @@ -264,12 +266,16 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExpandingQuantile.__init__': ( 'lag_transforms.html#expandingquantile.__init__',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExpandingQuantile.update_samples': ( 'lag_transforms.html#expandingquantile.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExpandingStd': ( 'lag_transforms.html#expandingstd',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExponentiallyWeightedMean': ( 'lag_transforms.html#exponentiallyweightedmean',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExponentiallyWeightedMean.__init__': ( 'lag_transforms.html#exponentiallyweightedmean.__init__',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.ExponentiallyWeightedMean.update_samples': ( 'lag_transforms.html#exponentiallyweightedmean.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Lag': ('lag_transforms.html#lag', 'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Lag.__eq__': ( 'lag_transforms.html#lag.__eq__',
'mlforecast/lag_transforms.py'),
Expand All @@ -279,6 +285,8 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Lag._set_core_tfm': ( 'lag_transforms.html#lag._set_core_tfm',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Lag.update_samples': ( 'lag_transforms.html#lag.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Offset': ( 'lag_transforms.html#offset',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Offset.__init__': ( 'lag_transforms.html#offset.__init__',
Expand All @@ -287,6 +295,8 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Offset._set_core_tfm': ( 'lag_transforms.html#offset._set_core_tfm',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.Offset.update_samples': ( 'lag_transforms.html#offset.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.RollingMax': ( 'lag_transforms.html#rollingmax',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms.RollingMean': ( 'lag_transforms.html#rollingmean',
Expand Down Expand Up @@ -319,6 +329,8 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform._get_name': ( 'lag_transforms.html#_baselagtransform._get_name',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform._lag': ( 'lag_transforms.html#_baselagtransform._lag',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform._set_core_tfm': ( 'lag_transforms.html#_baselagtransform._set_core_tfm',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform.stack': ( 'lag_transforms.html#_baselagtransform.stack',
Expand All @@ -329,18 +341,26 @@
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform.update': ( 'lag_transforms.html#_baselagtransform.update',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._BaseLagTransform.update_samples': ( 'lag_transforms.html#_baselagtransform.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._ExpandingBase': ( 'lag_transforms.html#_expandingbase',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._ExpandingBase.__init__': ( 'lag_transforms.html#_expandingbase.__init__',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._ExpandingBase.update_samples': ( 'lag_transforms.html#_expandingbase.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._RollingBase': ( 'lag_transforms.html#_rollingbase',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._RollingBase.__init__': ( 'lag_transforms.html#_rollingbase.__init__',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._RollingBase.update_samples': ( 'lag_transforms.html#_rollingbase.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._Seasonal_RollingBase': ( 'lag_transforms.html#_seasonal_rollingbase',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._Seasonal_RollingBase.__init__': ( 'lag_transforms.html#_seasonal_rollingbase.__init__',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._Seasonal_RollingBase.update_samples': ( 'lag_transforms.html#_seasonal_rollingbase.update_samples',
'mlforecast/lag_transforms.py'),
'mlforecast.lag_transforms._pascal2camel': ( 'lag_transforms.html#_pascal2camel',
'mlforecast/lag_transforms.py')},
'mlforecast.lgb_cv': { 'mlforecast.lgb_cv.LightGBMCV': ('lgb_cv.html#lightgbmcv', 'mlforecast/lgb_cv.py'),
Expand Down
28 changes: 25 additions & 3 deletions mlforecast/auto.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,8 @@ def fit(
n_windows: int,
h: int,
num_samples: int,
step_size: Optional[int] = None,
input_size: Optional[int] = None,
refit: Union[bool, int] = False,
loss: Optional[Callable[[DataFrame, DataFrame], float]] = None,
id_col: str = "unique_id",
Expand All @@ -467,6 +469,10 @@ def fit(
Forecast horizon.
num_samples : int
Number of trials to run
step_size : int, optional (default=None)
Step size between each cross validation window. If None it will be equal to `h`.
input_size : int, optional (default=None)
Maximum training samples per serie in each window. If None, will use an expanding window.
refit : bool or int (default=False)
Retrain model for each cross validation window.
If False, the models are trained at the beginning and then used to predict each window.
Expand Down Expand Up @@ -509,7 +515,12 @@ def fit(
if loss is None:

def loss(df, train_df): # noqa: ARG001
return smape(df, models=["model"])["model"].mean()
return smape(
df,
models=["model"],
id_col=id_col,
target_col=target_col,
)["model"].mean()

if study_kwargs is None:
study_kwargs = {}
Expand Down Expand Up @@ -541,6 +552,8 @@ def config_fn(trial: optuna.Trial) -> Dict[str, Any]:
freq=self.freq,
n_windows=n_windows,
h=h,
step_size=step_size,
input_size=input_size,
refit=refit,
id_col=id_col,
time_col=time_col,
Expand All @@ -550,8 +563,14 @@ def config_fn(trial: optuna.Trial) -> Dict[str, Any]:
study.optimize(objective, n_trials=num_samples, **optimize_kwargs)
self.results_[name] = study
best_config = study.best_trial.user_attrs["config"]
best_config["mlf_fit_params"].pop("fitted", None)
best_config["mlf_fit_params"].pop("prediction_intervals", None)
for arg in (
"fitted",
"prediction_intervals",
"id_col",
"time_col",
"target_col",
):
best_config["mlf_fit_params"].pop(arg, None)
best_model = clone(auto_model.model)
best_model.set_params(**best_config["model_params"])
self.models_[name] = MLForecast(
Expand All @@ -563,6 +582,9 @@ def config_fn(trial: optuna.Trial) -> Dict[str, Any]:
df,
fitted=fitted,
prediction_intervals=prediction_intervals,
id_col=id_col,
time_col=time_col,
target_col=target_col,
**best_config["mlf_fit_params"],
)
return self
Expand Down
Loading

0 comments on commit f341661

Please sign in to comment.