From f50e2d153a95d3d471f526198a11bee7329657f9 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Tue, 10 Oct 2023 21:52:58 -0700 Subject: [PATCH 01/22] Revert "undo all mintlify assets" This reverts commit e272e576e8bcd2fa2c66476fd9324f18ffcc9a24. --- .github/workflows/build-docs.yaml | 41 ++ README.md | 334 +++++++------- action_files/final-formatting.bash | 11 + nbs/_extensions/mintlify/_extension.yml | 30 ++ nbs/_extensions/mintlify/mintlify.lua | 71 +++ .../mintlify/mintlify_renderers.lua | 3 + nbs/_extensions/mintlify/mintlify_utils.lua | 47 ++ nbs/_extensions/mintlify/mintlify_writer.lua | 133 ++++++ nbs/_quarto.yml | 59 +-- nbs/custom.yml | 22 - nbs/favicon.png | Bin 0 -> 208747 bytes nbs/favicon.svg | 5 + nbs/favicon_png.png | Bin 0 -> 177981 bytes nbs/mint.json | 122 +++++ nbs/styles.css | 431 ------------------ preview-mintlify-docs.bash | 27 ++ settings.ini | 5 +- 17 files changed, 673 insertions(+), 668 deletions(-) create mode 100644 .github/workflows/build-docs.yaml create mode 100755 action_files/final-formatting.bash create mode 100644 nbs/_extensions/mintlify/_extension.yml create mode 100644 nbs/_extensions/mintlify/mintlify.lua create mode 100644 nbs/_extensions/mintlify/mintlify_renderers.lua create mode 100644 nbs/_extensions/mintlify/mintlify_utils.lua create mode 100644 nbs/_extensions/mintlify/mintlify_writer.lua delete mode 100644 nbs/custom.yml create mode 100644 nbs/favicon.png create mode 100644 nbs/favicon.svg create mode 100644 nbs/favicon_png.png create mode 100644 nbs/mint.json delete mode 100644 nbs/styles.css create mode 100644 preview-mintlify-docs.bash diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml new file mode 100644 index 000000000..d50ea4104 --- /dev/null +++ b/.github/workflows/build-docs.yaml @@ -0,0 +1,41 @@ +name: "build-docs" +on: + push: + branches: ["main"] + workflow_dispatch: +jobs: + build-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + cache: "pip" + cache-dependency-path: settings.ini + - name: Install Dependencies + shell: bash + run: | + set -ux + python -m pip install --upgrade pip + pip install -Uq nbdev + test -f setup.py && pip install -e ".[dev]" + nbdev_docs + - name: Apply final formats + shell: bash + run: bash ./action_files/final-formatting.bash + - name: Copy over necessary assets + run: | + cp nbs/mint.json _docs/mint.json + cp nbs/imgs/logo/dark.png _docs/dark.png + cp nbs/imgs/logo/light.png _docs/light.png + cp nbs/favicon.svg _docs/favicon.svg + - name: Deploy to Mintlify Docs + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_branch: docs + publish_dir: ./_docs + # The following lines assign commit authorship to the official GH-Actions bot for deploys to `docs` branch. + # You can swap them out with your own user credentials. + user_name: github-actions[bot] + user_email: 41898282+github-actions[bot]@users.noreply.github.com diff --git a/README.md b/README.md index 96a610ead..72627afbe 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,46 @@ -# StatsForecast ⚡️ - - +# Nixtla   [![Tweet](https://img.shields.io/twitter/url/http/shields.io.svg?style=social)](https://twitter.com/intent/tweet?text=Statistical%20Forecasting%20Algorithms%20by%20Nixtla%20&url=https://github.com/Nixtla/statsforecast&via=nixtlainc&hashtags=StatisticalModels,TimeSeries,Forecasting)  [![Slack](https://img.shields.io/badge/Slack-4A154B?&logo=slack&logoColor=white)](https://join.slack.com/t/nixtlacommunity/shared_invite/zt-1pmhan9j5-F54XR20edHk0UtYAPcW4KQ) + +[![All Contributors](https://img.shields.io/badge/all_contributors-32-orange.svg?style=flat-square)](#contributors-) + + +
+ +

Statistical ⚡️ Forecast

+

Lightning fast forecasting with statistical and econometric models

+ +[![CI](https://github.com/Nixtla/statsforecast/actions/workflows/ci.yaml/badge.svg?branch=main)](https://github.com/Nixtla/statsforecast/actions/workflows/ci.yaml) +[![Python](https://img.shields.io/pypi/pyversions/statsforecast)](https://pypi.org/project/statsforecast/) +[![PyPi](https://img.shields.io/pypi/v/statsforecast?color=blue)](https://pypi.org/project/statsforecast/) +[![conda-nixtla](https://img.shields.io/conda/vn/conda-forge/statsforecast?color=seagreen&label=conda)](https://anaconda.org/conda-forge/statsforecast) +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/Nixtla/statsforecast/blob/main/LICENSE) +[![docs](https://img.shields.io/website-up-down-green-red/http/nixtla.github.io/statsforecast.svg?label=docs)](https://nixtla.github.io/statsforecast/) +[![Downloads](https://pepy.tech/badge/statsforecast)](https://pepy.tech/project/statsforecast) + +**StatsForecast** offers a collection of widely used univariate time series forecasting models, including automatic `ARIMA`, `ETS`, `CES`, and `Theta` modeling optimized for high performance using `numba`. It also includes a large battery of benchmarking models. +
## Installation -You can install -[`StatsForecast`](https://Nixtla.github.io/statsforecast/src/core/core.html#statsforecast) -with: +You can install `StatsForecast` with: -``` python +```python pip install statsforecast ``` -or +or -``` python +```python conda install -c conda-forge statsforecast -``` +``` -Vist our [Installation -Guide](./docs/getting-started/0_Installation.ipynb) for further -instructions. + +Vist our [Installation Guide](https://nixtla.github.io/statsforecast/docs/getting-started/installation.html) for further instructions. ## Quick Start **Minimal Example** -``` python +```python from statsforecast import StatsForecast from statsforecast.models import AutoARIMA @@ -39,201 +53,144 @@ sf.fit(df) sf.predict(h=12, level=[95]) ``` -**Get Started with this [quick -guide](../nbs/docs/getting-started/1_Getting_Started_short.ipynb).** +**Get Started with this [quick guide](https://nixtla.github.io/statsforecast/docs/getting-started/getting_started_short.html).** -**Follow this [end-to-end -walkthrough](../nbs/docs/getting-started/2_Getting_Started_complete.ipynb) -for best practices.** +**Follow this [end-to-end walkthrough](https://nixtla.github.io/statsforecast/docs/getting-started/getting_started_complete.html) for best practices.** -## Why? +## Why? -Current Python alternatives for statistical models are slow, inaccurate -and don’t scale well. So we created a library that can be used to -forecast in production environments or as benchmarks. -[`StatsForecast`](https://Nixtla.github.io/statsforecast/src/core/core.html#statsforecast) -includes an extensive battery of models that can efficiently fit -millions of time series. +Current Python alternatives for statistical models are slow, inaccurate and don't scale well. So we created a library that can be used to forecast in production environments or as benchmarks. `StatsForecast` includes an extensive battery of models that can efficiently fit millions of time series. ## Features -- Fastest and most accurate implementations of - [`AutoARIMA`](https://Nixtla.github.io/statsforecast/src/core/models.html#autoarima), - [`AutoETS`](https://Nixtla.github.io/statsforecast/src/core/models.html#autoets), - [`AutoCES`](https://Nixtla.github.io/statsforecast/src/core/models.html#autoces), - [`MSTL`](https://Nixtla.github.io/statsforecast/src/core/models.html#mstl) - and - [`Theta`](https://Nixtla.github.io/statsforecast/src/core/models.html#theta) - in Python. -- Out-of-the-box compatibility with Spark, Dask, and Ray. -- Probabilistic Forecasting and Confidence Intervals. -- Support for exogenous Variables and static covariates. -- Anomaly Detection. -- Familiar sklearn syntax: `.fit` and `.predict`. +* Fastest and most accurate implementations of `AutoARIMA`, `AutoETS`, `AutoCES`, `MSTL` and `Theta` in Python. +* Out-of-the-box compatibility with Spark, Dask, and Ray. +* Probabilistic Forecasting and Confidence Intervals. +* Support for exogenous Variables and static covariates. +* Anomaly Detection. +* Familiar sklearn syntax: `.fit` and `.predict`. ## Highlights -- Inclusion of `exogenous variables` and `prediction intervals` for - ARIMA. -- 20x - [faster](https://github.com/Nixtla/statsforecast/tree/main/experiments/arima) - than `pmdarima`. -- 1.5x faster than `R`. -- 500x faster than `Prophet`. -- 4x - [faster](https://github.com/Nixtla/statsforecast/tree/main/experiments/ets) - than `statsmodels`. -- Compiled to high performance machine code through - [`numba`](https://numba.pydata.org/). -- 1,000,000 series in [30 - min](https://github.com/Nixtla/statsforecast/tree/main/experiments/ray) - with [ray](https://github.com/ray-project/ray). -- Replace FB-Prophet in two lines of code and gain speed and accuracy. - Check the experiments - [here](https://github.com/Nixtla/statsforecast/tree/main/experiments/arima_prophet_adapter). -- Fit 10 benchmark models on **1,000,000** series in [under **5 - min**](https://github.com/Nixtla/statsforecast/tree/main/experiments/benchmarks_at_scale). - -Missing something? Please open an issue or write us in -[![Slack](https://img.shields.io/badge/Slack-4A154B?&logo=slack&logoColor=white.png)](https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A) +* Inclusion of `exogenous variables` and `prediction intervals` for ARIMA. +* 20x [faster](./experiments/arima/) than `pmdarima`. +* 1.5x faster than `R`. +* 500x faster than `Prophet`. +* 4x [faster](./experiments/ets/) than `statsmodels`. +* Compiled to high performance machine code through [`numba`](https://numba.pydata.org/). +* 1,000,000 series in [30 min](https://github.com/Nixtla/statsforecast/tree/main/experiments/ray) with [ray](https://github.com/ray-project/ray). +* Replace FB-Prophet in two lines of code and gain speed and accuracy. Check the experiments [here](https://github.com/Nixtla/statsforecast/tree/main/experiments/arima_prophet_adapter). +* Fit 10 benchmark models on **1,000,000** series in [under **5 min**](./experiments/benchmarks_at_scale/). + + +Missing something? Please open an issue or write us in [![Slack](https://img.shields.io/badge/Slack-4A154B?&logo=slack&logoColor=white)](https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A) ## Examples and Guides -📚 [End to End -Walkthrough](https://nixtla.github.io/statsforecast/docs/getting-started/getting_started_complete.html): -Model training, evaluation and selection for multiple time series +📚 [End to End Walkthrough](https://nixtla.github.io/statsforecast/docs/getting-started/getting_started_complete.html): Model training, evaluation and selection for multiple time series + +🔎 [Anomaly Detection](https://nixtla.github.io/statsforecast/docs/tutorials/anomalydetection.html): detect anomalies for time series using in-sample prediction intervals. -🔎 [Anomaly -Detection](https://nixtla.github.io/statsforecast/docs/tutorials/anomalydetection.html): -detect anomalies for time series using in-sample prediction intervals. +👩‍🔬 [Cross Validation](https://nixtla.github.io/statsforecast/docs/tutorials/crossvalidation.html): robust model’s performance evaluation. -👩‍🔬 [Cross -Validation](https://nixtla.github.io/statsforecast/docs/tutorials/crossvalidation.html): -robust model’s performance evaluation. +❄️ [Multiple Seasonalities](https://nixtla.github.io/statsforecast/docs/tutorials/multipleseasonalities.html): how to forecast data with multiple seasonalities using an MSTL. -❄️ [Multiple -Seasonalities](https://nixtla.github.io/statsforecast/docs/tutorials/multipleseasonalities.html): -how to forecast data with multiple seasonalities using an MSTL. +🔌 [Predict Demand Peaks](https://nixtla.github.io/statsforecast/docs/tutorials/electricitypeakforecasting.html): electricity load forecasting for detecting daily peaks and reducing electric bills. -🔌 [Predict Demand -Peaks](https://nixtla.github.io/statsforecast/docs/tutorials/electricitypeakforecasting.html): -electricity load forecasting for detecting daily peaks and reducing -electric bills. +📈 [Intermittent Demand](https://nixtla.github.io/statsforecast/docs/tutorials/intermittentdata.html): forecast series with very few non-zero observations. -📈 [Intermittent -Demand](https://nixtla.github.io/statsforecast/docs/tutorials/intermittentdata.html): -forecast series with very few non-zero observations. +🌡️ [Exogenous Regressors](https://nixtla.github.io/statsforecast/docs/how-to-guides/exogenous.html): like weather or prices -🌡️ [Exogenous -Regressors](https://nixtla.github.io/statsforecast/docs/how-to-guides/exogenous.html): -like weather or prices ## Models ### Automatic Forecasting +Automatic forecasting tools search for the best parameters and select the best possible model for a group of time series. These tools are useful for large collections of univariate time series. -Automatic forecasting tools search for the best parameters and select -the best possible model for a group of time series. These tools are -useful for large collections of univariate time series. - -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-----------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [AutoARIMA](https://nixtla.github.io/statsforecast/src/core/models.html#autoarima) | ✅ | ✅ | ✅ | ✅ | -| [AutoETS](https://nixtla.github.io/statsforecast/src/core/models.html#autoets) | ✅ | ✅ | ✅ | ✅ | -| [AutoCES](https://nixtla.github.io/statsforecast/src/core/models.html#autoces) | ✅ | ✅ | ✅ | ✅ | -| [AutoTheta](https://nixtla.github.io/statsforecast/src/core/models.html#autotheta) | ✅ | ✅ | ✅ | ✅ | +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[AutoARIMA](https://nixtla.github.io/statsforecast/src/core/models.html#autoarima)|✅|✅|✅|✅|✅| +|[AutoETS](https://nixtla.github.io/statsforecast/src/core/models.html#autoets)|✅|✅|✅|✅|✅| +|[AutoCES](https://nixtla.github.io/statsforecast/src/core/models.html#autoces)|✅|✅|✅|✅|✅| +|[AutoTheta](https://nixtla.github.io/statsforecast/src/core/models.html#autotheta)|✅|✅|✅|✅|✅| ## ARIMA Family - These models exploit the existing autocorrelations in the time series. -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:---------------------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [ARIMA](https://nixtla.github.io/statsforecast/src/core/models.html#arima) | ✅ | ✅ | ✅ | ✅ | -| [AutoRegressive](https://nixtla.github.io/statsforecast/src/core/models.html#autoregressive) | ✅ | ✅ | ✅ | ✅ | +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[ARIMA](https://nixtla.github.io/statsforecast/src/core/models.html#arima)|✅|✅|✅|✅|✅| +|[AutoRegressive](https://nixtla.github.io/statsforecast/src/core/models.html#autoregressive)|✅|✅|✅|✅|✅| ### Theta Family +Fit two theta lines to a deseasonalized time series, using different techniques to obtain and combine the two theta lines to produce the final forecasts. -Fit two theta lines to a deseasonalized time series, using different -techniques to obtain and combine the two theta lines to produce the -final forecasts. - -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-----------------------------------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [Theta](https://nixtla.github.io/statsforecast/src/core/models.html#theta) | ✅ | ✅ | ✅ | ✅ | -| [OptimizedTheta](https://nixtla.github.io/statsforecast/src/core/models.html#optimizedtheta) | ✅ | ✅ | ✅ | ✅ | -| [DynamicTheta](https://nixtla.github.io/statsforecast/src/core/models.html#dynamictheta) | ✅ | ✅ | ✅ | ✅ | -| [DynamicOptimizedTheta](https://nixtla.github.io/statsforecast/src/core/models.html#dynamicoptimizedtheta) | ✅ | ✅ | ✅ | ✅ | +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[Theta](https://nixtla.github.io/statsforecast/src/core/models.html#theta)|✅|✅|✅|✅|✅| +|[OptimizedTheta](https://nixtla.github.io/statsforecast/src/core/models.html#optimizedtheta)|✅|✅|✅|✅|✅| +|[DynamicTheta](https://nixtla.github.io/statsforecast/src/core/models.html#dynamictheta)|✅|✅|✅|✅|✅| +|[DynamicOptimizedTheta](https://nixtla.github.io/statsforecast/src/core/models.html#dynamicoptimizedtheta)|✅|✅|✅|✅|✅| ### Multiple Seasonalities +Suited for signals with more than one clear seasonality. Useful for low-frequency data like electricity and logs. -Suited for signals with more than one clear seasonality. Useful for -low-frequency data like electricity and logs. +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[MSTL](https://nixtla.github.io/statsforecast/src/core/models.html#mstl)|✅|✅|✅|✅|✅| -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [MSTL](https://nixtla.github.io/statsforecast/src/core/models.html#mstl) | ✅ | ✅ | ✅ | ✅ | +### GARCH and ARCH Models +Suited for modeling time series that exhibit non-constant volatility over time. The ARCH model is a particular case of GARCH. -### GARCH and ARCH Models +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[GARCH](https://nixtla.github.io/statsforecast/src/core/models.html#garch)|✅|✅|✅|✅|✅| +|[ARCH](https://nixtla.github.io/statsforecast/src/core/models.html#arch)|✅|✅|✅|✅|✅| -Suited for modeling time series that exhibit non-constant volatility -over time. The ARCH model is a particular case of GARCH. - -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:---------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [GARCH](https://nixtla.github.io/statsforecast/src/core/models.html#garch) | ✅ | ✅ | ✅ | ✅ | -| [ARCH](https://nixtla.github.io/statsforecast/src/core/models.html#arch) | ✅ | ✅ | ✅ | ✅ | ### Baseline Models - Classical models for establishing baseline. -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-----------------------------------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [HistoricAverage](https://nixtla.github.io/statsforecast/src/core/models.html#historicaverage) | ✅ | ✅ | ✅ | ✅ | -| [Naive](https://nixtla.github.io/statsforecast/src/core/models.html#naive) | ✅ | ✅ | ✅ | ✅ | -| [RandomWalkWithDrift](https://nixtla.github.io/statsforecast/src/core/models.html#randomwalkwithdrift) | ✅ | ✅ | ✅ | ✅ | -| [SeasonalNaive](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalnaive) | ✅ | ✅ | ✅ | ✅ | -| [WindowAverage](https://nixtla.github.io/statsforecast/src/core/models.html#windowaverage) | ✅ | | | | -| [SeasonalWindowAverage](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalwindowaverage) | ✅ | | | | +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[HistoricAverage](https://nixtla.github.io/statsforecast/src/core/models.html#historicaverage)|✅|✅|✅|✅|✅| +|[Naive](https://nixtla.github.io/statsforecast/src/core/models.html#naive)|✅|✅|✅|✅|✅| +|[RandomWalkWithDrift](https://nixtla.github.io/statsforecast/src/core/models.html#randomwalkwithdrift)|✅|✅|✅|✅|✅| +|[SeasonalNaive](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalnaive)|✅|✅|✅|✅|✅| +|[WindowAverage](https://nixtla.github.io/statsforecast/src/core/models.html#windowaverage)|✅||||| +|[SeasonalWindowAverage](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalwindowaverage)|✅||||| ### Exponential Smoothing +Uses a weighted average of all past observations where the weights decrease exponentially into the past. Suitable for data with clear trend and/or seasonality. Use the `SimpleExponential` family for data with no clear trend or seasonality. -Uses a weighted average of all past observations where the weights -decrease exponentially into the past. Suitable for data with clear trend -and/or seasonality. Use the `SimpleExponential` family for data with no -clear trend or seasonality. +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[SimpleExponentialSmoothing](https://nixtla.github.io/statsforecast/src/core/models.html#simpleexponentialsmoothing)|✅||||| +|[SimpleExponentialSmoothingOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#simpleexponentialsmoothingoptimized)|✅||||| +|[SeasonalExponentialSmoothing](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalexponentialsmoothing)|✅||||| +|[SeasonalExponentialSmoothingOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalexponentialsmoothingoptimized)|✅||||| +|[Holt](https://nixtla.github.io/statsforecast/src/core/models.html#holt)|✅|✅|✅|✅|✅| +|[HoltWinters](https://nixtla.github.io/statsforecast/src/core/models.html#holtwinters)|✅|✅|✅|✅|✅| -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-------------------------------------------------------------------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [SimpleExponentialSmoothing](https://nixtla.github.io/statsforecast/src/core/models.html#simpleexponentialsmoothing) | ✅ | | | | -| [SimpleExponentialSmoothingOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#simpleexponentialsmoothingoptimized) | ✅ | | | | -| [SeasonalExponentialSmoothing](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalexponentialsmoothing) | ✅ | | | | -| [SeasonalExponentialSmoothingOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#seasonalexponentialsmoothingoptimized) | ✅ | | | | -| [Holt](https://nixtla.github.io/statsforecast/src/core/models.html#holt) | ✅ | ✅ | ✅ | ✅ | -| [HoltWinters](https://nixtla.github.io/statsforecast/src/core/models.html#holtwinters) | ✅ | ✅ | ✅ | ✅ | - -### Sparse or Inttermitent +### Sparse or Intermittent Suited for series with very few non-zero observations -| Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | -|:-------------------------------------------------------------------------------------------------|:--------------:|:----------------------:|:----------------------:|:---------------------------:| -| [ADIDA](https://nixtla.github.io/statsforecast/src/core/models.html#adida) | ✅ | | | | -| [CrostonClassic](https://nixtla.github.io/statsforecast/src/core/models.html#crostonclassic) | ✅ | | | | -| [CrostonOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#crostonoptimized) | ✅ | | | | -| [CrostonSBA](https://nixtla.github.io/statsforecast/src/core/models.html#crostonsba) | ✅ | | | | -| [IMAPA](https://nixtla.github.io/statsforecast/src/core/models.html#imapa) | ✅ | | | | -| [TSB](https://nixtla.github.io/statsforecast/src/core/models.html#tsb) | ✅ | | | | - -## How to contribute +|Model | Point Forecast | Probabilistic Forecast | Insample fitted values | Probabilistic fitted values | +|:------|:-------------:|:----------------------:|:---------------------:|:----------------------------:| +|[ADIDA](https://nixtla.github.io/statsforecast/src/core/models.html#adida)|✅||||| +|[CrostonClassic](https://nixtla.github.io/statsforecast/src/core/models.html#crostonclassic)|✅||||| +|[CrostonOptimized](https://nixtla.github.io/statsforecast/src/core/models.html#crostonoptimized)|✅||||| +|[CrostonSBA](https://nixtla.github.io/statsforecast/src/core/models.html#crostonsba)|✅||||| +|[IMAPA](https://nixtla.github.io/statsforecast/src/core/models.html#imapa)|✅||||| +|[TSB](https://nixtla.github.io/statsforecast/src/core/models.html#tsb)|✅||||| -See -[CONTRIBUTING.md](https://github.com/Nixtla/statsforecast/blob/main/CONTRIBUTING.md). +## 🔨 How to contribute +See [CONTRIBUTING.md](https://github.com/Nixtla/statsforecast/blob/main/CONTRIBUTING.md). ## Citing -``` bibtex +```bibtex @misc{garza2022statsforecast, author={Federico Garza, Max Mergenthaler Canseco, Cristian Challú, Kin G. Olivares}, title = {{StatsForecast}: Lightning fast forecasting with statistical and econometric models}, @@ -242,3 +199,64 @@ See url={https://github.com/Nixtla/statsforecast} } ``` + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fede
fede

💻 🚧
José Morales
José Morales

💻 🚧
Sugato Ray
Sugato Ray

💻
Jeff Tackes
Jeff Tackes

🐛
darinkist
darinkist

🤔
Alec Helyar
Alec Helyar

💬
Dave Hirschfeld
Dave Hirschfeld

💬
mergenthaler
mergenthaler

💻
Kin
Kin

💻
Yasslight90
Yasslight90

🤔
asinig
asinig

🤔
Philip Gillißen
Philip Gillißen

💻
Sebastian Hagn
Sebastian Hagn

🐛 📖
Han Wang
Han Wang

💻
Ben Jeffrey
Ben Jeffrey

🐛
Beliavsky
Beliavsky

📖
Mariana Menchero García
Mariana Menchero García

💻
Nikhil Gupta
Nikhil Gupta

🐛
JD
JD

🐛
josh attenberg
josh attenberg

💻
JeroenPeterBos
JeroenPeterBos

💻
Jeroen Van Der Donckt
Jeroen Van Der Donckt

💻
Roymprog
Roymprog

📖
Nelson Cárdenas Bolaño
Nelson Cárdenas Bolaño

📖
Kyle Schmaus
Kyle Schmaus

💻
Akmal Soliev
Akmal Soliev

💻
Nick To
Nick To

💻
Kevin Kho
Kevin Kho

💻
Yiben Huang
Yiben Huang

📖
Andrew Gross
Andrew Gross

📖
taniishkaaa
taniishkaaa

📖
Manuel Calzolari
Manuel Calzolari

💻
+ + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/action_files/final-formatting.bash b/action_files/final-formatting.bash new file mode 100755 index 000000000..451850326 --- /dev/null +++ b/action_files/final-formatting.bash @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +for file in $(find _docs -type f -name "*mdx"); do + if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' -e 's/style="float:right; font-size:smaller"/style={{ float: "right", fontSize: "smaller" }}/g' $file + sed -i '' -e 's/
//g' $file + else + sed -i -e 's/style="float:right; font-size:smaller"/style={{ float: "right", fontSize: "smaller" }}/g' $file + sed -i -e 's/
//g' $file + fi +done \ No newline at end of file diff --git a/nbs/_extensions/mintlify/_extension.yml b/nbs/_extensions/mintlify/_extension.yml new file mode 100644 index 000000000..663084de9 --- /dev/null +++ b/nbs/_extensions/mintlify/_extension.yml @@ -0,0 +1,30 @@ +title: Mintlify +author: Mintlify, Inc +organization: Mintlify +contributes: + project: + project: + type: default + detect: + - ["mint.json"] + render: + - "**/*.md" + - "**/*.qmd" + - "**/*.ipynb" + format: mintlify-md + formats: + md: + # Although we use a custom writer, we still need the variants here the lua filters to render correctly. + # Ideally, we would forward the variants to the custom writer. + variant: gfm+pipe_tables+tex_math_dollars+raw_html+all_symbols_escapable+backtick_code_blocks+space_in_atx_header+intraword_underscores+lists_without_preceding_blankline+shortcut_reference_links + writer: mintlify_writer.lua + output-ext: mdx + inline-includes: true + preserve-yaml: true + wrap: none + fig-format: retina + fig-width: 8 + fig-height: 5 + html-math-method: webtex + filters: + - mintlify.lua diff --git a/nbs/_extensions/mintlify/mintlify.lua b/nbs/_extensions/mintlify/mintlify.lua new file mode 100644 index 000000000..a1e464013 --- /dev/null +++ b/nbs/_extensions/mintlify/mintlify.lua @@ -0,0 +1,71 @@ +-- mintlify.lua + +local kQuartoRawHtml = "quartoRawHtml" +local rawHtmlVars = pandoc.List() + +function Pandoc(doc) + -- insert exports at the top if we have them + if #rawHtmlVars > 0 then + local exports = ("export const %s =\n[%s];"):format(kQuartoRawHtml, + table.concat( + rawHtmlVars:map(function(var) return '`'.. var .. '`' end), + "," + ) + ) + doc.blocks:insert(1, pandoc.RawBlock("markdown", exports .. "\n")) + end + + return doc +end + + +-- strip image attributes (which may result from +-- fig-format: retina) as they will result in an +-- img tag which won't hit the asset pipeline +function Image(el) + el.attr = pandoc.Attr() + return el +end + +-- header attributes only support id +function Header(el) + el.attr = pandoc.Attr(el.identifier) + return el +end + +Block = function(node) + if node.text ~= nil and string.find(node.text, "") + :format(kQuartoRawHtml, #rawHtmlVars-1) .. "\n" + return pandoc.RawBlock("html", html) + end +end diff --git a/nbs/_extensions/mintlify/mintlify_renderers.lua b/nbs/_extensions/mintlify/mintlify_renderers.lua new file mode 100644 index 000000000..2597fbbf1 --- /dev/null +++ b/nbs/_extensions/mintlify/mintlify_renderers.lua @@ -0,0 +1,3 @@ +local codeBlock = require('mintlify_utils').codeBlock + +return {} -- return an empty table as a hack to pretend we're a shortcode handler for now diff --git a/nbs/_extensions/mintlify/mintlify_utils.lua b/nbs/_extensions/mintlify/mintlify_utils.lua new file mode 100644 index 000000000..42e8776c7 --- /dev/null +++ b/nbs/_extensions/mintlify/mintlify_utils.lua @@ -0,0 +1,47 @@ +-- local scriptCount = 0 +-- local printItem = 5 + +function codeBlock(el, filename) + local lang = el.attr.classes[1] + -- scriptCount = scriptCount + 1 + -- if printItem == scriptCount then + -- quarto.utils.dump(el) + -- end + -- quarto.log.output('---Code block---') + -- quarto.utils.dump(el.output) + -- quarto.utils.dump({}) + -- quarto.log.output('------') + local title = filename or el.attr.attributes["filename"] or el.attr.attributes["title"] + local showLineNumbers = el.attr.classes:includes('number-lines') + if lang or title or showLineNumbers then + if not lang then + lang = 'text' + end + local code = "\n```" .. lang + if showLineNumbers then + code = code .. " showLineNumbers" + end + if title then + code = code .. " title=\"" .. title .. "\"" + end + code = code .. "\n" .. el.text .. "\n```\n" + + -- quarto.log.output('------') + -- quarto.log.output(code) + -- quarto.log.output('------') + -- docusaures code block attributes don't conform to any syntax + -- that pandoc natively understands, so return the CodeBlock as + -- "raw" markdown (so it bypasses pandoc processing entirely) + return pandoc.RawBlock("markdown", code) + + elseif #el.attr.classes == 0 then + el.attr.classes:insert('text') + return el + end + + return nil +end + +return { + codeBlock = codeBlock +} \ No newline at end of file diff --git a/nbs/_extensions/mintlify/mintlify_writer.lua b/nbs/_extensions/mintlify/mintlify_writer.lua new file mode 100644 index 000000000..9fa2d7110 --- /dev/null +++ b/nbs/_extensions/mintlify/mintlify_writer.lua @@ -0,0 +1,133 @@ +local codeBlock = require('mintlify_utils').codeBlock + +local reactPreamble = pandoc.List() + +function capitalizeFirstLetter(str) + return (str:gsub("^%l", string.upper)) +end + +function castToMintlifyCallout(str) + if str == "caution" or str == "danger" then + return "Warning" + else + return capitalizeFirstLetter(str) + end +end + +local function addPreamble(preamble) + if not reactPreamble:includes(preamble) then + reactPreamble:insert(preamble) + end +end + +local function jsx(content) + return pandoc.RawBlock("markdown", content) +end + +local function tabset(node, filter) + -- note groupId + local groupId = "" + local group = node.attr.attributes["group"] + if group then + groupId = ([[ groupId="%s"]]):format(group) + end + + -- create tabs + local tabs = pandoc.Div({}) + tabs.content:insert(jsx("")) + + -- iterate through content + for i = 1, #node.tabs do + local content = node.tabs[i].content + local title = node.tabs[i].title + + tabs.content:insert(jsx(([[]]):format(pandoc.utils.stringify(title)))) + local result = quarto._quarto.ast.walk(content, filter) + if type(result) == "table" then + tabs.content:extend(result) + else + tabs.content:insert(result) + end + tabs.content:insert(jsx("")) + end + + -- end tab and tabset + tabs.content:insert(jsx("")) + + -- ensure we have required deps + addPreamble("import Tabs from '@theme/Tabs';") + addPreamble("import TabItem from '@theme/TabItem';") + + return tabs +end + +function Writer(doc, opts) + local filter + filter = { + CodeBlock = codeBlock, + + DecoratedCodeBlock = function(node) + local el = node.code_block + return codeBlock(el, node.filename) + end, + + Tabset = function(node) + return tabset(node, filter) + end, + + RawBlock = function (rawBlock) + -- We just "pass-through" raw blocks of type "confluence" + if(rawBlock.format == 'plotly') then + quarto.utils.dump("Plotly in filter") + return pandoc.RawBlock('html', rawBlock.text) + end + + -- Raw blocks inclding arbirtary HTML like JavaScript are not supported in CSF + return "" + end, + + Callout = function(node) + local admonition = pandoc.Div({}) + local mintlifyCallout = castToMintlifyCallout(node.type) + admonition.content:insert(jsx("<" .. mintlifyCallout .. ">")) + if node.title then + admonition.content:insert(pandoc.Header(3, node.title)) + end + local content = node.content + if type(content) == "table" then + admonition.content:extend(content) + else + admonition.content:insert(content) + end + admonition.content:insert(jsx("")) + return admonition + end + } + + doc = quarto._quarto.ast.walk(doc, filter) + + -- insert react preamble if we have it + if #reactPreamble > 0 then + local preamble = table.concat(reactPreamble, "\n") + doc.blocks:insert(1, pandoc.RawBlock("markdown", preamble .. "\n")) + end + + local extensions = { + yaml_metadata_block = true, + pipe_tables = true, + footnotes = true, + tex_math_dollars = true, + raw_html = true, + all_symbols_escapable = true, + backtick_code_blocks = true, + space_in_atx_header = true, + intraword_underscores = true, + lists_without_preceding_blankline = true, + shortcut_reference_links = true, + } + + return pandoc.write(doc, { + format = 'markdown_strict', + extensions = extensions + }, opts) +end diff --git a/nbs/_quarto.yml b/nbs/_quarto.yml index 60097036f..37fb3652a 100644 --- a/nbs/_quarto.yml +++ b/nbs/_quarto.yml @@ -1,59 +1,8 @@ project: - type: website + type: mintlify format: - html: - theme: cosmo - fontsize: 1em - linestretch: 1.7 - css: styles.css - toc: true + mintlify-md: + code-fold: true -website: - twitter-card: - image: "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg" - site: "@Nixtlainc" - open-graph: - image: "https://github.com/Nixtla/styles/blob/2abf51612584169874c90cd7c4d347e3917eaf73/images/Banner%20Github.png" - google-analytics: "G-NXJNCVR18L" - repo-actions: [issue] - favicon: favicon_png.png - navbar: - background: primary - search: true - collapse-below: lg - left: - - text: "Get Started" - href: docs/getting-started/getting_started_short.html - - text: "NixtlaVerse" - menu: - - text: "StatsForecast ⚡️" - href: https://github.com/nixtla/statsforecast - - text: "MLForecast 🤖" - href: https://github.com/nixtla/mlforecast - - text: "NeuralForecast 🧠" - href: https://github.com/nixtla/neuralforecast - - text: "HierarchicalForecast 👑" - href: https://github.com/nixtla/hierarchicalforecast - - - text: "Help" - menu: - - text: "Report an Issue" - icon: bug - href: https://github.com/nixtla/statsforecast/issues/new/choose - - text: "Join our Slack" - icon: chat-right-text - href: https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A - right: - - icon: github - href: "https://github.com/nixtla/statsforecast" - - icon: twitter - href: https://twitter.com/nixtlainc - aria-label: Nixtla Twitter - - sidebar: - style: floating - body-footer: | - Give us a ⭐ on [Github](https://github.com/nixtla/statsforecast) - -metadata-files: [nbdev.yml, sidebar.yml] +metadata-files: [nbdev.yml] diff --git a/nbs/custom.yml b/nbs/custom.yml deleted file mode 100644 index 1b2c854c2..000000000 --- a/nbs/custom.yml +++ /dev/null @@ -1,22 +0,0 @@ -website: - logo: https://github.com/Nixtla/styles/blob/b9ea432cfa2dae20fc84d8634cae6db902f9ca3f/images/Nixtla_Blanco.png - reader-mode: false - navbar: - collapse-below: lg - left: - - text: "Get Started" - href: examples/Getting_Started_with_Auto_Arima_and_ETS.ipynb - - text: "Experiments" - href: https://github.com/Nixtla/statsforecast/tree/main/experiments - - text: "Help" - menu: - - text: "Report an Issue" - icon: bug - href: https://github.com/nixtla/statsforecast/issues - - text: "Slack Nixtla" - icon: chat-right-text - href: https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A - right: - - icon: twitter - href: https://twitter.com/nixtlainc - aria-label: Nixtla Twitter diff --git a/nbs/favicon.png b/nbs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb85089d6ed81fee60833b5637849f4345291ce GIT binary patch literal 208747 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

m4#s3|{9}y)d?bpJ#Cb<^`NhRd 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 literal 0 HcmV?d00001 diff --git a/nbs/favicon.svg b/nbs/favicon.svg new file mode 100644 index 000000000..e5f333428 --- /dev/null +++ b/nbs/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/nbs/favicon_png.png b/nbs/favicon_png.png new file mode 100644 index 0000000000000000000000000000000000000000..7c7684de22282513d154d0f8fb2a7c09e8bafa69 GIT binary patch literal 177981 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

    &ebAyq^DUK7 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 literal 0 HcmV?d00001 diff --git a/nbs/mint.json b/nbs/mint.json new file mode 100644 index 000000000..86817bc40 --- /dev/null +++ b/nbs/mint.json @@ -0,0 +1,122 @@ +{ + "$schema": "https://mintlify.com/schema.json", + "name": "Nixtla", + "logo": { + "light": "/light.png", + "dark": "/dark.png" + }, + "favicon": "/favicon.svg", + "colors": { + "primary": "#0E0E0E", + "light": "#FAFAFA", + "dark": "#0E0E0E", + "anchors": { + "from": "#2AD0CA", + "to": "#0E00F8" + } + }, + "topbarCtaButton": { + "type": "github", + "url": "https://github.com/Nixtla/nixtla" + }, + "topAnchor": { + "name": "StatsForecast", + "icon": "bolt" + }, + "navigation": [ + { + "group": "", + "pages": ["index.html"] + }, + { + "group": "Getting Started", + "pages": [ + "docs/getting-started/installation.html", + "docs/getting-started/getting_started_short.html", + "docs/getting-started/getting_started_complete.html" + ] + }, + { + "group": "Tutorials", + "pages": [ + "docs/tutorials/anomalydetection.html", + "docs/tutorials/conformalprediction.html", + "docs/tutorials/crossvalidation.html", + "docs/tutorials/electricityloadforecasting.html", + "docs/tutorials/electricitypeakforecasting.html", + "docs/tutorials/garch_tutorial.html", + "docs/tutorials/intermittentdata.html", + "docs/tutorials/multipleseasonalities.html", + "docs/tutorials/statisticalneuralmethods.html", + "docs/tutorials/uncertaintyintervals.html" + ] + }, + { + "group": "How to Guides", + "pages": [ + "docs/how-to-guides/automatic_forecasting.html", + "docs/how-to-guides/amazonstatsforecast.html", + "docs/how-to-guides/autoarima_vs_prophet.html", + "docs/how-to-guides/dask.html", + "docs/how-to-guides/ets_ray_m5.html", + "docs/how-to-guides/exogenous.html", + "docs/how-to-guides/getting_started_complete_polars.html", + "docs/how-to-guides/migrating_R", + "docs/how-to-guides/numba_cache.html", + "docs/how-to-guides/prophet_spark_m5.html", + "docs/how-to-guides/ray.html", + "docs/how-to-guides/spark.html" + ] + }, + { + "group": "Model References", + "pages": [ + "docs/models/adida.html", + "docs/models/arch.html", + "docs/models/arima.html", + "docs/models/autoarima.html", + "docs/models/autoces.html", + "docs/models/autoets.html", + "docs/models/autoregressive.html", + "docs/models/autotheta.html", + "docs/models/crostonclassic.html", + "docs/models/crostonoptimized.html", + "docs/models/crostonsba.html", + "docs/models/dynamicoptimizedtheta.html", + "docs/models/dynamicstandardtheta.html", + "docs/models/garch.html", + "docs/models/holt.html", + "docs/models/holtwinters.html", + "docs/models/imapa.html", + "docs/models/multipleseasonaltrend.html", + "docs/models/optimizedtheta.html", + "docs/models/seasonalexponentialsmoothing.html", + "docs/models/seasonalexponentialsmoothingoptimized.html", + "docs/models/simpleexponentialoptimized.html", + "docs/models/simpleexponentialsmoothing.html", + "docs/models/standardtheta.html", + "docs/models/tsb.html" + ] + }, + { + "group": "API Reference", + "pages": [ + "src/core/core.html", + "src/core/distributed.fugue.html", + "src/core/models.html", + "src/core/models_intro" + ] + }, + { + "group": "Contributing", + "pages": [ + "docs/contribute/contribute", + "docs/contribute/docs", + "docs/contribute/issue-labels", + "docs/contribute/issues", + "docs/contribute/step-by-step", + "docs/contribute/techstack" + ] + } + ] +} diff --git a/nbs/styles.css b/nbs/styles.css deleted file mode 100644 index 17f7c8a54..000000000 --- a/nbs/styles.css +++ /dev/null @@ -1,431 +0,0 @@ -/* old */ -.cell { - margin-bottom: 1rem; -} - -.cell > .sourceCode { - margin-bottom: 0; -} - -.cell-output > pre { - margin-bottom: 0; -} - -.cell-output > pre, -.cell-output > .sourceCode > pre, -.cell-output-stdout > pre { - margin-left: 0.8rem; - margin-top: 0; - background: none; - border-left: 2px solid lightsalmon; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.cell-output > .sourceCode { - border: none; - background: none; - margin-top: 0; -} - -.cell-output > div { - display: inline-block; -} - -div.description { - padding-left: 2px; - padding-top: 5px; - font-style: italic; - font-size: 135%; - opacity: 70%; -} - -/* show_doc signature */ -blockquote > pre { - font-size: 14px; -} - -.table { - font-size: 16px; - /* disable striped tables */ - --bs-table-striped-bg: var(--bs-table-bg); -} - -.quarto-figure-center > figure > figcaption { - text-align: center; -} - -.figure-caption { - font-size: 75%; - font-style: italic; -} - -/* new */ -@font-face { - font-family: "Inter"; - src: url("./assets/Inter-VariableFont.ttf") format("ttf"); -} - -:root { - --primary: rgb(75, 176, 215); - --secondary: rgb(255, 112, 0); -} - -html, -body { - color: #374151; - font-family: "Inter", sans-serif; -} - -header { - transform: translateY(0) !important; -} - -#title-block-header { - margin-block-end: 2rem; -} - -#quarto-sidebar { - top: 62px !important; - z-index: 100; -} - -.content a { - color: rgb(12, 18, 26); - text-decoration: none; - font-weight: 600; - border-bottom: 1px solid var(--primary); -} - -.content a:hover { - border-bottom: 2px solid var(--primary); -} - -a > code { - background-color: transparent !important; -} - -a > code:hover { - color: var(--primary) !important; -} - -.navbar { - background: rgba(255, 255, 255, 0.95); - backdrop-filter: blur(8px); - -webkit-backdrop-filter: blur(8px); /* For Safari support */ - border-bottom: 1px solid rgba(17, 24, 39, 0.05); -} - -.nav-link { - color: rgba(17, 24, 39, 0.6) !important; - font-size: 0.875rem; -} - -.nav-link.active { - color: rgb(17, 24, 39) !important; -} - -.aa-SubmitIcon { - fill: rgba(17, 24, 39, 0.6) !important; - height: 20px !important; - margin-top: -2px; -} - -.navbar #quarto-search { - margin-left: -2px; -} - -.navbar-container { - max-width: 1280px; - margin: 0 auto; -} - -.navbar-brand { - background-image: url("./assets/logo.png"); - background-size: contain; - background-repeat: no-repeat; - background-position: center; - height: 1.25rem; -} - -.navbar-title { - opacity: 0; - pointer-events: none; -} - -.content { - width: 100%; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - color: rgb(17, 24, 39); - margin-top: 3rem; -} - -h1.title { - font-weight: 800; - font-size: 1.875rem; - line-height: 2.25rem; -} - -div.description { - font-style: normal; - font-size: 0.875rem; - line-height: 1.25rem; -} - -p { - margin-bottom: 1.25rem; -} - -/* menu */ -.sidebar-menu-container - > ul - > li:first-child - > .sidebar-item-container - > a - > span { - font-weight: 600 !important; - font-size: 0.875rem; - color: var(--secondary); -} - -div.sidebar-item-container { - color: #323232; -} - -.sidebar-divider.hi { - color: rgb(0, 0, 0, 0.2); - margin-top: 0.5rem; - margin-bottom: 1rem; -} - -#quarto-margin-sidebar { - top: 63px !important; -} - -.menu-text { - font-weight: 400; -} - -ul.sidebar-section { - padding-left: 0; -} - -.sidebar-link { - line-height: 2.125rem; - padding: 0 0.5rem; -} - -.sidebar-menu-container { - padding-right: 0 !important; -} - -ul.sidebar-section .sidebar-link { - padding-left: 1rem; - width: 100%; -} - -.sidebar-link.active { - background: rgba(255, 112, 0, 0.1); - border-radius: 0.25rem; -} - -.sidebar-link.active span { - font-weight: 600 !important; - color: var(--secondary); -} - -.callout { - border-left: auto !important; - border-radius: 1rem; - padding: 0.75rem; -} - -.callout-tip { - background: rgba(63, 182, 24, 0.05); - border: 1px solid rgba(63, 182, 24, 0.25) !important; -} - -.callout-note { - background: rgba(59, 130, 246, 0.05); - border: 1px solid rgba(59, 130, 246, 0.25) !important; -} - -.callout-style-default > .callout-header { - background: none !important; -} - -code:not(.sourceCode) { - background-color: rgb(249, 250, 251, 0.7) !important; - border: 1px solid rgba(12, 18, 26, 0.1) !important; - border-radius: 0.375rem; - color: rgba(12, 18, 26, 0.8) !important; - font-size: 0.875rem !important; - font-weight: 600 !important; - padding: 0.25rem 0.5rem !important; -} - -div.sourceCode { - background: none; - border: 0; - overflow-x: hidden; -} - -.cell-output { - margin-top: 1rem; -} - -.cell-output pre { - border-radius: 0.375rem; -} - -.cell-output > div { - overflow-x: scroll; -} - -.code-copy-button { - margin: 0.5rem; -} - -pre.sourceCode { - padding: 0; -} - -code { - background-color: rgb(249, 250, 251, 0.7) !important; - border: 1px solid rgba(12, 18, 26, 0.1) !important; - border-radius: 0.75rem; - color: rgba(12, 18, 26, 0.8) !important; - font-size: 0.875rem !important; - font-weight: 600 !important; - padding: 1rem !important; - overflow-x: scroll !important; -} - -.cell-output > div { - border: 1px solid rgba(100, 116, 139, 0.2) !important; - border-radius: 1rem; - margin-bottom: 3rem; - margin-top: 3rem; -} - -table, -.table { - border-radius: 1rem; - font-size: 0.875rem; - margin-bottom: 0; - max-width: 100%; - overflow-x: scroll; - display: block; -} - -thead { - background: rgba(12, 18, 26, 0.02); - border-bottom-color: rgba(100, 116, 139, 0.2) !important; -} - -thead tr:first-child { - background-color: rgb(249, 250, 251, 0.7) !important; -} - -thead tr:first-child th:first-child { - border-radius: 1rem 0 0 0; -} - -thead tr:first-child th:last-child { - border-radius: 0 1rem 0 0; -} - -th, -td { - padding: 0.5rem 1rem !important; - white-space: nowrap !important; -} - -td a, -td a code { - white-space: nowrap !important; -} - -tbody { - border-color: transparent !important; - border-top: none !important; -} - -tbody tr:last-child td:first-child { - border-radius: 0 0 0 1rem; -} - -tr.even, -tr.odd { - line-height: 2rem; -} - -tr:hover { - background-color: rgba(17, 24, 39, 0.05); -} - -td:first-child, -td:last-child { - padding: 0.25rem 1rem !important; -} - -.dropdown-menu.show { - background: white; - border: none; - border-radius: 0.5rem; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); - padding-top: 0.5rem !important; - padding-bottom: 0.25rem !important; -} - -.dropdown-menu li { - padding: 0.25rem 1rem !important; -} - -.dropdown-menu li:hover { - background-color: #e9ecef; -} - -.js-plotly-plot .plotly { - border: none !important; -} - -.svg-container { - border: none !important; -} - -.svg-container > svg { - border-radius: 2rem; -} - -.plotly-graph-div { - border-radius: 5rem; -} - -@media (max-width: 991.98px) { - #quarto-sidebar-glass.show { - z-index: 10001; - } - - #quarto-sidebar { - top: 0 !important; - z-index: 10002 !important; - } - - #quarto-sidebar .sidebar-menu-container { - min-width: unset; - width: calc(100% - 32px); - } - - #quarto-sidebar.show { - max-width: calc(100vw - 32px); - width: 320px !important; - } -} diff --git a/preview-mintlify-docs.bash b/preview-mintlify-docs.bash new file mode 100644 index 000000000..fdde934c2 --- /dev/null +++ b/preview-mintlify-docs.bash @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +echo "Running nbdev_docs..." +nbdev_docs +echo "nbdev_docs is done" + +echo "Running final-formatting.bash..." +chmod +x final-formatting.bash +./final-formatting.bash +echo "final-formatting.bash is done" + +echo "Moving necessary assets..." +cp nbs/mint.json _docs/mint.json +cp nbs/imgs/logo/dark.png _docs/dark.png +cp nbs/imgs/logo/light.png _docs/light.png +cp nbs/favicon.svg _docs/favicon.svg +mkdir _docs/docs/contribute +cp _proc/docs/contribute/contribute.md _docs/docs/contribute/contribute.mdx +cp _proc/docs/contribute/docs.md _docs/docs/contribute/docs.mdx +cp _proc/docs/contribute/issue-labels.md _docs/docs/contribute/issue-labels.mdx +cp _proc/docs/contribute/issues.md _docs/docs/contribute/issues.mdx +cp _proc/docs/contribute/step-by-step.md _docs/docs/contribute/step-by-step.mdx +cp _proc/docs/contribute/techstack.md _docs/docs/contribute/techstack.mdx +echo "Done moving necessary assets" + +cd ./_docs +mintlify dev \ No newline at end of file diff --git a/settings.ini b/settings.ini index ab5f35046..7361c3603 100644 --- a/settings.ini +++ b/settings.ini @@ -15,7 +15,7 @@ language = English custom_sidebar = True license = apache2 status = 2 -requirements = numba>=0.55.0 numpy>=1.21.6 pandas>=1.3.5 polars scipy>=1.7.3 statsmodels>=0.13.2 tqdm fugue>=0.8.1 utilsforecast>=0.0.5 +requirements = numba>=0.55.0 numpy>=1.21.6 pandas>=1.3.5 polars scipy>=1.7.3 statsmodels>=0.13.2 tqdm fugue>=0.8.1 utilsforecast>=0.0.5 nbdev_plotly ray_requirements = fugue[ray]>=0.8.1 protobuf>=3.15.3,<4.0.0 dask_requirements = fugue[dask]>=0.8.1 spark_requirements = fugue[spark]>=0.8.1 @@ -32,4 +32,5 @@ title = %(lib_name)s black_formatting = True jupyter_hooks = True clean_ids = True -readme_nb = index.ipynb \ No newline at end of file +readme_nb = index.ipynb +procs = nbdev_plotly.plotly:PlotlyProc From 5a7418d3deb681df35b03b11092963595474e35a Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Tue, 10 Oct 2023 22:22:04 -0700 Subject: [PATCH 02/22] delete contribute --- preview-mintlify-docs.bash | 7 ------- 1 file changed, 7 deletions(-) diff --git a/preview-mintlify-docs.bash b/preview-mintlify-docs.bash index fdde934c2..27aa8468d 100644 --- a/preview-mintlify-docs.bash +++ b/preview-mintlify-docs.bash @@ -14,13 +14,6 @@ cp nbs/mint.json _docs/mint.json cp nbs/imgs/logo/dark.png _docs/dark.png cp nbs/imgs/logo/light.png _docs/light.png cp nbs/favicon.svg _docs/favicon.svg -mkdir _docs/docs/contribute -cp _proc/docs/contribute/contribute.md _docs/docs/contribute/contribute.mdx -cp _proc/docs/contribute/docs.md _docs/docs/contribute/docs.mdx -cp _proc/docs/contribute/issue-labels.md _docs/docs/contribute/issue-labels.mdx -cp _proc/docs/contribute/issues.md _docs/docs/contribute/issues.mdx -cp _proc/docs/contribute/step-by-step.md _docs/docs/contribute/step-by-step.mdx -cp _proc/docs/contribute/techstack.md _docs/docs/contribute/techstack.mdx echo "Done moving necessary assets" cd ./_docs From 20bbcd0c678dd2164a58989be0b62fd847c78fca Mon Sep 17 00:00:00 2001 From: Dave Parr <8363743+DaveParr@users.noreply.github.com> Date: Thu, 12 Oct 2023 00:09:29 +0100 Subject: [PATCH 03/22] Correct broken url to docs (#660) --- nbs/src/core/distributed.fugue.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nbs/src/core/distributed.fugue.ipynb b/nbs/src/core/distributed.fugue.ipynb index 0f1a6f892..992619618 100644 --- a/nbs/src/core/distributed.fugue.ipynb +++ b/nbs/src/core/distributed.fugue.ipynb @@ -443,7 +443,7 @@ "source": [ "### Distributed Forecast\n", "\n", - "For extremely fast distributed predictions we use FugueBackend as backend that operates like the original [StatsForecast.forecast](https://nixtla.github.io/statsforecast/core.html#statsforecast.forecast) method.\n", + "For extremely fast distributed predictions we use FugueBackend as backend that operates like the original [StatsForecast.forecast](https://nixtla.github.io/statsforecast/src/core/core.html#statsforecast.forecast) method.\n", "\n", "It receives as input a pandas.DataFrame with columns [`unique_id`,`ds`,`y`] and exogenous, where the `ds` (datestamp) column should be of a format expected by Pandas. The `y` column must be numeric, and represents the measurement we wish to forecast. And the `unique_id` uniquely identifies the series in the panel data." ] @@ -562,7 +562,7 @@ "source": [ "### Distributed Cross-Validation\n", "\n", - "For extremely fast distributed temporcal cross-validation we use `cross_validation` method that operates like the original [StatsForecast.cross_validation](https://nixtla.github.io/statsforecast/core.html#statsforecast) method." + "For extremely fast distributed temporcal cross-validation we use `cross_validation` method that operates like the original [StatsForecast.cross_validation](https://nixtla.github.io/statsforecast/src/core/core.html#statsforecast.cross_validation) method." ] }, { From 06fcb55463c06dda83db9080758c57402c5f4649 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:01:18 -0700 Subject: [PATCH 04/22] final final formatting --- .github/workflows/build-docs.yaml | 2 +- ...atting.bash => docs-final-formatting.bash} | 4 ++- action_files/docs_replace_imgs.py | 30 +++++++++++++++++++ preview-mintlify-docs.bash | 8 ++--- 4 files changed, 38 insertions(+), 6 deletions(-) rename action_files/{final-formatting.bash => docs-final-formatting.bash} (89%) create mode 100644 action_files/docs_replace_imgs.py diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index d50ea4104..139ffd77b 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -22,7 +22,7 @@ jobs: nbdev_docs - name: Apply final formats shell: bash - run: bash ./action_files/final-formatting.bash + run: bash ./action_files/docs-final-formatting.bash - name: Copy over necessary assets run: | cp nbs/mint.json _docs/mint.json diff --git a/action_files/final-formatting.bash b/action_files/docs-final-formatting.bash similarity index 89% rename from action_files/final-formatting.bash rename to action_files/docs-final-formatting.bash index 451850326..07f0badb1 100755 --- a/action_files/final-formatting.bash +++ b/action_files/docs-final-formatting.bash @@ -8,4 +8,6 @@ for file in $(find _docs -type f -name "*mdx"); do sed -i -e 's/style="float:right; font-size:smaller"/style={{ float: "right", fontSize: "smaller" }}/g' $file sed -i -e 's/
    //g' $file fi -done \ No newline at end of file +done + +python3 "$(dirname "$0")/docs_replace_imgs.py" \ No newline at end of file diff --git a/action_files/docs_replace_imgs.py b/action_files/docs_replace_imgs.py new file mode 100644 index 000000000..7ce4b2f72 --- /dev/null +++ b/action_files/docs_replace_imgs.py @@ -0,0 +1,30 @@ +import os +from pathlib import Path +import re + +def main(): + dir_path = os.path.dirname(os.path.realpath(__file__)) + docs_path = os.path.abspath(os.path.join(dir_path, '../_docs')) + docs_path_obj = Path(docs_path) + paths_in_dir = docs_path_obj.glob('**/*.mdx') + pattern = r'!\[\]\(((?!https:\/\/).+?)\)' + + for file_path in paths_in_dir: + if file_path.is_file(): + folder_arr = file_path.parts[len(docs_path_obj.parts):-1] + content = file_path.read_text() + content = re.sub(pattern, url_replace(folder_arr), content) + file_path.write_text(content) + +def url_replace(folder_arr): + def url_replace_helper(match): + curr_url = Path(match[1]) + new_url = str(Path(*folder_arr).joinpath(curr_url)) + if not new_url.startswith('/'): + new_url = '/' + new_url + print('![](' + str(new_url) + ')') + return '![](' + str(new_url) + ')' + return url_replace_helper + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/preview-mintlify-docs.bash b/preview-mintlify-docs.bash index 27aa8468d..4c5e1c47e 100644 --- a/preview-mintlify-docs.bash +++ b/preview-mintlify-docs.bash @@ -4,10 +4,10 @@ echo "Running nbdev_docs..." nbdev_docs echo "nbdev_docs is done" -echo "Running final-formatting.bash..." -chmod +x final-formatting.bash -./final-formatting.bash -echo "final-formatting.bash is done" +echo "Running docs-final-formatting.bash..." +chmod +x docs-final-formatting.bash +./action_files/docs-final-formatting.bash +echo "docs-final-formatting.bash is done" echo "Moving necessary assets..." cp nbs/mint.json _docs/mint.json From bfd0c52af97e6b3de37b3e6bf869413caacae986 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 11 Oct 2023 18:13:00 -0700 Subject: [PATCH 05/22] delete all the other workflows lol --- .github/workflows/ci.yaml | 118 --------------------------- .github/workflows/deploy.yaml | 9 -- .github/workflows/lint.yaml | 28 ------- .github/workflows/no-response.yaml | 21 ----- .github/workflows/python-publish.yml | 25 ------ 5 files changed, 201 deletions(-) delete mode 100644 .github/workflows/ci.yaml delete mode 100644 .github/workflows/deploy.yaml delete mode 100644 .github/workflows/lint.yaml delete mode 100644 .github/workflows/no-response.yaml delete mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 59254ab31..000000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,118 +0,0 @@ -name: CI - -on: - push: - branches: [main] - pull_request: - branches: [main] - -defaults: - run: - shell: bash -l {0} - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -env: - NIXTLA_NUMBA_CACHE: '1' - -jobs: - nb-sync: - runs-on: ubuntu-latest - steps: - - name: Clone repo - uses: actions/checkout@v2 - - - name: Set up python - uses: actions/setup-python@v2 - - - name: Install nbdev - run: pip install nbdev - - - name: Check if all notebooks are cleaned - run: | - echo "Check we are starting with clean git checkout" - if [ -n "$(git status -uno -s)" ]; then echo "git status is not clean"; false; fi - echo "Trying to strip out notebooks" - ./action_files/clean_nbs - echo "Check that strip out was unnecessary" - git status -s # display the status to see which nbs need cleaning up - if [ -n "$(git status -uno -s)" ]; then echo -e "!!! Detected unstripped out notebooks\n!!!Remember to run nbdev_install_git_hooks and running ./action_files/clean_nbs before committing"; false; fi - - run-local-tests: - runs-on: windows-latest - strategy: - fail-fast: false - matrix: - python-version: [3.7, 3.8, 3.9, '3.10', '3.11'] - steps: - - name: Clone repo - uses: actions/checkout@v3 - - - name: Set up environment - uses: mamba-org/setup-micromamba@v1 - with: - environment-file: dev/local_environment.yml - create-args: python=${{ matrix.python-version }} - cache-environment: true - - - name: Install pip requirements - run: pip install ./ - - - name: Run local tests - run: nbdev_test --skip_file_re '(models|distributed|ets).*.ipynb' --pause 1.0 - - run-tests: - runs-on: ${{ matrix.os }} - timeout-minutes: 60 - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest] - python-version: [3.7, 3.8, 3.9, '3.10', '3.11'] - steps: - - name: Clone repo - uses: actions/checkout@v3 - - - name: Set up environment - uses: mamba-org/setup-micromamba@v1 - with: - environment-file: dev/environment.yml - create-args: python=${{ matrix.python-version }} - cache-environment: true - - - name: Install pip requirements - run: pip install ./ - - - name: Run tests - run: nbdev_test --skip_file_re '(distributed).*.ipynb' --pause 1.0 - - - name: Run integration tests - run: | - pip install ".[dev]" pytest - pytest --durations=0 action_files - - test-m3-performance: - runs-on: ubuntu-latest - strategy: - fail-fast: false - steps: - - name: Clone repo - uses: actions/checkout@v3 - - - name: Set up environment - uses: mamba-org/setup-micromamba@v1 - with: - environment-file: dev/environment.yml - create-args: python=3.10 - cache-environment: true - - - name: Install library and extra deps - run: pip install ".[dev]" fire - - - name: Run M3 experiment - run: | - python -m src.experiment - python -m src.evaluation --test - working-directory: ./experiments/m3 diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml deleted file mode 100644 index 8d077a768..000000000 --- a/.github/workflows/deploy.yaml +++ /dev/null @@ -1,9 +0,0 @@ -name: Deploy to GitHub Pages -on: - push: - branches: ["main"] - workflow_dispatch: -jobs: - deploy: - runs-on: ubuntu-latest - steps: [uses: fastai/workflows/quarto-ghp@master] diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml deleted file mode 100644 index 047073aa0..000000000 --- a/.github/workflows/lint.yaml +++ /dev/null @@ -1,28 +0,0 @@ -name: Lint - -on: - push: - branches: [main] - pull_request: - branches: [main] - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - name: Clone repo - uses: actions/checkout@v2 - - - name: Set up python - uses: actions/setup-python@v2 - with: - python-version: 3.8 - - - name: Install linters - run: pip install mypy types-setuptools flake8 - - - name: mypy - run: mypy statsforecast/ - - - name: flake8 - run: flake8 --select=F statsforecast/ diff --git a/.github/workflows/no-response.yaml b/.github/workflows/no-response.yaml deleted file mode 100644 index a2b26e127..000000000 --- a/.github/workflows/no-response.yaml +++ /dev/null @@ -1,21 +0,0 @@ -name: No Response Bot - -on: - issue_comment: - types: [created] - schedule: - - cron: '0 4 * * *' - -jobs: - noResponse: - runs-on: ubuntu-latest - steps: - - uses: lee-dohm/no-response@v0.5.0 - with: - closeComment: > - This issue has been automatically closed because it has been awaiting a response for too long. - When you have time to to work with the maintainers to resolve this issue, please post a new comment and it will be re-opened. - If the issue has been locked for editing by the time you return to it, please open a new issue and reference this one. - daysUntilClose: 30 - responseRequiredLabel: awaiting response - token: ${{ github.token }} diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml deleted file mode 100644 index 58b53adf6..000000000 --- a/.github/workflows/python-publish.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Upload Python Package - -on: - release: - types: [published] - -jobs: - deploy: - - runs-on: ubuntu-latest - permissions: - id-token: write - - steps: - - uses: actions/checkout@v3 - - name: Set up Python - uses: actions/setup-python@v3 - with: - python-version: '3.10' - - name: Install dependencies - run: python -m pip install build wheel - - name: Build package - run: python -m build -sw - - name: Publish package - uses: pypa/gh-action-pypi-publish@release/v1 From 7037bc6241fd41c5071e41cbab47d883f65b7c13 Mon Sep 17 00:00:00 2001 From: Akmal Soliev Date: Fri, 13 Oct 2023 22:36:52 +0200 Subject: [PATCH 06/22] [CHORE] Updating `requirements.txt` (#666) --- dev/requirements.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/dev/requirements.txt b/dev/requirements.txt index 4f4a21c28..4109358c4 100644 --- a/dev/requirements.txt +++ b/dev/requirements.txt @@ -1,17 +1,21 @@ -holidays<0.21 +holidays<0.21 jupyterlab matplotlib numba>=0.55.0 numpy>=1.21.6 pandas>=1.3.5 +pyspark>=3.3 pip prophet +pyarrow scipy>=1.7.3 statsmodels>=0.13.2 tabulate plotly +utilsforecast>=0.0.5 +fugue[dask,ray] nbdev -tqdm plotly-resampler polars -supersmoother \ No newline at end of file +supersmoother +tqdm From 041a697cd4829a1ad8e4d717f6a7193b721e29fd Mon Sep 17 00:00:00 2001 From: Kin Date: Fri, 13 Oct 2023 19:20:06 -0400 Subject: [PATCH 07/22] [Feat] Robustified crossvalidation (#668) --- .gitignore | 1 + nbs/src/core/core.ipynb | 70 +++++++++++++++++--- nbs/src/core/models.ipynb | 123 ++++++++++++++++++++++++++++++++++ statsforecast/_modidx.py | 4 ++ statsforecast/core.py | 50 +++++++++----- statsforecast/models.py | 135 +++++++++++++++++++++++++++++--------- 6 files changed, 327 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index adba6ab4f..06d74c19e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ dist .vscode .idea *.gif +*.icloud *.csv */data/* *.parquet diff --git a/nbs/src/core/core.ipynb b/nbs/src/core/core.ipynb index 91d28c4f9..5c8308d38 100644 --- a/nbs/src/core/core.ipynb +++ b/nbs/src/core/core.ipynb @@ -166,14 +166,21 @@ " return False\n", " return np.allclose(self.data, other.data) and np.array_equal(self.indptr, other.indptr)\n", " \n", - " def fit(self, models):\n", + " def fit(self, models, fallback_model=None):\n", " fm = np.full((self.n_groups, len(models)), np.nan, dtype=object)\n", " for i, grp in enumerate(self):\n", " y = grp[:, 0] if grp.ndim == 2 else grp\n", " X = grp[:, 1:] if (grp.ndim == 2 and grp.shape[1] > 1) else None\n", " for i_model, model in enumerate(models):\n", - " new_model = model.new()\n", - " fm[i, i_model] = new_model.fit(y=y, X=X)\n", + " try:\n", + " new_model = model.new()\n", + " fm[i, i_model] = new_model.fit(y=y, X=X)\n", + " except Exception as error:\n", + " if fallback_model is not None:\n", + " new_fallback_model = fallback_model.new()\n", + " fm[i, i_model] = new_fallback_model.fit(y=y, X=X)\n", + " else:\n", + " raise error\n", " return fm\n", " \n", " def _get_cols(self, models, attr, h, X, level=tuple()):\n", @@ -354,9 +361,13 @@ " else:\n", " if i_window == 0:\n", " # for the first window we have to fit each model\n", - " model = model.fit(y=y_train, X=X_train)\n", - " if fallback_model is not None:\n", - " fallback_model = fallback_model.fit(y=y_train, X=X_train)\n", + " try:\n", + " model = model.fit(y=y_train, X=X_train)\n", + " except Exception as error:\n", + " if fallback_model is not None:\n", + " fallback_model = fallback_model.fit(y=y_train, X=X_train)\n", + " else:\n", + " raise error\n", " try:\n", " res_i = model.forward(h=h, y=y_train, X=X_train, \n", " X_future=X_future, fitted=fitted, **kwargs)\n", @@ -682,6 +693,47 @@ "np.testing.assert_array_equal(fcst_cv_f['fitted']['values'], fcst_cv_naive['fitted']['values'])" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "e05f8b34", + "metadata": {}, + "outputs": [], + "source": [ + "#| hide\n", + "# test fallback model under failed fit for cross validation\n", + "class FailedFit:\n", + "\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def forecast(self):\n", + " pass\n", + "\n", + " def fit(self, y, X):\n", + " raise Exception('Failed fit')\n", + "\n", + " def __repr__(self):\n", + " return \"FailedFit\"\n", + "\n", + "fcst_cv_f = ga.cross_validation(\n", + " models=[FailedFit()], \n", + " fallback_model=Naive(), h=2, \n", + " test_size=5,\n", + " refit=False,\n", + " fitted=True,\n", + ")\n", + "fcst_cv_naive = ga.cross_validation(\n", + " models=[Naive()], \n", + " h=2, \n", + " test_size=5,\n", + " refit=False,\n", + " fitted=True,\n", + ")\n", + "test_eq(fcst_cv_f['forecasts'], fcst_cv_naive['forecasts'])\n", + "np.testing.assert_array_equal(fcst_cv_f['fitted']['values'], fcst_cv_naive['fitted']['values'])" + ] + }, { "cell_type": "code", "execution_count": null, @@ -1333,7 +1385,7 @@ " self._set_prediction_intervals(prediction_intervals=prediction_intervals)\n", " self._prepare_fit(df, sort_df)\n", " if self.n_jobs == 1:\n", - " self.fitted_ = self.ga.fit(models=self.models)\n", + " self.fitted_ = self.ga.fit(models=self.models, fallback_model=self.fallback_model)\n", " else:\n", " self.fitted_ = self._fit_parallel()\n", " return self\n", @@ -1725,10 +1777,10 @@ " with Pool(self.n_jobs, **pool_kwargs) as executor:\n", " futures = []\n", " for ga in gas:\n", - " future = executor.apply_async(ga.fit, (self.models,))\n", + " future = executor.apply_async(ga.fit, (self.models, self.fallback_model))\n", " futures.append(future)\n", " fm = np.vstack([f.get() for f in futures])\n", - " return fm\n", + " return fm \n", " \n", " def _get_gas_Xs(self, X):\n", " gas = self.ga.split(self.n_jobs)\n", diff --git a/nbs/src/core/models.ipynb b/nbs/src/core/models.ipynb index 5f86d9215..5b2ad2dcf 100644 --- a/nbs/src/core/models.ipynb +++ b/nbs/src/core/models.ipynb @@ -5412,6 +5412,40 @@ " residuals = y - out[\"fitted\"]\n", " sigma = _calculate_sigma(residuals, len(residuals) - 1)\n", " res = _add_fitted_pi(res=res, se=sigma, level=level)\n", + " return res\n", + " \n", + " def forward(\n", + " self, \n", + " y: np.ndarray,\n", + " h: int,\n", + " X: Optional[np.ndarray] = None,\n", + " X_future: Optional[np.ndarray] = None,\n", + " level: Optional[List[int]] = None,\n", + " fitted: bool = False,\n", + " ):\n", + " \"\"\" Apply fitted model to an new/updated series.\n", + "\n", + " Parameters\n", + " ----------\n", + " y : numpy.array \n", + " Clean time series of shape (n,). \n", + " h: int\n", + " Forecast horizon.\n", + " X : array-like\n", + " Optional insample exogenous of shape (t, n_x). \n", + " X_future : array-like\n", + " Optional exogenous of shape (h, n_x). \n", + " level : List[float]\n", + " Confidence levels (0-100) for prediction intervals.\n", + " fitted : bool\n", + " Whether or not to return insample predictions.\n", + "\n", + " Returns\n", + " -------\n", + " forecasts : dict\n", + " Dictionary with entries `mean` for point predictions and `level_*` for probabilistic predictions.\n", + " \"\"\"\n", + " res = self.forecast(y=y, h=h, X=X, X_future=X_future, level=level, fitted=fitted)\n", " return res" ] }, @@ -5472,6 +5506,23 @@ "_plot_insample_pi(fcst_naive)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#| hide\n", + "# Unit test forward:=forecast\n", + "naive = Naive()\n", + "fcst_naive = naive.forward(ap,12,None,None,(80,95), True)\n", + "np.testing.assert_almost_equal(\n", + " fcst_naive['lo-80'],\n", + " np.array([388.7984, 370.9037, 357.1726, 345.5967, 335.3982, 326.1781, 317.6992, 309.8073, 302.3951, 295.3845, 288.7164, 282.3452]),\n", + " decimal=4\n", + ") # this is almost equal since Hyndman's forecasts are rounded up to 4 decimals" + ] + }, { "cell_type": "code", "execution_count": null, @@ -10880,6 +10931,40 @@ " if fitted:\n", " res[f'fitted-lo-{lv}'] = fitted_vals\n", " res[f'fitted-hi-{lv}'] = fitted_vals\n", + " return res\n", + " \n", + " def forward(\n", + " self,\n", + " y: np.ndarray,\n", + " h: int,\n", + " X: Optional[np.ndarray] = None,\n", + " X_future: Optional[np.ndarray] = None,\n", + " level: Optional[List[int]] = None,\n", + " fitted: bool = False,\n", + " ):\n", + " \"\"\"Apply Constant model predictions to a new/updated time series.\n", + "\n", + " Parameters\n", + " ----------\n", + " y : numpy.array \n", + " Clean time series of shape (n, ). \n", + " h : int \n", + " Forecast horizon.\n", + " X : array-like \n", + " Optional insample exogenous of shape (t, n_x). \n", + " X_future : array-like \n", + " Optional exogenous of shape (h, n_x). \n", + " level : List[float]\n", + " Confidence levels for prediction intervals.\n", + " fitted : bool \n", + " Whether or not returns insample predictions.\n", + "\n", + " Returns\n", + " -------\n", + " forecasts : dict \n", + " Dictionary with entries `constant` for point predictions and `level_*` for probabilistic predictions.\n", + " \"\"\"\n", + " res = self.forecast(y=y, h=h, X=X, X_future=X_future, level=level, fitted=fitted)\n", " return res" ] }, @@ -10904,6 +10989,16 @@ "constant_model.forecast(ap, 12, level=[90, 80])" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#| hide\n", + "constant_model.forward(ap, 12, level=[90, 80])" + ] + }, { "cell_type": "code", "execution_count": null, @@ -10967,6 +11062,15 @@ "show_doc(ConstantModel.predict_in_sample, title_level=3)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_doc(ConstantModel.forward, title_level=3)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -11035,6 +11139,16 @@ "zero_model.forecast(ap, 12, level=[90, 80])" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#| hide\n", + "zero_model.forward(ap, 12, level=[90, 80])" + ] + }, { "cell_type": "code", "execution_count": null, @@ -11098,6 +11212,15 @@ "show_doc(ZeroModel.predict_in_sample, title_level=3, name='ZeroModel.predict_in_sample')" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "show_doc(ZeroModel.forward, title_level=3, name='ZeroModel.forward')" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/statsforecast/_modidx.py b/statsforecast/_modidx.py index 30f335f72..91c4471ea 100644 --- a/statsforecast/_modidx.py +++ b/statsforecast/_modidx.py @@ -371,6 +371,8 @@ 'statsforecast/models.py'), 'statsforecast.models.ConstantModel.forecast': ( 'src/core/models.html#constantmodel.forecast', 'statsforecast/models.py'), + 'statsforecast.models.ConstantModel.forward': ( 'src/core/models.html#constantmodel.forward', + 'statsforecast/models.py'), 'statsforecast.models.ConstantModel.predict': ( 'src/core/models.html#constantmodel.predict', 'statsforecast/models.py'), 'statsforecast.models.ConstantModel.predict_in_sample': ( 'src/core/models.html#constantmodel.predict_in_sample', @@ -498,6 +500,8 @@ 'statsforecast.models.Naive.fit': ('src/core/models.html#naive.fit', 'statsforecast/models.py'), 'statsforecast.models.Naive.forecast': ( 'src/core/models.html#naive.forecast', 'statsforecast/models.py'), + 'statsforecast.models.Naive.forward': ( 'src/core/models.html#naive.forward', + 'statsforecast/models.py'), 'statsforecast.models.Naive.predict': ( 'src/core/models.html#naive.predict', 'statsforecast/models.py'), 'statsforecast.models.Naive.predict_in_sample': ( 'src/core/models.html#naive.predict_in_sample', diff --git a/statsforecast/core.py b/statsforecast/core.py index 44f1e70d7..1b9829190 100644 --- a/statsforecast/core.py +++ b/statsforecast/core.py @@ -61,14 +61,21 @@ def __eq__(self, other): self.indptr, other.indptr ) - def fit(self, models): + def fit(self, models, fallback_model=None): fm = np.full((self.n_groups, len(models)), np.nan, dtype=object) for i, grp in enumerate(self): y = grp[:, 0] if grp.ndim == 2 else grp X = grp[:, 1:] if (grp.ndim == 2 and grp.shape[1] > 1) else None for i_model, model in enumerate(models): - new_model = model.new() - fm[i, i_model] = new_model.fit(y=y, X=X) + try: + new_model = model.new() + fm[i, i_model] = new_model.fit(y=y, X=X) + except Exception as error: + if fallback_model is not None: + new_fallback_model = fallback_model.new() + fm[i, i_model] = new_fallback_model.fit(y=y, X=X) + else: + raise error return fm def _get_cols(self, models, attr, h, X, level=tuple()): @@ -331,11 +338,15 @@ def cross_validation( else: if i_window == 0: # for the first window we have to fit each model - model = model.fit(y=y_train, X=X_train) - if fallback_model is not None: - fallback_model = fallback_model.fit( - y=y_train, X=X_train - ) + try: + model = model.fit(y=y_train, X=X_train) + except Exception as error: + if fallback_model is not None: + fallback_model = fallback_model.fit( + y=y_train, X=X_train + ) + else: + raise error try: res_i = model.forward( h=h, @@ -401,7 +412,7 @@ def split_fm(self, fm, n_chunks): if x.size ] -# %% ../nbs/src/core/core.ipynb 22 +# %% ../nbs/src/core/core.ipynb 23 class DataFrameProcessing: """ A utility to process Pandas or Polars dataframes for time series forecasting. @@ -442,6 +453,7 @@ def __init__( sort_dataframe: bool, validate: Optional[bool] = True, ): + self.dataframe = dataframe self.sort_dataframe = sort_dataframe self.validate = validate @@ -692,7 +704,7 @@ def _check_datetime(self, arr: np.ndarray) -> Union[pd.DatetimeIndex, np.ndarray raise Exception(msg) from e return arr -# %% ../nbs/src/core/core.ipynb 25 +# %% ../nbs/src/core/core.ipynb 26 def _cv_dates(last_dates, freq, h, test_size, step_size=1): # assuming step_size = 1 if (test_size - h) % step_size: @@ -731,7 +743,7 @@ def _cv_dates(last_dates, freq, h, test_size, step_size=1): dates = dates.reset_index(drop=True) return dates -# %% ../nbs/src/core/core.ipynb 29 +# %% ../nbs/src/core/core.ipynb 30 def _get_n_jobs(n_groups, n_jobs): if n_jobs == -1 or (n_jobs is None): actual_n_jobs = cpu_count() @@ -739,7 +751,7 @@ def _get_n_jobs(n_groups, n_jobs): actual_n_jobs = n_jobs return min(n_groups, actual_n_jobs) -# %% ../nbs/src/core/core.ipynb 32 +# %% ../nbs/src/core/core.ipynb 33 def _parse_ds_type(df): dt_col = df["ds"] dt_check = pd.api.types.is_datetime64_any_dtype(dt_col) @@ -757,7 +769,7 @@ def _parse_ds_type(df): raise Exception(msg) from e return df -# %% ../nbs/src/core/core.ipynb 33 +# %% ../nbs/src/core/core.ipynb 34 class _StatsForecast: def __init__( self, @@ -871,7 +883,9 @@ def fit( self._set_prediction_intervals(prediction_intervals=prediction_intervals) self._prepare_fit(df, sort_df) if self.n_jobs == 1: - self.fitted_ = self.ga.fit(models=self.models) + self.fitted_ = self.ga.fit( + models=self.models, fallback_model=self.fallback_model + ) else: self.fitted_ = self._fit_parallel() return self @@ -1300,7 +1314,9 @@ def _fit_parallel(self): with Pool(self.n_jobs, **pool_kwargs) as executor: futures = [] for ga in gas: - future = executor.apply_async(ga.fit, (self.models,)) + future = executor.apply_async( + ga.fit, (self.models, self.fallback_model) + ) futures.append(future) fm = np.vstack([f.get() for f in futures]) return fm @@ -1533,7 +1549,7 @@ def plot( def __repr__(self): return f"StatsForecast(models=[{','.join(map(repr, self.models))}])" -# %% ../nbs/src/core/core.ipynb 34 +# %% ../nbs/src/core/core.ipynb 35 class ParallelBackend: def forecast(self, df, models, freq, fallback_model=None, **kwargs: Any) -> Any: model = _StatsForecast( @@ -1554,7 +1570,7 @@ def cross_validation( def make_backend(obj: Any, *args: Any, **kwargs: Any) -> ParallelBackend: return ParallelBackend() -# %% ../nbs/src/core/core.ipynb 35 +# %% ../nbs/src/core/core.ipynb 36 class StatsForecast(_StatsForecast): """Train statistical models. diff --git a/statsforecast/models.py b/statsforecast/models.py index 479757de2..8d7a81037 100644 --- a/statsforecast/models.py +++ b/statsforecast/models.py @@ -2550,6 +2550,7 @@ def __init__( alias: str = "Holt", prediction_intervals: Optional[ConformalIntervals] = None, ): + self.season_length = season_length self.error_type = error_type self.alias = alias @@ -2748,6 +2749,7 @@ def forecast( level: Optional[List[int]] = None, fitted: bool = False, ): + """Memory Efficient HistoricAverage predictions. This method avoids memory burden due from object storage. @@ -2969,7 +2971,43 @@ def forecast( res = _add_fitted_pi(res=res, se=sigma, level=level) return res -# %% ../nbs/src/core/models.ipynb 217 + def forward( + self, + y: np.ndarray, + h: int, + X: Optional[np.ndarray] = None, + X_future: Optional[np.ndarray] = None, + level: Optional[List[int]] = None, + fitted: bool = False, + ): + """Apply fitted model to an new/updated series. + + Parameters + ---------- + y : numpy.array + Clean time series of shape (n,). + h: int + Forecast horizon. + X : array-like + Optional insample exogenous of shape (t, n_x). + X_future : array-like + Optional exogenous of shape (h, n_x). + level : List[float] + Confidence levels (0-100) for prediction intervals. + fitted : bool + Whether or not to return insample predictions. + + Returns + ------- + forecasts : dict + Dictionary with entries `mean` for point predictions and `level_*` for probabilistic predictions. + """ + res = self.forecast( + y=y, h=h, X=X, X_future=X_future, level=level, fitted=fitted + ) + return res + +# %% ../nbs/src/core/models.ipynb 218 @njit(nogil=NOGIL, cache=CACHE) def _random_walk_with_drift( y: np.ndarray, # time series @@ -2989,7 +3027,7 @@ def _random_walk_with_drift( fcst["fitted"] = fitted_vals return fcst -# %% ../nbs/src/core/models.ipynb 218 +# %% ../nbs/src/core/models.ipynb 219 class RandomWalkWithDrift(_TS): def __init__( self, @@ -3166,7 +3204,7 @@ def forecast( return res -# %% ../nbs/src/core/models.ipynb 232 +# %% ../nbs/src/core/models.ipynb 233 class SeasonalNaive(_TS): def __init__( self, @@ -3355,7 +3393,7 @@ def forecast( return res -# %% ../nbs/src/core/models.ipynb 246 +# %% ../nbs/src/core/models.ipynb 247 @njit(nogil=NOGIL, cache=CACHE) def _window_average( y: np.ndarray, # time series @@ -3371,7 +3409,7 @@ def _window_average( mean = _repeat_val(val=wavg, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 247 +# %% ../nbs/src/core/models.ipynb 248 class WindowAverage(_TS): def __init__( self, @@ -3529,7 +3567,7 @@ def forecast( raise Exception("You must pass `prediction_intervals` to " "compute them.") return res -# %% ../nbs/src/core/models.ipynb 258 +# %% ../nbs/src/core/models.ipynb 259 @njit(nogil=NOGIL, cache=CACHE) def _seasonal_window_average( y: np.ndarray, @@ -3550,7 +3588,7 @@ def _seasonal_window_average( out = _repeat_val_seas(season_vals=season_avgs, h=h, season_length=season_length) return {"mean": out} -# %% ../nbs/src/core/models.ipynb 259 +# %% ../nbs/src/core/models.ipynb 260 class SeasonalWindowAverage(_TS): def __init__( self, @@ -3724,7 +3762,7 @@ def forecast( raise Exception("You must pass `prediction_intervals` to compute them.") return res -# %% ../nbs/src/core/models.ipynb 271 +# %% ../nbs/src/core/models.ipynb 272 def _adida( y: np.ndarray, # time series h: int, # forecasting horizon @@ -3745,7 +3783,7 @@ def _adida( mean = _repeat_val(val=forecast, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 272 +# %% ../nbs/src/core/models.ipynb 273 class ADIDA(_TS): def __init__( self, @@ -3907,7 +3945,7 @@ def forecast( ) return res -# %% ../nbs/src/core/models.ipynb 284 +# %% ../nbs/src/core/models.ipynb 285 @njit(nogil=NOGIL, cache=CACHE) def _croston_classic( y: np.ndarray, # time series @@ -3929,7 +3967,7 @@ def _croston_classic( mean = _repeat_val(val=mean, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 285 +# %% ../nbs/src/core/models.ipynb 286 class CrostonClassic(_TS): def __init__( self, @@ -4086,7 +4124,7 @@ def forecast( ) return res -# %% ../nbs/src/core/models.ipynb 296 +# %% ../nbs/src/core/models.ipynb 297 def _croston_optimized( y: np.ndarray, # time series h: int, # forecasting horizon @@ -4107,7 +4145,7 @@ def _croston_optimized( mean = _repeat_val(val=mean, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 297 +# %% ../nbs/src/core/models.ipynb 298 class CrostonOptimized(_TS): def __init__( self, @@ -4260,7 +4298,7 @@ def forecast( raise Exception("You must pass `prediction_intervals` to compute them.") return res -# %% ../nbs/src/core/models.ipynb 308 +# %% ../nbs/src/core/models.ipynb 309 @njit(nogil=NOGIL, cache=CACHE) def _croston_sba( y: np.ndarray, # time series @@ -4273,7 +4311,7 @@ def _croston_sba( mean["mean"] *= 0.95 return mean -# %% ../nbs/src/core/models.ipynb 309 +# %% ../nbs/src/core/models.ipynb 310 class CrostonSBA(_TS): def __init__( self, @@ -4432,7 +4470,7 @@ def forecast( ) return res -# %% ../nbs/src/core/models.ipynb 320 +# %% ../nbs/src/core/models.ipynb 321 def _imapa( y: np.ndarray, # time series h: int, # forecasting horizon @@ -4456,7 +4494,7 @@ def _imapa( mean = _repeat_val(val=forecast, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 321 +# %% ../nbs/src/core/models.ipynb 322 class IMAPA(_TS): def __init__( self, @@ -4612,7 +4650,7 @@ def forecast( ) return res -# %% ../nbs/src/core/models.ipynb 332 +# %% ../nbs/src/core/models.ipynb 333 @njit(nogil=NOGIL, cache=CACHE) def _tsb( y: np.ndarray, # time series @@ -4633,7 +4671,7 @@ def _tsb( mean = _repeat_val(val=forecast, h=h) return {"mean": mean} -# %% ../nbs/src/core/models.ipynb 333 +# %% ../nbs/src/core/models.ipynb 334 class TSB(_TS): def __init__( self, @@ -4800,7 +4838,7 @@ def forecast( raise Exception("You must pass `prediction_intervals` to compute them.") return res -# %% ../nbs/src/core/models.ipynb 345 +# %% ../nbs/src/core/models.ipynb 346 def _predict_mstl_seas(mstl_ob, h, season_length): seasoncolumns = mstl_ob.filter(regex="seasonal*").columns nseasons = len(seasoncolumns) @@ -4817,7 +4855,7 @@ def _predict_mstl_seas(mstl_ob, h, season_length): lastseas = seascomp.sum(axis=1) return lastseas -# %% ../nbs/src/core/models.ipynb 346 +# %% ../nbs/src/core/models.ipynb 347 class MSTL(_TS): """MSTL model. @@ -4853,6 +4891,7 @@ def __init__( alias: str = "MSTL", prediction_intervals: Optional[ConformalIntervals] = None, ): + # check ETS model doesnt have seasonality if repr(trend_forecaster) == "AutoETS": if trend_forecaster.model[2] != "N": @@ -5091,7 +5130,7 @@ def forward( } return res -# %% ../nbs/src/core/models.ipynb 362 +# %% ../nbs/src/core/models.ipynb 363 class Theta(AutoTheta): """Standard Theta Method. @@ -5127,7 +5166,7 @@ def __init__( prediction_intervals=prediction_intervals, ) -# %% ../nbs/src/core/models.ipynb 375 +# %% ../nbs/src/core/models.ipynb 376 class OptimizedTheta(AutoTheta): """Optimized Theta Method. @@ -5163,7 +5202,7 @@ def __init__( prediction_intervals=prediction_intervals, ) -# %% ../nbs/src/core/models.ipynb 388 +# %% ../nbs/src/core/models.ipynb 389 class DynamicTheta(AutoTheta): """Dynamic Standard Theta Method. @@ -5199,7 +5238,7 @@ def __init__( prediction_intervals=prediction_intervals, ) -# %% ../nbs/src/core/models.ipynb 401 +# %% ../nbs/src/core/models.ipynb 402 class DynamicOptimizedTheta(AutoTheta): """Dynamic Optimized Theta Method. @@ -5235,7 +5274,7 @@ def __init__( prediction_intervals=prediction_intervals, ) -# %% ../nbs/src/core/models.ipynb 415 +# %% ../nbs/src/core/models.ipynb 416 class GARCH(_TS): """Generalized Autoregressive Conditional Heteroskedasticity (GARCH) model. @@ -5429,7 +5468,7 @@ def forecast( res = _add_fitted_pi(res=res, se=se, level=level) return res -# %% ../nbs/src/core/models.ipynb 428 +# %% ../nbs/src/core/models.ipynb 429 class ARCH(GARCH): """Autoregressive Conditional Heteroskedasticity (ARCH) model. @@ -5475,7 +5514,7 @@ def __init__( def __repr__(self): return self.alias -# %% ../nbs/src/core/models.ipynb 439 +# %% ../nbs/src/core/models.ipynb 440 class ConstantModel(_TS): def __init__(self, constant: float, alias: str = "ConstantModel"): """Constant Model. @@ -5624,7 +5663,43 @@ def forecast( res[f"fitted-hi-{lv}"] = fitted_vals return res -# %% ../nbs/src/core/models.ipynb 450 + def forward( + self, + y: np.ndarray, + h: int, + X: Optional[np.ndarray] = None, + X_future: Optional[np.ndarray] = None, + level: Optional[List[int]] = None, + fitted: bool = False, + ): + """Apply Constant model predictions to a new/updated time series. + + Parameters + ---------- + y : numpy.array + Clean time series of shape (n, ). + h : int + Forecast horizon. + X : array-like + Optional insample exogenous of shape (t, n_x). + X_future : array-like + Optional exogenous of shape (h, n_x). + level : List[float] + Confidence levels for prediction intervals. + fitted : bool + Whether or not returns insample predictions. + + Returns + ------- + forecasts : dict + Dictionary with entries `constant` for point predictions and `level_*` for probabilistic predictions. + """ + res = self.forecast( + y=y, h=h, X=X, X_future=X_future, level=level, fitted=fitted + ) + return res + +# %% ../nbs/src/core/models.ipynb 453 class ZeroModel(ConstantModel): def __init__(self, alias: str = "ZeroModel"): """Returns Zero forecasts. @@ -5638,7 +5713,7 @@ def __init__(self, alias: str = "ZeroModel"): """ super().__init__(constant=0, alias=alias) -# %% ../nbs/src/core/models.ipynb 461 +# %% ../nbs/src/core/models.ipynb 466 class NaNModel(ConstantModel): def __init__(self, alias: str = "NaNModel"): """NaN Model. From 0d05a56452d6bffca319f8be933954318b6303c3 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Mon, 16 Oct 2023 15:11:43 -0700 Subject: [PATCH 08/22] Fix formatting issues in docs (#662) --- .gitignore | 2 +- README.md | 2 +- nbs/_quarto.yml | 4 +- nbs/docs/contribute/issues.md | 21 ++- nbs/docs/contribute/step-by-step.md | 50 +++---- .../how-to-guides/AmazonStatsForecast.ipynb | 2 +- nbs/docs/how-to-guides/migrating_R.qmd | 4 +- nbs/docs/models/ARCH.ipynb | 4 +- nbs/docs/models/ARIMA.ipynb | 4 +- nbs/docs/models/AutoCES.ipynb | 4 +- nbs/docs/models/AutoETS.ipynb | 2 +- nbs/docs/models/AutoTheta.ipynb | 6 +- nbs/docs/models/Holt.ipynb | 2 +- nbs/docs/models/OptimizedTheta.ipynb | 6 +- .../models/SeasonalExponentialSmoothing.ipynb | 4 +- nbs/docs/tutorials/IntermittentData.ipynb | 4 +- nbs/src/adapters.prophet.ipynb | 8 +- nbs/src/core/distributed.fugue.ipynb | 6 +- nbs/src/core/models.ipynb | 124 +++++++++++------- nbs/src/utils.ipynb | 6 +- nbs/styles.css | 69 ++++++---- settings.ini | 2 +- 22 files changed, 205 insertions(+), 131 deletions(-) diff --git a/.gitignore b/.gitignore index 06d74c19e..92ef65b65 100644 --- a/.gitignore +++ b/.gitignore @@ -16,10 +16,10 @@ dist tmp _docs/ _proc/ -sidebar.yml .DS_Store .gitattributes .gitconfig nbs/.last_checked .venv .idea +.luarc.json diff --git a/README.md b/README.md index 72627afbe..d6aefd25f 100644 --- a/README.md +++ b/README.md @@ -259,4 +259,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file diff --git a/nbs/_quarto.yml b/nbs/_quarto.yml index f708a5614..60097036f 100644 --- a/nbs/_quarto.yml +++ b/nbs/_quarto.yml @@ -10,7 +10,7 @@ format: toc: true website: - twitter-card: + twitter-card: image: "https://farm6.staticflickr.com/5510/14338202952_93595258ff_z.jpg" site: "@Nixtlainc" open-graph: @@ -35,7 +35,7 @@ website: href: https://github.com/nixtla/neuralforecast - text: "HierarchicalForecast 👑" href: https://github.com/nixtla/hierarchicalforecast - + - text: "Help" menu: - text: "Report an Issue" diff --git a/nbs/docs/contribute/issues.md b/nbs/docs/contribute/issues.md index 65b79b608..d0f78b248 100644 --- a/nbs/docs/contribute/issues.md +++ b/nbs/docs/contribute/issues.md @@ -26,7 +26,9 @@ The form to report the bug will appear. 5. You can also add links, references, logs, screenshots, and so on. - Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + +Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + Thank you for your contribution! Your report aids in refining Nixtla for current and future users. @@ -43,7 +45,9 @@ The feature request form will appear. 4. Additional references, links, logs, and screenshots are welcome! - Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + +Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + Thank you for your feature request! It will help us enhance Nixtla for all users. @@ -59,7 +63,9 @@ A form for suggesting improvements will appear. 3. Any additional references, links, logs, screenshots are appreciated! - Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + +Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + Thank you for your valuable suggestions! Your input helps us refine Nixtla's documentation. @@ -80,7 +86,9 @@ A form for your proposal will appear. 4. Any additional references, links, logs, screenshots, and so on, are welcome! - Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + +Please ensure that your contributions abide by the [contributing guidelines](https://github.com/nixtla/nixtla/blob/staging/CONTRIBUTING.md) and [code of conduct](https://github.com/nixtla/nixtla/blob/staging/CODE_OF_CONDUCT.md). + Thank you for your proposal! Your suggestion helps us extend the capabilities of Nixtla. @@ -92,6 +100,7 @@ Thank you for your proposal! Your suggestion helps us extend the capabilities of - Please be ready to respond to our feedback or questions regarding your issue. - This document is based on the documentation from [MindsDB](https://github.com/mindsdb/mindsdb) - +This document is based on the documentation from [MindsDB](https://github.com/mindsdb/mindsdb) + + diff --git a/nbs/docs/contribute/step-by-step.md b/nbs/docs/contribute/step-by-step.md index 18dc705a2..49848ff9d 100644 --- a/nbs/docs/contribute/step-by-step.md +++ b/nbs/docs/contribute/step-by-step.md @@ -120,11 +120,11 @@ You can find a detailed step by step buide with screen-shots below. ### 1. Create a fork of the mlforecast repo The first thing you need to do is create a fork of the GitHub repository to your own account: -image +image Your fork on your account will look like this: -image +image In that repository, you can make your changes and then request to have them added to the main repo. @@ -134,99 +134,99 @@ In this tutorial, we are using Mac (also compatible with other Linux distributio Once the repository is created, you need to clone it to your own computer. Simply copy the repository URL from GitHub as shown below: -image +image Then open Visual Studio Code, click on "Clone Git Repository," and paste the line you just copied into the top part of the window, as shown below: -image +image Select the folder where you want to copy the repository: -image +image And choose to open the cloned repository: -image +image You will end up with something like this: -image +image ### 3. Create the Conda environment Open a terminal within Visual Studio Code, as shown in the image: -image +image You can use conda but we highly recommend using Mamba to speed up the creation of the Conda environment. To install it, simply use `conda install mamba -c conda-forge` in the terminal you just opened: -image +image Create an empty environment named `mlforecast` with the following command: `mamba create -n mlforecast python=3.10`: -image +image Activate the newly created environment using `conda activate mlforecast`: -image +image Install the libraries within the environment file `environment.yml` using `mamba env update -f environment.yml`: -image +image Now install the library to make interactive changes and other additional dependencies using `pip install -e ".[dev]"`: -image +image ### 4. Make the changes you want. In this section, we assume that we want to increase the default number of windows used to create prediction intervals from 2 to 3. The first thing we need to do is create a specific branch for that change using `git checkout -b [new_branch]` like this: -image +image Once created, open the notebook you want to modify. In this case, it's `nbs/utils.ipynb`, which contains the metadata for the prediction intervals. After opening it, click on the environment you want to use (top right) and select the `mlforecast` environment: -image +image Next, execute the notebook and make the necessary changes. In this case, we want to modify the `PredictionIntervals` class: -image +image We will change the default value of `n_window` from 2 to 3: -image +image Once you have made the change and performed any necessary validations, it's time to convert the notebook to Python modules. To do this, simply use `nbdev_export` in the terminal. You will see that the `mlforecast/utils.py` file has been modified (the changes from `nbs/utils.ipynb` are reflected in that module). Before committing the changes, we need to clean the notebooks using the command `./action_files/clean_nbs` and verify that the linters pass using `./action_files/lint`: -image +image Once you have done the above, simply add the changes using `git add nbs/utils.ipynb mlforecast/utils.py`: -image +image Create a descriptive commit message for the changes using `git commit -m "[description of changes]"`: -image +image Finally, push your changes using `git push`: -image +image ### 5. Create a pull request. In GitHub, open your repository that contains your fork of the original repo. Once inside, you will see the changes you just pushed. Click on "Compare and pull request": -image +image Include an appropriate title for your pull request and fill in the necessary information. Once you're done, click on "Create pull request". -image +image Finally, you will see something like this: -image +image ## Notes -- This file was generated using [this file](https://github.com/Nixtla/nixtla-commons/blob/main/docs/contribute/step-by-step.md). Please change that file if you want to enhance the document. +- This file was generated using [this file](https://github.com/Nixtla/nixtla-commons/blob/main/docs/contribute/step-by-step.md). Please change that file if you want to enhance the document. \ No newline at end of file diff --git a/nbs/docs/how-to-guides/AmazonStatsForecast.ipynb b/nbs/docs/how-to-guides/AmazonStatsForecast.ipynb index 6a2a6e536..b06d24aa5 100644 --- a/nbs/docs/how-to-guides/AmazonStatsForecast.ipynb +++ b/nbs/docs/how-to-guides/AmazonStatsForecast.ipynb @@ -611,7 +611,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"image\"" + "\"image\"" ] } ], diff --git a/nbs/docs/how-to-guides/migrating_R.qmd b/nbs/docs/how-to-guides/migrating_R.qmd index 9a0c50bfb..352be78f5 100644 --- a/nbs/docs/how-to-guides/migrating_R.qmd +++ b/nbs/docs/how-to-guides/migrating_R.qmd @@ -1,4 +1,6 @@ -# Migrating from R +--- +title: Migrating from R +--- ## 🚧 We are working on this site. This site is currently in development. If you are particularly interested in this section, please open a GitHub Issue, and we will prioritize it. \ No newline at end of file diff --git a/nbs/docs/models/ARCH.ipynb b/nbs/docs/models/ARCH.ipynb index 090c71f23..0cd6018f8 100644 --- a/nbs/docs/models/ARCH.ipynb +++ b/nbs/docs/models/ARCH.ipynb @@ -213,7 +213,9 @@ "source": [ "## Loading libraries and data
    \n", "\n", - ":::{.callout-tip} Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb). :::\n", + ":::{.callout-tip}\n", + "Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb).\n", + ":::\n", "\n", "Next, we import plotting libraries and configure the plotting style." ] diff --git a/nbs/docs/models/ARIMA.ipynb b/nbs/docs/models/ARIMA.ipynb index f4854579e..91066e627 100644 --- a/nbs/docs/models/ARIMA.ipynb +++ b/nbs/docs/models/ARIMA.ipynb @@ -296,7 +296,9 @@ "source": [ "## Loading libraries and data \n", "\n", - ":::{.callout-tip} Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb). :::\n", + ":::{.callout-tip}\n", + "Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb). \n", + ":::\n", "\n", "Next, we import plotting libraries and configure the plotting style." ] diff --git a/nbs/docs/models/AutoCES.ipynb b/nbs/docs/models/AutoCES.ipynb index 4c36482af..3d1b8e5e3 100644 --- a/nbs/docs/models/AutoCES.ipynb +++ b/nbs/docs/models/AutoCES.ipynb @@ -197,7 +197,9 @@ "source": [ "## Loading libraries and data \n", "\n", - ":::{.callout-tip} Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb). :::\n", + ":::{.callout-tip}\n", + "Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb).\n", + ":::\n", "\n", "Next, we import plotting libraries and configure the plotting style." ] diff --git a/nbs/docs/models/AutoETS.ipynb b/nbs/docs/models/AutoETS.ipynb index 60b76ec3a..c42e4dd95 100644 --- a/nbs/docs/models/AutoETS.ipynb +++ b/nbs/docs/models/AutoETS.ipynb @@ -111,7 +111,7 @@ "\n", "$$s_{t} = \\gamma^*(1-\\alpha) (y_{t}-\\ell_{t-1}-b_{t-1})+ [1-\\gamma^*(1-\\alpha)]s_{t-m},$$\n", "\n", - "Thus, we obtain identical forecasts using this approach by replacing $\\gamma$ in (1c) with $\\gamma^{*} (1-\\alpha) $. The modification given in (1c) was proposed by Ord et al. (1997) to make the state space formulation simpler. It is equivalent to Archibald’s (1990) variation of the Holt-Winters’ method." + "Thus, we obtain identical forecasts using this approach by replacing $\\gamma$ in (1c) with $\\gamma^{*} (1-\\alpha)$. The modification given in (1c) was proposed by Ord et al. (1997) to make the state space formulation simpler. It is equivalent to Archibald’s (1990) variation of the Holt-Winters’ method." ] }, { diff --git a/nbs/docs/models/AutoTheta.ipynb b/nbs/docs/models/AutoTheta.ipynb index b7a66624d..e372091c3 100644 --- a/nbs/docs/models/AutoTheta.ipynb +++ b/nbs/docs/models/AutoTheta.ipynb @@ -148,13 +148,13 @@ "\n", "$$\\hat Y_{n+h|n} = (1-\\frac{1}{\\theta}) [\\text{A}_n+\\text{B}_n (n+h)]+ \\frac{1}{\\theta} \\tilde {\\text{Z}}_{n+h|n} (\\theta) \\tag 6$$\n", "\n", - "where $\\tilde {\\text{Z}}_{n+h|n} (\\theta)=\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\alpha \\sum_{i=0}^{n-1}(1-\\alpha)^i \\text{Z}_{n-i}(\\theta)+(1-\\alpha)^n \\ell_{0}^{*} $ is the extrapolation of $\\text{Z}_t(\\theta)$ by an SES model with $\\ell_{0}^{*} \\in \\mathbb{R}$ as the initial level parameter and $\\alpha \\in (0,1)$ as the smoothing parameter. Note that for $\\theta=2$ Eq. (6) corresponds to Step 4 of the STheta algorithm. After some algebra, we can write\n", + "where $\\tilde {\\text{Z}}_{n+h|n} (\\theta)=\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\alpha \\sum_{i=0}^{n-1}(1-\\alpha)^i \\text{Z}_{n-i}(\\theta)+(1-\\alpha)^n \\ell_{0}^{*}$ is the extrapolation of $\\text{Z}_t(\\theta)$ by an SES model with $\\ell_{0}^{*} \\in \\mathbb{R}$ as the initial level parameter and $\\alpha \\in (0,1)$ as the smoothing parameter. Note that for $\\theta=2$ Eq. (6) corresponds to Step 4 of the STheta algorithm. After some algebra, we can write\n", "\n", "$$\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\theta \\ell{n}+(1-\\theta) \\{ \\text{A}_n [1-(1-\\alpha)^n] + \\text{B}_n [n+(1-\\frac{1}{\\alpha}) [1-(1-\\alpha)^n] ] \\} \\tag 7$$\n", "\n", - "where $\\ell_{t}=\\alpha Y_t +(1-\\alpha) \\ell_{t-1} $ for $t=1, \\cdots, n$ and $\\ell_{0}=\\ell_{0}^{*}/\\theta$.\n", + "where $\\ell_{t}=\\alpha Y_t +(1-\\alpha) \\ell_{t-1}$ for $t=1, \\cdots, n$ and $\\ell_{0}=\\ell_{0}^{*}/\\theta$.\n", "\n", - "In the light of Eqs. (6), (7), we suggest four stochastic approaches. These approaches differ due to the parameter $\\theta$ which may be either fixed at two or optimised, and the coefficients $\\text{A}_n$ and $\\text{B}_n$, which can be either fixed or dynamic functions. To formulate the state space models, it is helpful to adopt $\\mu_{t}$ as the one-step-ahead forecast at origin $t-1$ and $\\varepsilon_{t} $ as the respective additive error, i.e., $\\varepsilon_{t}=Y_t - \\mu_{t} $ if $\\mu_{t}= \\hat Y_{t|t-1} $. We assume $\\{ \\varepsilon_{t} \\} $ to be a Gaussian white noise process with mean zero and variance $\\sigma^2$. " + "In the light of Eqs. (6), (7), we suggest four stochastic approaches. These approaches differ due to the parameter $\\theta$ which may be either fixed at two or optimised, and the coefficients $\\text{A}_n$ and $\\text{B}_n$, which can be either fixed or dynamic functions. To formulate the state space models, it is helpful to adopt $\\mu_{t}$ as the one-step-ahead forecast at origin $t-1$ and $\\varepsilon_{t}$ as the respective additive error, i.e., $\\varepsilon_{t}=Y_t - \\mu_{t}$ if $\\mu_{t}= \\hat Y_{t|t-1}$. We assume $\\{ \\varepsilon_{t} \\}$ to be a Gaussian white noise process with mean zero and variance $\\sigma^2$. " ] }, { diff --git a/nbs/docs/models/Holt.ipynb b/nbs/docs/models/Holt.ipynb index 065900df9..2705fc903 100644 --- a/nbs/docs/models/Holt.ipynb +++ b/nbs/docs/models/Holt.ipynb @@ -112,7 +112,7 @@ "\n", "For each method there exist two models: one with additive errors and one with multiplicative errors. The point forecasts produced by the models are identical if they use the same smoothing parameter values. They will, however, generate different prediction intervals.\n", "\n", - "To distinguish between a model with additive errors and one with multiplicative errors. We label each state space model as ETS( .,.,.) for (Error, Trend, Seasonal). This label can also be thought of as ExponenTial Smoothing. Using the same notation as in Table 7.5, the possibilities for each component are: Error ={A,M } , Trend ={ N,A,A d} and Seasonal ={ N,A,M }\n", + "To distinguish between a model with additive errors and one with multiplicative errors. We label each state space model as ETS( .,.,.) for (Error, Trend, Seasonal). This label can also be thought of as ExponenTial Smoothing. Using the same notation as in Table 7.5, the possibilities for each component are: $Error=\\{A,M\\}$, $Trend=\\{N,A,A_d\\}$ and $Seasonal=\\{N,A,M\\}$\n", "\n", "For our case, the linear Holt model with a trend, we are going to see two cases, both for the additive and the multiplicative\n", "\n", diff --git a/nbs/docs/models/OptimizedTheta.ipynb b/nbs/docs/models/OptimizedTheta.ipynb index dc4dd7c6c..34e0434d6 100644 --- a/nbs/docs/models/OptimizedTheta.ipynb +++ b/nbs/docs/models/OptimizedTheta.ipynb @@ -127,13 +127,13 @@ "\n", "$$\\hat Y_{n+h|n} = (1-\\frac{1}{\\theta}) [\\text{A}_n+\\text{B}_n (n+h)]+ \\frac{1}{\\theta} \\tilde {\\text{Z}}_{n+h|n} (\\theta) \\tag 3$$\n", "\n", - "where $\\tilde {\\text{Z}}_{n+h|n} (\\theta)=\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\alpha \\sum_{i=0}^{n-1}(1-\\alpha)^i \\text{Z}_{n-i}(\\theta)+(1-\\alpha)^n \\ell_{0}^{*} $ is the extrapolation of $\\text{Z}_t(\\theta)$ by an SES model with $\\ell_{0}^{*} \\in \\mathbb{R}$ as the initial level parameter and $\\alpha \\in (0,1)$ as the smoothing parameter. Note that for $\\theta=2$ Eq. (3) corresponds to Step 4 of the STheta algorithm. After some algebra, we can write\n", + "where $\\tilde {\\text{Z}}_{n+h|n} (\\theta)=\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\alpha \\sum_{i=0}^{n-1}(1-\\alpha)^i \\text{Z}_{n-i}(\\theta)+(1-\\alpha)^n \\ell_{0}^{*}$ is the extrapolation of $\\text{Z}_t(\\theta)$ by an SES model with $\\ell_{0}^{*} \\in \\mathbb{R}$ as the initial level parameter and $\\alpha \\in (0,1)$ as the smoothing parameter. Note that for $\\theta=2$ Eq. (3) corresponds to Step 4 of the STheta algorithm. After some algebra, we can write\n", "\n", "$$\\tilde {\\text{Z}}_{n+1|n} (\\theta)=\\theta \\ell{n}+(1-\\theta) \\{ \\text{A}_n [1-(1-\\alpha)^n] + \\text{B}_n [n+(1-\\frac{1}{\\alpha}) [1-(1-\\alpha)^n] ] \\} \\tag 4$$\n", "\n", "where $\\ell_{t}=\\alpha Y_t +(1-\\alpha) \\ell_{t-1} $ for $t=1, \\cdots, n$ and $\\ell_{0}=\\ell_{0}^{*}/\\theta$.\n", "\n", - "In the light of Eqs. (3), (4), we suggest four stochastic approaches. These approaches differ due to the parameter $\\theta$ which may be either fixed at two or optimised, and the coefficients $\\text{A}_n$ and $\\text{B}_n$, which can be either fixed or dynamic functions. To formulate the state space models, it is helpful to adopt $\\mu_{t}$ as the one-step-ahead forecast at origin $t-1$ and $\\varepsilon_{t} $ as the respective additive error, i.e., $\\varepsilon_{t}=Y_t - \\mu_{t} $ if $\\mu_{t}= \\hat Y_{t|t-1} $. We assume $\\{ \\varepsilon_{t} \\} $ to be a Gaussian white noise process with mean zero and variance $\\sigma^2$. " + "In the light of Eqs. (3), (4), we suggest four stochastic approaches. These approaches differ due to the parameter $\\theta$ which may be either fixed at two or optimised, and the coefficients $\\text{A}_n$ and $\\text{B}_n$, which can be either fixed or dynamic functions. To formulate the state space models, it is helpful to adopt $\\mu_{t}$ as the one-step-ahead forecast at origin $t-1$ and $\\varepsilon_{t}$ as the respective additive error, i.e., $\\varepsilon_{t}=Y_t - \\mu_{t}$ if $\\mu_{t}= \\hat Y_{t|t-1}$. We assume $\\{ \\varepsilon_{t} \\}$ to be a Gaussian white noise process with mean zero and variance $\\sigma^2$. " ] }, { @@ -161,7 +161,7 @@ "\n", "For $\\theta=2$ OTM reproduces the forecasts of the STheta method; hereafter, we will refer to this particular case as the standard Theta model (STM). \n", "\n", - "**Theorem 2:** The SES-d $(\\ell_{0}^{**}, \\alpha, b)$ model, where $\\ell_{0}^{**} \\in \\mathbb{R}, \\alpha \\in (0,1) $ and $b \\in \\mathbb{R} $ is equivalent to $\\text{OTM} (\\ell_{0}, \\alpha, \\theta )$ where $\\ell_{0} \\in \\mathbb{R}$ and $\\theta \\geq 1$, if \n", + "**Theorem 2:** The SES-d $(\\ell_{0}^{**}, \\alpha, b)$ model, where $\\ell_{0}^{**} \\in \\mathbb{R}, \\alpha \\in (0,1)$ and $b \\in \\mathbb{R}$ is equivalent to $\\text{OTM} (\\ell_{0}, \\alpha, \\theta )$ where $\\ell_{0} \\in \\mathbb{R}$ and $\\theta \\geq 1$, if \n", "\n", "$$\\ell_{0}^{**} = \\ell_{0} + (1- \\frac{1}{\\theta} )A_n \\ \\ and \\ \\ b=(1-\\frac{1}{\\theta} )B_n $$ \n", "\n", diff --git a/nbs/docs/models/SeasonalExponentialSmoothing.ipynb b/nbs/docs/models/SeasonalExponentialSmoothing.ipynb index dcea25030..2dd9bae47 100644 --- a/nbs/docs/models/SeasonalExponentialSmoothing.ipynb +++ b/nbs/docs/models/SeasonalExponentialSmoothing.ipynb @@ -146,7 +146,9 @@ "source": [ "## Loading libraries and data \n", "\n", - ":::{.callout-tip} Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb). :::\n", + ":::{.callout-tip}\n", + "Statsforecast will be needed. To install, see [instructions](../getting-started/0_Installation.ipynb).\n", + ":::\n", "\n", "Next, we import plotting libraries and configure the plotting style." ] diff --git a/nbs/docs/tutorials/IntermittentData.ipynb b/nbs/docs/tutorials/IntermittentData.ipynb index 624f095f8..5fab2c5eb 100644 --- a/nbs/docs/tutorials/IntermittentData.ipynb +++ b/nbs/docs/tutorials/IntermittentData.ipynb @@ -9606,7 +9606,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - " [Croston, J. D. (1972). Forecasting and stock control for intermittent demands. Journal of the Operational Research Society, 23(3), 289-303.](https://link.springer.com/article/10.1057/jors.1972.50) " + "[Croston, J. D. (1972). Forecasting and stock control for intermittent\n", + " demands. Journal of the Operational Research Society, 23(3),\n", + " 289-303.](https://link.springer.com/article/10.1057/jors.1972.50)" ] } ], diff --git a/nbs/src/adapters.prophet.ipynb b/nbs/src/adapters.prophet.ipynb index 07208823b..2cdf836f5 100644 --- a/nbs/src/adapters.prophet.ipynb +++ b/nbs/src/adapters.prophet.ipynb @@ -77,7 +77,7 @@ "id": "cd013cee", "metadata": {}, "source": [ - "# 1. AutoARIMA Adapter " + "# 1. AutoARIMA Adapter" ] }, { @@ -349,7 +349,7 @@ "id": "016a5fd2", "metadata": {}, "source": [ - "# 2. Prophet Substitution Example " + "# 2. Prophet Substitution Example" ] }, { @@ -386,7 +386,7 @@ "id": "312bd903-a199-4412-926f-33d57a68d2b8", "metadata": {}, "source": [ - "## 2.1 Univariate Prophet \n", + "## 2.1 Univariate Prophet\n", "\n", "Here we forecast with `Prophet` without external regressors. We first instantiate a new `Prophet` object, and define its forecasting procedure into its constructor. After that a classic sklearn `fit` and `predict` is used to obtain the predictions." ] @@ -454,7 +454,7 @@ "id": "6c7034db-3440-43ce-98c0-54a598da04d6", "metadata": {}, "source": [ - "## 2.2 Holiday Prophet " + "## 2.2 Holiday Prophet" ] }, { diff --git a/nbs/src/core/distributed.fugue.ipynb b/nbs/src/core/distributed.fugue.ipynb index 992619618..0b9c39cc6 100644 --- a/nbs/src/core/distributed.fugue.ipynb +++ b/nbs/src/core/distributed.fugue.ipynb @@ -29,7 +29,11 @@ "source": [ "# FugueBackend\n", "\n", - "> The computational efficiency of `StatsForecast` can be tracked to its two core components:
    1. Its `models` written in NumBa that optimizes Python code to reach C speeds.
    2. Its `core.StatsForecast` class that enables distributed computing.

    Here we use [Fugue](https://github.com/fugue-project/fugue) which is a unified interface for `Dask` and `Spark`.

    " + "The computational efficiency of `StatsForecast` can be tracked to its two core components:\n", + "1. Its `models` written in NumBa that optimizes Python code to reach C speeds.\n", + "2. Its `core.StatsForecast` class that enables distributed computing.\n", + "\n", + "Here we use [Fugue](https://github.com/fugue-project/fugue) which is a unified interface for `Dask` and `Spark`." ] }, { diff --git a/nbs/src/core/models.ipynb b/nbs/src/core/models.ipynb index 5b2ad2dcf..3c14b4f69 100644 --- a/nbs/src/core/models.ipynb +++ b/nbs/src/core/models.ipynb @@ -356,7 +356,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Automatic Forecasting " + "# Automatic Forecasting" ] }, { @@ -379,10 +379,12 @@ " Automatically selects the best ARIMA (AutoRegressive Integrated Moving Average) \n", " model using an information criterion. Default is Akaike Information Criterion (AICc). \n", " \n", - " **Note:**
    \n", + " **Note:**\n", + "\n", " This implementation is a mirror of Hyndman's [forecast::auto.arima](https://github.com/robjhyndman/forecast).\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman, Yeasmin Khandakar (2008). \"Automatic Time Series Forecasting: The forecast package for R\"](https://www.jstatsoft.org/article/view/v027i03).\n", " \n", " Parameters\n", @@ -1042,10 +1044,12 @@ " If the component is selected as 'Z', it operates as a placeholder to ask the AutoETS model\n", " to figure out the best parameter.\n", " \n", - " **Note:**
    \n", + " **Note:**\n", + "\n", " This implementation is a mirror of Hyndman's [forecast::ets](https://github.com/robjhyndman/forecast).\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman, Yeasmin Khandakar (2008). \"Automatic Time Series Forecasting: The forecast package for R\"](https://www.jstatsoft.org/article/view/v027i03).\n", " \n", " [Hyndman, Rob, et al (2008). \"Forecasting with exponential smoothing: the state space approach\"](https://robjhyndman.com/expsmooth/).\n", @@ -1548,7 +1552,8 @@ " If the component is selected as 'Z', it operates as a placeholder to ask the AutoCES model\n", " to figure out the best parameter.\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Svetunkov, Ivan & Kourentzes, Nikolaos. (2015). \"Complex Exponential Smoothing\". 10.13140/RG.2.1.3757.2562. ](https://onlinelibrary.wiley.com/doi/full/10.1002/nav.22074).\n", " \n", " Parameters\n", @@ -1986,7 +1991,8 @@ " Optimized Theta Model ('OTM'), Dynamic Standard Theta Model ('DSTM'),\n", " Dynamic Optimized Theta Model ('DOTM')) model using mse. \n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Jose A. Fiorucci, Tiago R. Pellegrini, Francisco Louzada, Fotios Petropoulos, Anne B. Koehler (2016). \"Models for optimising the theta method and their relationship to state space models\". International Journal of Forecasting](https://www.sciencedirect.com/science/article/pii/S0169207016300243)\n", " \n", " Parameters\n", @@ -2338,7 +2344,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ARIMA family " + "# ARIMA family" ] }, { @@ -2360,7 +2366,8 @@ "\n", " AutoRegressive Integrated Moving Average model.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman, Yeasmin Khandakar (2008). \"Automatic Time Series Forecasting: The forecast package for R\"](https://www.jstatsoft.org/article/view/v027i03).\n", " \n", " Parameters\n", @@ -3030,7 +3037,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ExponentialSmoothing " + "# ExponentialSmoothing" ] }, { @@ -3176,7 +3183,8 @@ "\n", " The rate $0 \\leq \\\\alpha \\leq 1$ at which the weights decrease is called the smoothing parameter. When $\\\\alpha = 1$, SES is equal to the naive method.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Charles C Holt (1957). “Forecasting seasonals and trends by exponentially weighted moving averages”](https://doi.org/10.1016/j.ijforecast).\n", "\n", " Parameters\n", @@ -3492,7 +3500,8 @@ "\n", " The smoothing parameter $\\\\alpha^*$ is optimized by square error minimization.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Charles C Holt (1957). “Forecasting seasonals and trends by exponentially weighted moving averages”](https://doi.org/10.1016/j.ijforecast).\n", "\n", " Parameters\n", @@ -3804,11 +3813,13 @@ " Assuming there are $t$ observations and season $s$, the one-step forecast is given by: \n", " $\\hat{y}_{t+1,s} = \\\\alpha y_t + (1-\\\\alpha) \\hat{y}_{t-1,s}$\n", "\n", - " **Note:**
    \n", + " **Note:**\n", + "\n", " This method is an extremely simplified of Holt-Winter's method where the trend and level are set to zero.\n", " And a single seasonal smoothing parameter $\\\\alpha$ is shared across seasons.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Charles. C. Holt (1957). \"Forecasting seasonals and trends by exponentially weighted moving averages\", ONR Research Memorandum, Carnegie Institute of Technology 52.](https://www.sciencedirect.com/science/article/abs/pii/S0169207003001134).\n", " [Peter R. Winters (1960). \"Forecasting sales by exponentially weighted moving averages\". Management Science](https://pubsonline.informs.org/doi/abs/10.1287/mnsc.6.3.324).\n", "\n", @@ -4182,11 +4193,13 @@ " \n", " The smoothing parameter $\\\\alpha^*$ is optimized by square error minimization. \n", "\n", - " **Note:**
    \n", + " **Note:**\n", + "\n", " This method is an extremely simplified of Holt-Winter's method where the trend and level are set to zero.\n", " And a single seasonal smoothing parameter $\\\\alpha$ is shared across seasons.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Charles. C. Holt (1957). \"Forecasting seasonals and trends by exponentially weighted moving averages\", ONR Research Memorandum, Carnegie Institute of Technology 52.](https://www.sciencedirect.com/science/article/abs/pii/S0169207003001134).\n", " [Peter R. Winters (1960). \"Forecasting sales by exponentially weighted moving averages\". Management Science](https://pubsonline.informs.org/doi/abs/10.1287/mnsc.6.3.324).\n", " \n", @@ -4486,7 +4499,8 @@ " Also known as double exponential smoothing, Holt's method is an extension of exponential smoothing for series with a trend.\n", " This implementation returns the corresponding `ETS` model with additive (A) or multiplicative (M) errors (so either 'AAN' or 'MAN'). \n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"Forecasting principles and practice, Methods with trend\"](https://otexts.com/fpp3/holt.html).\n", "\n", " Parameters\n", @@ -4692,7 +4706,8 @@ " Also known as triple exponential smoothing, Holt-Winters' method is an extension of exponential smoothing for series that contain both trend and seasonality.\n", " This implementation returns the corresponding `ETS` model with additive (A) or multiplicative (M) errors (so either 'AAA' or 'MAM'). \n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"Forecasting principles and practice, Methods with seasonality\"](https://otexts.com/fpp3/holt-winters.html).\n", " \n", " Parameters\n", @@ -4880,7 +4895,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Baseline Models " + "# Baseline Models" ] }, { @@ -4929,7 +4944,8 @@ " Assuming there are $t$ observations, the one-step forecast is given by: \n", " $$ \\hat{y}_{t+1} = \\\\frac{1}{t} \\sum_{j=1}^t y_j $$\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"Forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html).\n", "\n", " Parameters \n", @@ -5254,7 +5270,8 @@ " All forecasts have the value of the last observation: \n", " $\\hat{y}_{t+1} = y_t$ for all $t$\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html). \n", " \n", " Parameters \n", @@ -5674,7 +5691,8 @@ " From the previous equation, we can see that this is equivalent to extrapolating a line between \n", " the first and the last observation. \n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html).\n", "\n", " Parameters\n", @@ -6022,7 +6040,8 @@ "\n", " A method similar to the naive, but uses the last known observation of the same period (e.g. the same month of the previous year) in order to capture seasonal variations.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html#seasonal-na%C3%AFve-method).\n", "\n", " Parameters\n", @@ -6410,7 +6429,8 @@ " The length of the window selected should take into account the importance of past\n", " observations and how fast the series changes.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html).\n", "\n", " Parameters\n", @@ -6722,7 +6742,8 @@ "\n", " An average of the last $k$ observations of the same period, with $k$ the length of the window.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Rob J. Hyndman and George Athanasopoulos (2018). \"forecasting principles and practice, Simple Methods\"](https://otexts.com/fpp3/simple-methods.html).\n", "\n", " Parameters\n", @@ -6998,7 +7019,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Sparse or Intermittent " + "# Sparse or Intermittent" ] }, { @@ -7057,7 +7078,8 @@ " They are notoriously hard to forecast, and so, different methods have been developed \n", " especifically for them.\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Nikolopoulos, K., Syntetos, A. A., Boylan, J. E., Petropoulos, F., & Assimakopoulos, V. (2011). An aggregate–disaggregate intermittent demand approach (ADIDA) to forecasting: an empirical proposition and analysis. Journal of the Operational Research Society, 62(3), 544-554.](https://researchportal.bath.ac.uk/en/publications/an-aggregate-disaggregate-intermittent-demand-approach-adida-to-f).\n", " \n", " Parameters\n", @@ -7378,7 +7400,8 @@ " where $\\hat{z}_t$ and $\\hat{p}_t$ are forecasted using SES. The smoothing parameter \n", " of both components is set equal to 0.1\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Croston, J. D. (1972). Forecasting and stock control for intermittent demands. Journal of the Operational Research Society, 23(3), 289-303.](https://link.springer.com/article/10.1057/jors.1972.50)\n", " \n", " Parameters\n", @@ -7687,7 +7710,8 @@ " selected from the range $[0.1,0.3]$. Both the non-zero demand $z_t$ and the inter-demand \n", " intervals $p_t$ are smoothed separately, so their smoothing parameters can be different.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Croston, J. D. (1972). Forecasting and stock control for intermittent demands. Journal of the Operational Research Society, 23(3), 289-303.](https://link.springer.com/article/10.1057/jors.1972.50).\n", "\n", " Parameters\n", @@ -7984,7 +8008,8 @@ " forecast is given by:\n", " $$ \\hat{y}_t = 0.95 \\\\frac{\\hat{z}_t}{\\hat{p}_t} $$\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Croston, J. D. (1972). Forecasting and stock control for intermittent demands. Journal of the Operational Research Society, 23(3), 289-303.](https://link.springer.com/article/10.1057/jors.1972.50).\n", "\n", " Parameters\n", @@ -8294,7 +8319,8 @@ " dynamics of the data. Uses the optimized SES to generate the forecasts at the new levels\n", " and then combines them using a simple average.\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Syntetos, A. A., & Boylan, J. E. (2021). Intermittent demand forecasting: Context, methods and applications. John Wiley & Sons.](https://www.ifors.org/intermittent-demand-forecasting-context-methods-and-applications/).\n", "\n", " Parameters\n", @@ -8619,7 +8645,8 @@ " Both $d_t$ and $z_t$ are forecasted using SES. The smooting paramaters of each may differ, \n", " like in the optimized Croston's method.\n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Teunter, R. H., Syntetos, A. A., & Babai, M. Z. (2011). Intermittent demand: Linking forecasting to inventory obsolescence. European Journal of Operational Research, 214(3), 606-615.](https://www.sciencedirect.com/science/article/abs/pii/S0377221711004437)\n", "\n", " Parameters\n", @@ -8885,7 +8912,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Multiple Seasonalities " + "# Multiple Seasonalities" ] }, { @@ -8929,7 +8956,8 @@ " in multiple seasonalities using LOESS. Then forecasts the trend using \n", " a custom non-seaonal model and each seasonality using a SeasonalNaive model.\n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Bandara, Kasun & Hyndman, Rob & Bergmeir, Christoph. (2021). \"MSTL: A Seasonal-Trend Decomposition Algorithm for Time Series with Multiple Seasonal Patterns\".](https://arxiv.org/abs/2107.13462).\n", " \n", " Parameters\n", @@ -9435,7 +9463,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Theta Family " + "# Theta Family" ] }, { @@ -9455,7 +9483,8 @@ "class Theta(AutoTheta): \n", " \"\"\" Standard Theta Method. \n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Jose A. Fiorucci, Tiago R. Pellegrini, Francisco Louzada, Fotios Petropoulos, Anne B. Koehler (2016). \"Models for optimising the theta method and their relationship to state space models\". International Journal of Forecasting](https://www.sciencedirect.com/science/article/pii/S0169207016300243)\n", "\n", " Parameters\n", @@ -9657,7 +9686,8 @@ "class OptimizedTheta(AutoTheta): \n", " \"\"\" Optimized Theta Method. \n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Jose A. Fiorucci, Tiago R. Pellegrini, Francisco Louzada, Fotios Petropoulos, Anne B. Koehler (2016). \"Models for optimising the theta method and their relationship to state space models\". International Journal of Forecasting](https://www.sciencedirect.com/science/article/pii/S0169207016300243)\n", "\n", " Parameters\n", @@ -9861,7 +9891,8 @@ "class DynamicTheta(AutoTheta): \n", " \"\"\" Dynamic Standard Theta Method. \n", "\n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Jose A. Fiorucci, Tiago R. Pellegrini, Francisco Louzada, Fotios Petropoulos, Anne B. Koehler (2016). \"Models for optimising the theta method and their relationship to state space models\". International Journal of Forecasting](https://www.sciencedirect.com/science/article/pii/S0169207016300243)\n", "\n", " Parameters\n", @@ -10065,7 +10096,8 @@ "class DynamicOptimizedTheta(AutoTheta): \n", " \"\"\" Dynamic Optimized Theta Method. \n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Jose A. Fiorucci, Tiago R. Pellegrini, Francisco Louzada, Fotios Petropoulos, Anne B. Koehler (2016). \"Models for optimising the theta method and their relationship to state space models\". International Journal of Forecasting](https://www.sciencedirect.com/science/article/pii/S0169207016300243)\n", "\n", " Parameters\n", @@ -10255,7 +10287,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ARCH Family" + "# ARCH Family" ] }, { @@ -10292,7 +10324,8 @@ " \n", " The ARCH model is a particular case of the GARCH model when $q=0$. \n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Engle, R. F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econometrica: Journal of the econometric society, 987-1007.](http://www.econ.uiuc.edu/~econ508/Papers/engle82.pdf) \n", " \n", " [Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of econometrics, 31(3), 307-327.](https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=7da8bfa5295375c1141d797e80065a599153c19d)\n", @@ -10635,10 +10668,11 @@ " \n", " $$ \\sigma_t^2 = w0 + \\sum_{i=1}^p a_i y_{t-i}^2$$. \n", " \n", - " Here {$\\epsilon_t$} is a sequence of iid random variables with zero mean and unit variance. \n", + " Here $\\epsilon_t$ is a sequence of iid random variables with zero mean and unit variance. \n", " The coefficients $w$ and $a_i$, $i=1,...,p$ must be nonnegative and $\\sum_{k=1}^p a_k < 1$. \n", " \n", - " **References:**
    \n", + " **References:**\n", + "\n", " [Engle, R. F. (1982). Autoregressive conditional heteroscedasticity with estimates of the variance of United Kingdom inflation. Econometrica: Journal of the econometric society, 987-1007.](http://www.econ.uiuc.edu/~econ508/Papers/engle82.pdf) \n", "\n", " [James D. Hamilton. Time Series Analysis Princeton University Press, Princeton, New Jersey, 1st Edition, 1994.](https://press.princeton.edu/books/hardcover/9780691042893/time-series-analysis)\n", @@ -10767,7 +10801,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Fallback Models " + "# Fallback Models" ] }, { @@ -11364,7 +11398,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# References " + "# References" ] }, { diff --git a/nbs/src/utils.ipynb b/nbs/src/utils.ipynb index f2c8bcea4..c11fbcdc2 100644 --- a/nbs/src/utils.ipynb +++ b/nbs/src/utils.ipynb @@ -27,7 +27,7 @@ "source": [ "# Utils\n", "\n", - "> The `core.StatsForecast` class allows you to efficiently fit multiple `StatsForecast` models for large sets of time series. It operates with pandas DataFrame `df` that identifies individual series and datestamps with the `unique_id` and `ds` columns, and the `y` column denotes the target time series variable. To assist development, we declare useful datasets that we use throughout all `StatsForecast`'s unit tests.

    " + "> The `core.StatsForecast` class allows you to efficiently fit multiple `StatsForecast` models for large sets of time series. It operates with pandas DataFrame `df` that identifies individual series and datestamps with the `unique_id` and `ds` columns, and the `y` column denotes the target time series variable. To assist development, we declare useful datasets that we use throughout all `StatsForecast`'s unit tests." ] }, { @@ -85,7 +85,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 1. Synthetic Panel Data " + "# 1. Synthetic Panel Data" ] }, { @@ -157,7 +157,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. AirPassengers Data \n", + "# 2. AirPassengers Data\n", "\n", "The classic Box & Jenkins airline data. Monthly totals of international airline passengers, 1949 to 1960.\n", "\n", diff --git a/nbs/styles.css b/nbs/styles.css index ef52213db..17f7c8a54 100644 --- a/nbs/styles.css +++ b/nbs/styles.css @@ -11,7 +11,9 @@ margin-bottom: 0; } -.cell-output > pre, .cell-output > .sourceCode > pre, .cell-output-stdout > pre { +.cell-output > pre, +.cell-output > .sourceCode > pre, +.cell-output-stdout > pre { margin-left: 0.8rem; margin-top: 0; background: none; @@ -60,8 +62,8 @@ blockquote > pre { /* new */ @font-face { - font-family: 'Inter'; - src: url('./assets/Inter-VariableFont.ttf') format('ttf') + font-family: "Inter"; + src: url("./assets/Inter-VariableFont.ttf") format("ttf"); } :root { @@ -69,9 +71,10 @@ blockquote > pre { --secondary: rgb(255, 112, 0); } -html, body { +html, +body { color: #374151; - font-family: 'Inter', sans-serif; + font-family: "Inter", sans-serif; } header { @@ -110,20 +113,20 @@ a > code:hover { background: rgba(255, 255, 255, 0.95); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); /* For Safari support */ - border-bottom: 1px solid rgba(17, 24,39, 0.05); + border-bottom: 1px solid rgba(17, 24, 39, 0.05); } .nav-link { - color:rgba(17, 24,39, 0.6) !important; + color: rgba(17, 24, 39, 0.6) !important; font-size: 0.875rem; } .nav-link.active { - color:rgb(17, 24,39) !important; + color: rgb(17, 24, 39) !important; } .aa-SubmitIcon { - fill: rgba(17, 24,39, 0.6) !important; + fill: rgba(17, 24, 39, 0.6) !important; height: 20px !important; margin-top: -2px; } @@ -138,7 +141,7 @@ a > code:hover { } .navbar-brand { - background-image: url('./assets/logo.png'); + background-image: url("./assets/logo.png"); background-size: contain; background-repeat: no-repeat; background-position: center; @@ -154,8 +157,13 @@ a > code:hover { width: 100%; } -h1, h2, h3, h4, h5, h6 { - color: rgb(17, 24,39); +h1, +h2, +h3, +h4, +h5, +h6 { + color: rgb(17, 24, 39); margin-top: 3rem; } @@ -167,7 +175,7 @@ h1.title { div.description { font-style: normal; - font-size: .875rem; + font-size: 0.875rem; line-height: 1.25rem; } @@ -176,7 +184,12 @@ p { } /* menu */ -.sidebar-menu-container > ul > li:first-child > .sidebar-item-container > a > span { +.sidebar-menu-container + > ul + > li:first-child + > .sidebar-item-container + > a + > span { font-weight: 600 !important; font-size: 0.875rem; color: var(--secondary); @@ -187,7 +200,7 @@ div.sidebar-item-container { } .sidebar-divider.hi { - color: rgb(0,0,0, 0.2); + color: rgb(0, 0, 0, 0.2); margin-top: 0.5rem; margin-bottom: 1rem; } @@ -200,7 +213,6 @@ div.sidebar-item-container { font-weight: 400; } - ul.sidebar-section { padding-left: 0; } @@ -236,12 +248,12 @@ ul.sidebar-section .sidebar-link { } .callout-tip { - background: rgba(63,182,24, 0.05); - border: 1px solid rgba(63,182,24, 0.25) !important; + background: rgba(63, 182, 24, 0.05); + border: 1px solid rgba(63, 182, 24, 0.25) !important; } .callout-note { - background: rgba(59 , 130, 246, 0.05); + background: rgba(59, 130, 246, 0.05); border: 1px solid rgba(59, 130, 246, 0.25) !important; } @@ -296,8 +308,6 @@ code { overflow-x: scroll !important; } - - .cell-output > div { border: 1px solid rgba(100, 116, 139, 0.2) !important; border-radius: 1rem; @@ -305,7 +315,8 @@ code { margin-top: 3rem; } -table, .table { +table, +.table { border-radius: 1rem; font-size: 0.875rem; margin-bottom: 0; @@ -331,12 +342,14 @@ thead tr:first-child th:last-child { border-radius: 0 1rem 0 0; } -th, td { +th, +td { padding: 0.5rem 1rem !important; white-space: nowrap !important; } -td a, td a code { +td a, +td a code { white-space: nowrap !important; } @@ -349,7 +362,8 @@ tbody tr:last-child td:first-child { border-radius: 0 0 0 1rem; } -tr.even, tr.odd { +tr.even, +tr.odd { line-height: 2rem; } @@ -357,7 +371,8 @@ tr:hover { background-color: rgba(17, 24, 39, 0.05); } -td:first-child, td:last-child { +td:first-child, +td:last-child { padding: 0.25rem 1rem !important; } @@ -365,7 +380,7 @@ td:first-child, td:last-child { background: white; border: none; border-radius: 0.5rem; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); padding-top: 0.5rem !important; padding-bottom: 0.25rem !important; } diff --git a/settings.ini b/settings.ini index 56e2f0b6a..ab5f35046 100644 --- a/settings.ini +++ b/settings.ini @@ -32,4 +32,4 @@ title = %(lib_name)s black_formatting = True jupyter_hooks = True clean_ids = True -readme_nb = index.ipynb +readme_nb = index.ipynb \ No newline at end of file From 48fbe911205c8a0a34c2bb7a37abf9f0cd061f44 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:31:24 -0700 Subject: [PATCH 09/22] re-add deleted ci check --- .github/workflows/ci.yaml | 118 +++++++++++++++++++++++++++ .github/workflows/deploy.yaml | 9 ++ .github/workflows/lint.yaml | 28 +++++++ .github/workflows/no-response.yaml | 21 +++++ .github/workflows/python-publish.yml | 25 ++++++ 5 files changed, 201 insertions(+) create mode 100644 .github/workflows/ci.yaml create mode 100644 .github/workflows/deploy.yaml create mode 100644 .github/workflows/lint.yaml create mode 100644 .github/workflows/no-response.yaml create mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 000000000..59254ab31 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,118 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +defaults: + run: + shell: bash -l {0} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + NIXTLA_NUMBA_CACHE: '1' + +jobs: + nb-sync: + runs-on: ubuntu-latest + steps: + - name: Clone repo + uses: actions/checkout@v2 + + - name: Set up python + uses: actions/setup-python@v2 + + - name: Install nbdev + run: pip install nbdev + + - name: Check if all notebooks are cleaned + run: | + echo "Check we are starting with clean git checkout" + if [ -n "$(git status -uno -s)" ]; then echo "git status is not clean"; false; fi + echo "Trying to strip out notebooks" + ./action_files/clean_nbs + echo "Check that strip out was unnecessary" + git status -s # display the status to see which nbs need cleaning up + if [ -n "$(git status -uno -s)" ]; then echo -e "!!! Detected unstripped out notebooks\n!!!Remember to run nbdev_install_git_hooks and running ./action_files/clean_nbs before committing"; false; fi + + run-local-tests: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + python-version: [3.7, 3.8, 3.9, '3.10', '3.11'] + steps: + - name: Clone repo + uses: actions/checkout@v3 + + - name: Set up environment + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: dev/local_environment.yml + create-args: python=${{ matrix.python-version }} + cache-environment: true + + - name: Install pip requirements + run: pip install ./ + + - name: Run local tests + run: nbdev_test --skip_file_re '(models|distributed|ets).*.ipynb' --pause 1.0 + + run-tests: + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + python-version: [3.7, 3.8, 3.9, '3.10', '3.11'] + steps: + - name: Clone repo + uses: actions/checkout@v3 + + - name: Set up environment + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: dev/environment.yml + create-args: python=${{ matrix.python-version }} + cache-environment: true + + - name: Install pip requirements + run: pip install ./ + + - name: Run tests + run: nbdev_test --skip_file_re '(distributed).*.ipynb' --pause 1.0 + + - name: Run integration tests + run: | + pip install ".[dev]" pytest + pytest --durations=0 action_files + + test-m3-performance: + runs-on: ubuntu-latest + strategy: + fail-fast: false + steps: + - name: Clone repo + uses: actions/checkout@v3 + + - name: Set up environment + uses: mamba-org/setup-micromamba@v1 + with: + environment-file: dev/environment.yml + create-args: python=3.10 + cache-environment: true + + - name: Install library and extra deps + run: pip install ".[dev]" fire + + - name: Run M3 experiment + run: | + python -m src.experiment + python -m src.evaluation --test + working-directory: ./experiments/m3 diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 000000000..8d077a768 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,9 @@ +name: Deploy to GitHub Pages +on: + push: + branches: ["main"] + workflow_dispatch: +jobs: + deploy: + runs-on: ubuntu-latest + steps: [uses: fastai/workflows/quarto-ghp@master] diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 000000000..047073aa0 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,28 @@ +name: Lint + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Clone repo + uses: actions/checkout@v2 + + - name: Set up python + uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Install linters + run: pip install mypy types-setuptools flake8 + + - name: mypy + run: mypy statsforecast/ + + - name: flake8 + run: flake8 --select=F statsforecast/ diff --git a/.github/workflows/no-response.yaml b/.github/workflows/no-response.yaml new file mode 100644 index 000000000..a2b26e127 --- /dev/null +++ b/.github/workflows/no-response.yaml @@ -0,0 +1,21 @@ +name: No Response Bot + +on: + issue_comment: + types: [created] + schedule: + - cron: '0 4 * * *' + +jobs: + noResponse: + runs-on: ubuntu-latest + steps: + - uses: lee-dohm/no-response@v0.5.0 + with: + closeComment: > + This issue has been automatically closed because it has been awaiting a response for too long. + When you have time to to work with the maintainers to resolve this issue, please post a new comment and it will be re-opened. + If the issue has been locked for editing by the time you return to it, please open a new issue and reference this one. + daysUntilClose: 30 + responseRequiredLabel: awaiting response + token: ${{ github.token }} diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 000000000..58b53adf6 --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,25 @@ +name: Upload Python Package + +on: + release: + types: [published] + +jobs: + deploy: + + runs-on: ubuntu-latest + permissions: + id-token: write + + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v3 + with: + python-version: '3.10' + - name: Install dependencies + run: python -m pip install build wheel + - name: Build package + run: python -m build -sw + - name: Publish package + uses: pypa/gh-action-pypi-publish@release/v1 From cca00b0e92afcee7204f4782793f63e89a276813 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 18 Oct 2023 14:43:50 -0700 Subject: [PATCH 10/22] revive deleted files --- nbs/custom.yml | 22 ++++++++++++++++ nbs/docs/contribute/step-by-step.md | 40 ++++++++++++++--------------- nbs/sidebar.yml | 17 ++++++++++++ 3 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 nbs/custom.yml create mode 100644 nbs/sidebar.yml diff --git a/nbs/custom.yml b/nbs/custom.yml new file mode 100644 index 000000000..1b2c854c2 --- /dev/null +++ b/nbs/custom.yml @@ -0,0 +1,22 @@ +website: + logo: https://github.com/Nixtla/styles/blob/b9ea432cfa2dae20fc84d8634cae6db902f9ca3f/images/Nixtla_Blanco.png + reader-mode: false + navbar: + collapse-below: lg + left: + - text: "Get Started" + href: examples/Getting_Started_with_Auto_Arima_and_ETS.ipynb + - text: "Experiments" + href: https://github.com/Nixtla/statsforecast/tree/main/experiments + - text: "Help" + menu: + - text: "Report an Issue" + icon: bug + href: https://github.com/nixtla/statsforecast/issues + - text: "Slack Nixtla" + icon: chat-right-text + href: https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A + right: + - icon: twitter + href: https://twitter.com/nixtlainc + aria-label: Nixtla Twitter diff --git a/nbs/docs/contribute/step-by-step.md b/nbs/docs/contribute/step-by-step.md index 90634190e..49848ff9d 100644 --- a/nbs/docs/contribute/step-by-step.md +++ b/nbs/docs/contribute/step-by-step.md @@ -15,35 +15,35 @@ Sometimes, diving into a new technology can be challenging and overwhelming. We' 7. [Start Coding](#start-coding) 8. [Example with Screen-shots](#example-with-screen-shots) -## Prerequisites +## Prerequisites -- _GitHub_: You should already have a GitHub account and a basic understanding of its functionalities. Alternatively check [this guide](https://docs.github.com/en/get-started). -- _Python_: Python should be installed on your system. Alternatively check [this guide](https://www.python.org/downloads/). -- _conda_: You need to have conda installed, along with a good grasp of fundamental operations such as creating environments, and activating and deactivating them. Alternatively check [this guide](https://conda.io/projects/conda/en/latest/user-guide/install/index.html). +- *GitHub*: You should already have a GitHub account and a basic understanding of its functionalities. Alternatively check [this guide](https://docs.github.com/en/get-started). +- *Python*: Python should be installed on your system. Alternatively check [this guide](https://www.python.org/downloads/). +- *conda*: You need to have conda installed, along with a good grasp of fundamental operations such as creating environments, and activating and deactivating them. Alternatively check [this guide](https://conda.io/projects/conda/en/latest/user-guide/install/index.html). ## Git `fork-and-pull` worklow -**1. Fork the Project:** +**1. Fork the Project:** Start by forking the Nixtla repository to your own GitHub account. This creates a personal copy of the project where you can make changes without affecting the main repository. **2. Clone the Forked Repository** -Clone the forked repository to your local machine using `git clone https://github.com//nixtla.git`. This allows you to work with the code directly on your system. +Clone the forked repository to your local machine using `git clone https://github.com//nixtla.git`. This allows you to work with the code directly on your system. -**3. Create a Branch:** +**3. Create a Branch:** Branching in GitHub is a key strategy for effectively managing and isolating changes to your project. It allows you to segregate work on different features, fixes, and issues without interfering with the main, production-ready codebase. -1. _Main Branch_: The default branch with production-ready code. +1. *Main Branch*: The default branch with production-ready code. -2. _Feature Branches_: For new features, create branches prefixed with 'feature/', like `git checkout -b feature/new-model`. +2. *Feature Branches*: For new features, create branches prefixed with 'feature/', like `git checkout -b feature/new-model`. -3. _Fix Branches_: For bug fixes, use 'fix/' prefix, like `git checkout -b fix/forecasting-bug`. +3. *Fix Branches*: For bug fixes, use 'fix/' prefix, like `git checkout -b fix/forecasting-bug`. -4. _Issue Branches_: For specific issues, use `git checkout -b issue/issue-number` or `git checkout -b issue/issue-description`. +4. *Issue Branches*: For specific issues, use `git checkout -b issue/issue-number` or `git checkout -b issue/issue-description`. After testing, branches are merged back into the main branch via a pull request, and then typically deleted to maintain a clean repository. You can read more about github and branching [here](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-and-deleting-branches-within-your-repository). -## Set Up a Conda Environment +## Set Up a Conda Environment > If you want to use Docker or Codespaces, let us know opening an issue and we will set you up. @@ -51,13 +51,13 @@ Next, you'll need to set up a [Conda](https://docs.conda.io/en/latest/) environm First, ensure you have Anaconda or Miniconda installed on your system. Alternatively checkout these guides: [Anaconda](https://www.anaconda.com/), [Miniconda](https://docs.conda.io/en/latest/miniconda.html), and [Mamba](https://mamba.readthedocs.io/en/latest/). -Then, you can create a new environment using `conda create -n nixtla-env python=3.10`. +Then, you can create a new environment using `conda create -n nixtla-env python=3.10`. -You can also use mamba for creating the environment (mamba is faster than Conda) using `mamba create -n nixtla-env python=3.10`. +You can also use mamba for creating the environment (mamba is faster than Conda) using `mamba create -n nixtla-env python=3.10`. You can replace `nixtla-env` for something more meaningful to you. Eg. `statsforecast-env` or `mlforecast-env`. You can always check the list of environments in your system using `conda env list`. -Activate your new environment with `conda activate nixtla-env`. +Activate your new environment with `conda activate nixtla-env`. ## Install required libraries for development @@ -71,7 +71,7 @@ Sometimes (e.g. StatsForecast) the `enviorment.yml` is sometimes inside a folder ## Start editable mode -Install the library in editable mode using `pip install -e ".[dev]"`. +Install the library in editable mode using `pip install -e ".[dev]"`. This means the package is linked directly to the source code, allowing any changes made to the source code to be immediately reflected in your Python environment without the need to reinstall the package. This is useful for testing changes during package development. @@ -101,8 +101,9 @@ Open a jupyter notebook using `jupyter lab` (or VS Code). 2. **Commit Your Changes:** Add the changed files using `git add [your_modified_file_0.ipynb] [your_modified_file_1.ipynb]`, then commit these changes using `git commit -m ": "`. Please use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) -3. **Push Your Changes:** - Push your changes to the remote repository on GitHub with `git push origin feature/your-feature-name`. + +3. **Push Your Changes:** +Push your changes to the remote repository on GitHub with `git push origin feature/your-feature-name`. 4. **Open a Pull Request:** Open a pull request from your new branch on the Nixtla repository on GitHub. Provide a thorough description of your changes when creating the pull request. @@ -117,7 +118,6 @@ You can find a detailed step by step buide with screen-shots below. ## Example with Screen-shots ### 1. Create a fork of the mlforecast repo - The first thing you need to do is create a fork of the GitHub repository to your own account: image @@ -229,4 +229,4 @@ Finally, you will see something like this: image ## Notes -- This file was generated using [this file](https://github.com/Nixtla/nixtla-commons/blob/main/docs/contribute/step-by-step.md). Please change that file if you want to enhance the document. +- This file was generated using [this file](https://github.com/Nixtla/nixtla-commons/blob/main/docs/contribute/step-by-step.md). Please change that file if you want to enhance the document. \ No newline at end of file diff --git a/nbs/sidebar.yml b/nbs/sidebar.yml new file mode 100644 index 000000000..e9f29d299 --- /dev/null +++ b/nbs/sidebar.yml @@ -0,0 +1,17 @@ +website: + reader-mode: false + sidebar: + collapse-level: 1 + contents: + - index.ipynb + - text: "--" + - section: "Getting Started" + contents: docs/getting-started/* + - section: "Tutorials" + contents: docs/tutorials/* + - section: "How-To Guides" + contents: docs/how-to-guides/* + - section: "API Reference" + contents: src/core/* + - section: "Contributing" + contents: docs/contribute/* From c5dc6f766fad7a4ae27eac374089dd1fb1a57dd2 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:19:41 -0700 Subject: [PATCH 11/22] fix sidebar.yml --- nbs/sidebar.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nbs/sidebar.yml b/nbs/sidebar.yml index e9f29d299..ce8e9088f 100644 --- a/nbs/sidebar.yml +++ b/nbs/sidebar.yml @@ -11,6 +11,8 @@ website: contents: docs/tutorials/* - section: "How-To Guides" contents: docs/how-to-guides/* + - section: "Model References" + contents: docs/models/* - section: "API Reference" contents: src/core/* - section: "Contributing" From 80c274e018314d36e3da7b539eb5278a1411b370 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:25:21 -0700 Subject: [PATCH 12/22] clean up code --- action_files/docs_replace_imgs.py | 1 - nbs/_extensions/mintlify/mintlify_renderers.lua | 3 --- nbs/_extensions/mintlify/mintlify_utils.lua | 14 -------------- 3 files changed, 18 deletions(-) delete mode 100644 nbs/_extensions/mintlify/mintlify_renderers.lua diff --git a/action_files/docs_replace_imgs.py b/action_files/docs_replace_imgs.py index 7ce4b2f72..9920c2da7 100644 --- a/action_files/docs_replace_imgs.py +++ b/action_files/docs_replace_imgs.py @@ -22,7 +22,6 @@ def url_replace_helper(match): new_url = str(Path(*folder_arr).joinpath(curr_url)) if not new_url.startswith('/'): new_url = '/' + new_url - print('![](' + str(new_url) + ')') return '![](' + str(new_url) + ')' return url_replace_helper diff --git a/nbs/_extensions/mintlify/mintlify_renderers.lua b/nbs/_extensions/mintlify/mintlify_renderers.lua deleted file mode 100644 index 2597fbbf1..000000000 --- a/nbs/_extensions/mintlify/mintlify_renderers.lua +++ /dev/null @@ -1,3 +0,0 @@ -local codeBlock = require('mintlify_utils').codeBlock - -return {} -- return an empty table as a hack to pretend we're a shortcode handler for now diff --git a/nbs/_extensions/mintlify/mintlify_utils.lua b/nbs/_extensions/mintlify/mintlify_utils.lua index 42e8776c7..ae076ddaa 100644 --- a/nbs/_extensions/mintlify/mintlify_utils.lua +++ b/nbs/_extensions/mintlify/mintlify_utils.lua @@ -1,16 +1,5 @@ --- local scriptCount = 0 --- local printItem = 5 - function codeBlock(el, filename) local lang = el.attr.classes[1] - -- scriptCount = scriptCount + 1 - -- if printItem == scriptCount then - -- quarto.utils.dump(el) - -- end - -- quarto.log.output('---Code block---') - -- quarto.utils.dump(el.output) - -- quarto.utils.dump({}) - -- quarto.log.output('------') local title = filename or el.attr.attributes["filename"] or el.attr.attributes["title"] local showLineNumbers = el.attr.classes:includes('number-lines') if lang or title or showLineNumbers then @@ -26,9 +15,6 @@ function codeBlock(el, filename) end code = code .. "\n" .. el.text .. "\n```\n" - -- quarto.log.output('------') - -- quarto.log.output(code) - -- quarto.log.output('------') -- docusaures code block attributes don't conform to any syntax -- that pandoc natively understands, so return the CodeBlock as -- "raw" markdown (so it bypasses pandoc processing entirely) From e36e72e47a5191b64207dc65c7f2c69a8e1a2125 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Wed, 18 Oct 2023 15:35:20 -0700 Subject: [PATCH 13/22] delete unneeded comments --- nbs/_extensions/mintlify/mintlify.lua | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/nbs/_extensions/mintlify/mintlify.lua b/nbs/_extensions/mintlify/mintlify.lua index a1e464013..b95554781 100644 --- a/nbs/_extensions/mintlify/mintlify.lua +++ b/nbs/_extensions/mintlify/mintlify.lua @@ -41,23 +41,13 @@ Block = function(node) return node end --- local scriptCount = 0 --- local printItem = 1 - -- transform 'mdx' into passthrough content, transform 'html' -- into raw commamark to pass through via dangerouslySetInnerHTML function RawBlock(el) - -- quarto.log.output(el.format) - -- scriptCount = scriptCount + 1 if el.format == 'mdx' then - -- quarto.log.output('---A---') return pandoc.CodeBlock(el.text, pandoc.Attr("", {"mdx-code-block"})) elseif el.format == 'html' then - -- quarto.utils.dump(el.text) - -- quarto.log.output('---B---') - -- if printItem == scriptCount then - -- quarto.utils.dump(el) - -- end + -- track the raw html vars (we'll insert them at the top later on as -- mdx requires all exports be declared together) local html = string.gsub(el.text, "\n+", "\n") From 9ecf43b3ff0bfa9844439116989d7e0db600fc10 Mon Sep 17 00:00:00 2001 From: Hahnbee Lee <55263191+hahnbeelee@users.noreply.github.com> Date: Thu, 19 Oct 2023 00:11:36 -0700 Subject: [PATCH 14/22] move nbdev_plotly to dev_reqs --- settings.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings.ini b/settings.ini index 7361c3603..00bcc3f86 100644 --- a/settings.ini +++ b/settings.ini @@ -15,12 +15,12 @@ language = English custom_sidebar = True license = apache2 status = 2 -requirements = numba>=0.55.0 numpy>=1.21.6 pandas>=1.3.5 polars scipy>=1.7.3 statsmodels>=0.13.2 tqdm fugue>=0.8.1 utilsforecast>=0.0.5 nbdev_plotly +requirements = numba>=0.55.0 numpy>=1.21.6 pandas>=1.3.5 polars scipy>=1.7.3 statsmodels>=0.13.2 tqdm fugue>=0.8.1 utilsforecast>=0.0.5 ray_requirements = fugue[ray]>=0.8.1 protobuf>=3.15.3,<4.0.0 dask_requirements = fugue[dask]>=0.8.1 spark_requirements = fugue[spark]>=0.8.1 plotly_requirements = plotly plotly-resampler -dev_requirements = nbdev black mypy flake8 ray protobuf>=3.15.3,<4.0.0 matplotlib pmdarima prophet scikit-learn fugue[dask,ray,spark]>=0.8.1 datasetsforecast supersmoother +dev_requirements = nbdev black mypy flake8 ray protobuf>=3.15.3,<4.0.0 matplotlib pmdarima prophet scikit-learn fugue[dask,ray,spark]>=0.8.1 datasetsforecast supersmoother nbdev_plotly nbs_path = nbs doc_path = _docs recursive = True From 88e39edda49cabb021efbfe732c30d2072e3bbe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 14:31:20 -0600 Subject: [PATCH 15/22] move scripts to submodule --- .github/workflows/build-docs.yaml | 15 ++- .gitmodules | 4 + action_files/docs-final-formatting.bash | 13 -- action_files/docs_replace_imgs.py | 29 ---- docs-scripts | 1 + nbs/_extensions/mintlify/_extension.yml | 30 ----- nbs/_extensions/mintlify/mintlify.lua | 61 --------- nbs/_extensions/mintlify/mintlify_utils.lua | 33 ----- nbs/_extensions/mintlify/mintlify_writer.lua | 133 ------------------- nbs/_quarto.yml | 10 +- nbs/favicon.svg | 5 - nbs/imgs/logo/dark.png | Bin 2883 -> 0 bytes nbs/imgs/logo/light.png | Bin 2851 -> 0 bytes preview-mintlify-docs.bash | 20 --- 14 files changed, 22 insertions(+), 332 deletions(-) create mode 100644 .gitmodules delete mode 100755 action_files/docs-final-formatting.bash delete mode 100644 action_files/docs_replace_imgs.py create mode 160000 docs-scripts delete mode 100644 nbs/_extensions/mintlify/_extension.yml delete mode 100644 nbs/_extensions/mintlify/mintlify.lua delete mode 100644 nbs/_extensions/mintlify/mintlify_utils.lua delete mode 100644 nbs/_extensions/mintlify/mintlify_writer.lua delete mode 100644 nbs/favicon.svg delete mode 100644 nbs/imgs/logo/dark.png delete mode 100644 nbs/imgs/logo/light.png delete mode 100644 preview-mintlify-docs.bash diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index 139ffd77b..4492b0d82 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -2,6 +2,8 @@ name: "build-docs" on: push: branches: ["main"] + pull_request: + branches: ["main"] workflow_dispatch: jobs: build-docs: @@ -12,24 +14,27 @@ jobs: with: cache: "pip" cache-dependency-path: settings.ini + submodules: true - name: Install Dependencies shell: bash run: | set -ux python -m pip install --upgrade pip pip install -Uq nbdev - test -f setup.py && pip install -e ".[dev]" + test -f setup.py && pip install ".[dev]" + mkdir nbs/_extensions + cp -r docs-scripts/mintlify/ nbs/_extensions/ + python docs-scripts/update-quarto.py nbdev_docs - name: Apply final formats shell: bash - run: bash ./action_files/docs-final-formatting.bash + run: bash ./docs-scripts/docs-final-formatting.bash - name: Copy over necessary assets run: | cp nbs/mint.json _docs/mint.json - cp nbs/imgs/logo/dark.png _docs/dark.png - cp nbs/imgs/logo/light.png _docs/light.png - cp nbs/favicon.svg _docs/favicon.svg + cp docs-scripts/imgs/* _docs/ - name: Deploy to Mintlify Docs + if: github.event_name == 'push' uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..b09d038f8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "docs-scripts"] + path = docs-scripts + url = git@github.com:Nixtla/docs.git + branch = scripts diff --git a/action_files/docs-final-formatting.bash b/action_files/docs-final-formatting.bash deleted file mode 100755 index 07f0badb1..000000000 --- a/action_files/docs-final-formatting.bash +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -for file in $(find _docs -type f -name "*mdx"); do - if [[ "$OSTYPE" == "darwin"* ]]; then - sed -i '' -e 's/style="float:right; font-size:smaller"/style={{ float: "right", fontSize: "smaller" }}/g' $file - sed -i '' -e 's/
    //g' $file - else - sed -i -e 's/style="float:right; font-size:smaller"/style={{ float: "right", fontSize: "smaller" }}/g' $file - sed -i -e 's/
    //g' $file - fi -done - -python3 "$(dirname "$0")/docs_replace_imgs.py" \ No newline at end of file diff --git a/action_files/docs_replace_imgs.py b/action_files/docs_replace_imgs.py deleted file mode 100644 index 9920c2da7..000000000 --- a/action_files/docs_replace_imgs.py +++ /dev/null @@ -1,29 +0,0 @@ -import os -from pathlib import Path -import re - -def main(): - dir_path = os.path.dirname(os.path.realpath(__file__)) - docs_path = os.path.abspath(os.path.join(dir_path, '../_docs')) - docs_path_obj = Path(docs_path) - paths_in_dir = docs_path_obj.glob('**/*.mdx') - pattern = r'!\[\]\(((?!https:\/\/).+?)\)' - - for file_path in paths_in_dir: - if file_path.is_file(): - folder_arr = file_path.parts[len(docs_path_obj.parts):-1] - content = file_path.read_text() - content = re.sub(pattern, url_replace(folder_arr), content) - file_path.write_text(content) - -def url_replace(folder_arr): - def url_replace_helper(match): - curr_url = Path(match[1]) - new_url = str(Path(*folder_arr).joinpath(curr_url)) - if not new_url.startswith('/'): - new_url = '/' + new_url - return '![](' + str(new_url) + ')' - return url_replace_helper - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/docs-scripts b/docs-scripts new file mode 160000 index 000000000..a1f3370b6 --- /dev/null +++ b/docs-scripts @@ -0,0 +1 @@ +Subproject commit a1f3370b64071e6926acb389f8af8fb5d80cb892 diff --git a/nbs/_extensions/mintlify/_extension.yml b/nbs/_extensions/mintlify/_extension.yml deleted file mode 100644 index 663084de9..000000000 --- a/nbs/_extensions/mintlify/_extension.yml +++ /dev/null @@ -1,30 +0,0 @@ -title: Mintlify -author: Mintlify, Inc -organization: Mintlify -contributes: - project: - project: - type: default - detect: - - ["mint.json"] - render: - - "**/*.md" - - "**/*.qmd" - - "**/*.ipynb" - format: mintlify-md - formats: - md: - # Although we use a custom writer, we still need the variants here the lua filters to render correctly. - # Ideally, we would forward the variants to the custom writer. - variant: gfm+pipe_tables+tex_math_dollars+raw_html+all_symbols_escapable+backtick_code_blocks+space_in_atx_header+intraword_underscores+lists_without_preceding_blankline+shortcut_reference_links - writer: mintlify_writer.lua - output-ext: mdx - inline-includes: true - preserve-yaml: true - wrap: none - fig-format: retina - fig-width: 8 - fig-height: 5 - html-math-method: webtex - filters: - - mintlify.lua diff --git a/nbs/_extensions/mintlify/mintlify.lua b/nbs/_extensions/mintlify/mintlify.lua deleted file mode 100644 index b95554781..000000000 --- a/nbs/_extensions/mintlify/mintlify.lua +++ /dev/null @@ -1,61 +0,0 @@ --- mintlify.lua - -local kQuartoRawHtml = "quartoRawHtml" -local rawHtmlVars = pandoc.List() - -function Pandoc(doc) - -- insert exports at the top if we have them - if #rawHtmlVars > 0 then - local exports = ("export const %s =\n[%s];"):format(kQuartoRawHtml, - table.concat( - rawHtmlVars:map(function(var) return '`'.. var .. '`' end), - "," - ) - ) - doc.blocks:insert(1, pandoc.RawBlock("markdown", exports .. "\n")) - end - - return doc -end - - --- strip image attributes (which may result from --- fig-format: retina) as they will result in an --- img tag which won't hit the asset pipeline -function Image(el) - el.attr = pandoc.Attr() - return el -end - --- header attributes only support id -function Header(el) - el.attr = pandoc.Attr(el.identifier) - return el -end - -Block = function(node) - if node.text ~= nil and string.find(node.text, "") - :format(kQuartoRawHtml, #rawHtmlVars-1) .. "\n" - return pandoc.RawBlock("html", html) - end -end diff --git a/nbs/_extensions/mintlify/mintlify_utils.lua b/nbs/_extensions/mintlify/mintlify_utils.lua deleted file mode 100644 index ae076ddaa..000000000 --- a/nbs/_extensions/mintlify/mintlify_utils.lua +++ /dev/null @@ -1,33 +0,0 @@ -function codeBlock(el, filename) - local lang = el.attr.classes[1] - local title = filename or el.attr.attributes["filename"] or el.attr.attributes["title"] - local showLineNumbers = el.attr.classes:includes('number-lines') - if lang or title or showLineNumbers then - if not lang then - lang = 'text' - end - local code = "\n```" .. lang - if showLineNumbers then - code = code .. " showLineNumbers" - end - if title then - code = code .. " title=\"" .. title .. "\"" - end - code = code .. "\n" .. el.text .. "\n```\n" - - -- docusaures code block attributes don't conform to any syntax - -- that pandoc natively understands, so return the CodeBlock as - -- "raw" markdown (so it bypasses pandoc processing entirely) - return pandoc.RawBlock("markdown", code) - - elseif #el.attr.classes == 0 then - el.attr.classes:insert('text') - return el - end - - return nil -end - -return { - codeBlock = codeBlock -} \ No newline at end of file diff --git a/nbs/_extensions/mintlify/mintlify_writer.lua b/nbs/_extensions/mintlify/mintlify_writer.lua deleted file mode 100644 index 9fa2d7110..000000000 --- a/nbs/_extensions/mintlify/mintlify_writer.lua +++ /dev/null @@ -1,133 +0,0 @@ -local codeBlock = require('mintlify_utils').codeBlock - -local reactPreamble = pandoc.List() - -function capitalizeFirstLetter(str) - return (str:gsub("^%l", string.upper)) -end - -function castToMintlifyCallout(str) - if str == "caution" or str == "danger" then - return "Warning" - else - return capitalizeFirstLetter(str) - end -end - -local function addPreamble(preamble) - if not reactPreamble:includes(preamble) then - reactPreamble:insert(preamble) - end -end - -local function jsx(content) - return pandoc.RawBlock("markdown", content) -end - -local function tabset(node, filter) - -- note groupId - local groupId = "" - local group = node.attr.attributes["group"] - if group then - groupId = ([[ groupId="%s"]]):format(group) - end - - -- create tabs - local tabs = pandoc.Div({}) - tabs.content:insert(jsx("")) - - -- iterate through content - for i = 1, #node.tabs do - local content = node.tabs[i].content - local title = node.tabs[i].title - - tabs.content:insert(jsx(([[]]):format(pandoc.utils.stringify(title)))) - local result = quarto._quarto.ast.walk(content, filter) - if type(result) == "table" then - tabs.content:extend(result) - else - tabs.content:insert(result) - end - tabs.content:insert(jsx("")) - end - - -- end tab and tabset - tabs.content:insert(jsx("")) - - -- ensure we have required deps - addPreamble("import Tabs from '@theme/Tabs';") - addPreamble("import TabItem from '@theme/TabItem';") - - return tabs -end - -function Writer(doc, opts) - local filter - filter = { - CodeBlock = codeBlock, - - DecoratedCodeBlock = function(node) - local el = node.code_block - return codeBlock(el, node.filename) - end, - - Tabset = function(node) - return tabset(node, filter) - end, - - RawBlock = function (rawBlock) - -- We just "pass-through" raw blocks of type "confluence" - if(rawBlock.format == 'plotly') then - quarto.utils.dump("Plotly in filter") - return pandoc.RawBlock('html', rawBlock.text) - end - - -- Raw blocks inclding arbirtary HTML like JavaScript are not supported in CSF - return "" - end, - - Callout = function(node) - local admonition = pandoc.Div({}) - local mintlifyCallout = castToMintlifyCallout(node.type) - admonition.content:insert(jsx("<" .. mintlifyCallout .. ">")) - if node.title then - admonition.content:insert(pandoc.Header(3, node.title)) - end - local content = node.content - if type(content) == "table" then - admonition.content:extend(content) - else - admonition.content:insert(content) - end - admonition.content:insert(jsx("")) - return admonition - end - } - - doc = quarto._quarto.ast.walk(doc, filter) - - -- insert react preamble if we have it - if #reactPreamble > 0 then - local preamble = table.concat(reactPreamble, "\n") - doc.blocks:insert(1, pandoc.RawBlock("markdown", preamble .. "\n")) - end - - local extensions = { - yaml_metadata_block = true, - pipe_tables = true, - footnotes = true, - tex_math_dollars = true, - raw_html = true, - all_symbols_escapable = true, - backtick_code_blocks = true, - space_in_atx_header = true, - intraword_underscores = true, - lists_without_preceding_blankline = true, - shortcut_reference_links = true, - } - - return pandoc.write(doc, { - format = 'markdown_strict', - extensions = extensions - }, opts) -end diff --git a/nbs/_quarto.yml b/nbs/_quarto.yml index 26cbcb454..60097036f 100644 --- a/nbs/_quarto.yml +++ b/nbs/_quarto.yml @@ -1,9 +1,13 @@ project: - type: mintlify + type: website format: - mintlify-md: - code-fold: true + html: + theme: cosmo + fontsize: 1em + linestretch: 1.7 + css: styles.css + toc: true website: twitter-card: diff --git a/nbs/favicon.svg b/nbs/favicon.svg deleted file mode 100644 index e5f333428..000000000 --- a/nbs/favicon.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/nbs/imgs/logo/dark.png b/nbs/imgs/logo/dark.png deleted file mode 100644 index 4142a0bbde38d8801c80e73a8fa18df0baffb465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 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 diff --git a/nbs/imgs/logo/light.png b/nbs/imgs/logo/light.png deleted file mode 100644 index bbb99b5497a62503432e3c770f9fd6290b304ed6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 zcmXYzdpwivAIFhuIb|_hD9Q6Qa+skICdZL89TaV?{X#`#L~JC7oaITXpD}aj@Df=q z)59hkmP0wD=9!QrGiQcj_-#GEKknhRdZsulUy}w*vu#klW6x9QQf}LCob0sAch?T&B|VwEgKDBWqZx(jn42EtI4#6nTwQ9ZPkOU+>0W4ufXG6h}g|HuAa4%lxYQxj4O-+eY|JW&R>C#Bl&2JK!hM94v0E z-HSV%_5==?$+}b!E)h_&=c@ehkBiprZJXo3470R#;^{;^xyhx2@fjqCxu2<&uKn;X z0rF6MDQD4&(B`OWtIp^}n8b0Q6ZRRR+$$y?1zRP0^=nsf z`cmpIt6oD3N5X%tGN<;7qc2?p0J`46}3wSsadH;&m84$6e3_c7AKsZDK1!#0Z| z)ha#6wuK3nu9#TS0rZ`pN}R^R{ulS3RyC9mcD@G*HU3O6-B`ITPd41EvYg&mCs8_E zan2n*?R>QpzRRtNSYe!91dcyc!5KV;@G`W8 zcQBu^?6@EyXbw|w+`(Bxo}E+mTOJ!Ys?vc|4JlGNAGQWeszI`A`nBoN3t2>5&6 z>7{SCZ>~2&`qe_tN`OH>jQ?co_R(gOBTyQIkBc%(o2lOpz^J&P3tX!zy z4|DStV|8sWq4PJMex?Mcrq&9o#_?%c0*$lOx_h-YyS?2ojSXU0Bm~?nQY@NtU8Qx7 z&SpOIFb*syw5U>VdWn81!LuDds4&vc@Go>ISK5eIAszN+)D~aHLh`Nzde*=TCMFaB zYfGDj{X{@in;%rOrf>Ej_Y1>tp~$MuSdJWe*dXKY%DmSZKLS|h+-Hvq>R28GJFO9$ z+U(BuV`*$vgu~Y3;j+n-t3!>?+)pAvUms;dLhXu3yIYNA$nHYK(d7f1`0GOF_?%K| zB4N2(FIsWq(*B|cAQn~*ea$`Ra>JA)Y4=!XK(39Q0v*_q0^7$kopid26dPW5=V2#$ zoWe1-23Xwd%RJNFD~`IPDOySj;gWL6*iLrIp|ldf_yde@s0=}3v!N+7GuAjU*l0M0 z+XuHUncvTyn4Z1Yp#T416kwbQ-b3}m`*3^27+AVfb8wf?29jWE-u7?{Wgydh)%c9d zYWxRrS`)F&6lgkmw|()v2Nf3kujZXBpM7Bf+}SWcjZZ zrL2cDh37lVL(7B`ro|R9_(B4uaZWg!ug)Urj_sIa?6vt8O+-da@45Wk={cB@UYRhO zb-7ARBhI)#3uQn@eI{jH!FwJ~V*?T7#FuVm^!JA}CxCQN{9VX3Wp2u=ai8Np|L&0* zHwC7~PVjG=_~UY{=BQ}}CrGg{YTG<7icy|xk>MUR6g*4vD$=#BX*x1oGC!C@Cu~|h z0JGw05!BFGB^l zE#U_{>xqF_3&tx;2v_!Hr5SoCdgmv#MMtlykwHWx#%flceMkUgxOj8dy?GL(!?pYA zCx-QpCoTB5{rsuM!UE7;YZJ+*K7YA*?t2K?U0~LLTFIA>6Mko^ZHymzAA#b6T`xz}OKLMv4}aVY0#xKhkpsJZ6Mxo{o(gA`Q# z3)=^Yt$X^EVb0;qY3T?RcJlgAWhXe2;Ms3MI{!SzSQyawai4-lo|1U{L<$Z z$%pYZO#QHgF2NB0nJSr3<7BXo-@oktpfcRE&X^d_hE|Nd z!DmpAu0w3~4=p}MzLvtfx7<$U@~R&*>tNYP9t?kXOE(}_a#o3MC(#C$KSdVrt|$~T zEdOCf+z>M~HnrBeS8(1^wQLq5 z#(8?(U^DVBiC8|At;XwgJOOU6YRILO(SFE_1i$4|Op6pa^U<5B-b~3SBFKkpQgE}s zrn?UY)l--NA;@$7zr3UCrv{LMv-qT@;WFA~IRXljZ0syNTv%rX?^m$&ym*$d% Date: Thu, 19 Oct 2023 14:52:02 -0600 Subject: [PATCH 16/22] set submodules to recursive --- .github/workflows/build-docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index 4492b0d82..65f5d50e7 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -14,7 +14,7 @@ jobs: with: cache: "pip" cache-dependency-path: settings.ini - submodules: true + submodules: 'recursive' - name: Install Dependencies shell: bash run: | From 719fc49016ed730eb7a63daa7a50d8c4dcff008e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 14:54:49 -0600 Subject: [PATCH 17/22] place recursive in right action --- .github/workflows/build-docs.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index 65f5d50e7..7f1cb926e 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -10,11 +10,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + with: + submodules: 'recursive' - uses: actions/setup-python@v4 with: cache: "pip" - cache-dependency-path: settings.ini - submodules: 'recursive' + cache-dependency-path: dev/requirements.txt - name: Install Dependencies shell: bash run: | From fdf37e66884cecf062f06cc5138fffab18f00d6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 14:59:45 -0600 Subject: [PATCH 18/22] set python version --- .github/workflows/build-docs.yaml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index 7f1cb926e..cdf70629e 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -5,6 +5,11 @@ on: pull_request: branches: ["main"] workflow_dispatch: + +defaults: + run: + shell: bash -l {0} + jobs: build-docs: runs-on: ubuntu-latest @@ -15,20 +20,17 @@ jobs: - uses: actions/setup-python@v4 with: cache: "pip" + python-version: '3.10' cache-dependency-path: dev/requirements.txt - name: Install Dependencies - shell: bash + run: pip install -r dev/requirements.txt . + - name: Build docs run: | - set -ux - python -m pip install --upgrade pip - pip install -Uq nbdev - test -f setup.py && pip install ".[dev]" mkdir nbs/_extensions cp -r docs-scripts/mintlify/ nbs/_extensions/ python docs-scripts/update-quarto.py nbdev_docs - name: Apply final formats - shell: bash run: bash ./docs-scripts/docs-final-formatting.bash - name: Copy over necessary assets run: | From 0d95521783599c859917a3ce8ffe393437daa392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 15:09:49 -0600 Subject: [PATCH 19/22] updates --- .github/workflows/build-docs.yaml | 2 +- docs-scripts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index cdf70629e..f53865669 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -23,7 +23,7 @@ jobs: python-version: '3.10' cache-dependency-path: dev/requirements.txt - name: Install Dependencies - run: pip install -r dev/requirements.txt . + run: pip install ".[dev]" - name: Build docs run: | mkdir nbs/_extensions diff --git a/docs-scripts b/docs-scripts index a1f3370b6..d63d02696 160000 --- a/docs-scripts +++ b/docs-scripts @@ -1 +1 @@ -Subproject commit a1f3370b64071e6926acb389f8af8fb5d80cb892 +Subproject commit d63d02696ad23a3104636207152d2ac393291315 From 9c3de0cbc2e998febaafa8713d9af3976c0c602e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 15:15:07 -0600 Subject: [PATCH 20/22] restore editable --- .github/workflows/build-docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index f53865669..bb5569b40 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -23,7 +23,7 @@ jobs: python-version: '3.10' cache-dependency-path: dev/requirements.txt - name: Install Dependencies - run: pip install ".[dev]" + run: pip install -e ".[dev]" - name: Build docs run: | mkdir nbs/_extensions From a928c757eb2bebb5014e45a3fba2879058316fd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 15:22:46 -0600 Subject: [PATCH 21/22] restore commands --- .github/workflows/build-docs.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index bb5569b40..e132568f7 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -8,7 +8,7 @@ on: defaults: run: - shell: bash -l {0} + shell: bash jobs: build-docs: @@ -21,11 +21,13 @@ jobs: with: cache: "pip" python-version: '3.10' - cache-dependency-path: dev/requirements.txt - - name: Install Dependencies - run: pip install -e ".[dev]" + cache-dependency-path: settings.ini - name: Build docs run: | + set -ux + python -m pip install --upgrade pip + pip install -Uq nbdev + pip install -e ".[dev]" mkdir nbs/_extensions cp -r docs-scripts/mintlify/ nbs/_extensions/ python docs-scripts/update-quarto.py From e750b63858aaa55ca853a7f92bb8e35a9e2d6a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Morales?= Date: Thu, 19 Oct 2023 15:34:23 -0600 Subject: [PATCH 22/22] move proc to script --- .github/workflows/build-docs.yaml | 1 + settings.ini | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docs.yaml b/.github/workflows/build-docs.yaml index e132568f7..8209bdabe 100644 --- a/.github/workflows/build-docs.yaml +++ b/.github/workflows/build-docs.yaml @@ -31,6 +31,7 @@ jobs: mkdir nbs/_extensions cp -r docs-scripts/mintlify/ nbs/_extensions/ python docs-scripts/update-quarto.py + echo "procs = nbdev_plotly.plotly:PlotlyProc" >> settings.ini nbdev_docs - name: Apply final formats run: bash ./docs-scripts/docs-final-formatting.bash diff --git a/settings.ini b/settings.ini index 00bcc3f86..abdcc7497 100644 --- a/settings.ini +++ b/settings.ini @@ -33,4 +33,3 @@ black_formatting = True jupyter_hooks = True clean_ids = True readme_nb = index.ipynb -procs = nbdev_plotly.plotly:PlotlyProc