Repository: Nixtla/hierarchicalforecast (language: python)

Issue:
[FEAT] Update example notebooks with statsforecast v1



Discussion / hints:

Fix patch:
diff --git a/.gitconfig b/.gitconfig
deleted file mode 100644
index 4f7288dc..00000000
--- a/.gitconfig
+++ /dev/null
@@ -1,16 +0,0 @@
-# Generated by nbdev_install_git_hooks
-#
-# If you need to disable this instrumentation do:
-#   git config --local --unset include.path
-#
-# To restore the filter
-#   git config --local include.path .gitconfig
-#
-# If you see notebooks not stripped, checked the filters are applied in .gitattributes
-#
-[filter "clean-nbs"]
-        clean = nbdev_clean_nbs --read_input_stream True
-        smudge = cat
-        required = true
-[diff "ipynb"]
-        textconv = nbdev_clean_nbs --disp True --fname
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 18fce022..ce0d6e42 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,23 +21,17 @@ jobs:
         uses: actions/setup-python@v2
 
       - name: Install nbdev
-        run: pip install nbdev==1.2.10
-
-      - name: Read all notebooks
-        run: nbdev_read_nbs
+        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"
-          nbdev_clean_nbs
+          nbdev_clean
           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"; false; fi
-      - name: Check if there is no diff library/notebooks
-        run: |
-          if [ -n "$(nbdev_diff_nbs)" ]; then echo -e "!!! Detected difference between the notebooks and the library"; false; fi
 
   run-tests:
     runs-on: ${{ matrix.os }}
@@ -60,7 +54,7 @@ jobs:
           environment-file: environment.yml
 
       - name: Install pip requirements
-        run: pip install nbdev==1.2.10 ./
+        run: pip install ./
 
       - name: Run tests
-        run: nbdev_test_nbs
+        run: nbdev_test
diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml
new file mode 100644
index 00000000..22c44cba
--- /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: macos-latest
+    steps: [uses: fastai/workflows/quarto-ghp@master]
diff --git a/.gitignore b/.gitignore
index 37e9e482..9be50873 100644
--- a/.gitignore
+++ b/.gitignore
@@ -134,3 +134,5 @@ dmypy.json
 */data/*
 
 Gemfile.lock
+_docs/
+sidebar.yml
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 7a5e4ab4..00000000
--- a/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-.ONESHELL:
-SHELL := /bin/bash
-SRC = $(wildcard nbs/*.ipynb)
-
-all: datasetsforecast docs
-
-datasetsforecast: $(SRC)
-	nbdev_build_lib
-	touch datasetsforecast
-
-sync:
-	nbdev_update_lib
-
-docs_serve: docs
-	cd docs && bundle exec jekyll serve
-
-docs: $(SRC)
-	nbdev_build_docs --mk_readme False
-	touch docs
-
-build_docs:
-	nbdev_build_docs --mk_readme False
-	nbdev_build_docs --fname "examples/*.ipynb" --mk_readme False
-
-test:
-	nbdev_test_nbs
-
-release: pypi conda_release
-	nbdev_bump_version
-
-conda_release:
-	fastrelease_conda_package
-
-pypi: dist
-	twine upload --repository pypi dist/*
-
-dist: clean
-	python setup.py sdist bdist_wheel
-
-clean:
-	rm -rf dist
diff --git a/README.md b/README.md
index 2cbdd367..b80aeb77 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ from hierarchicalforecast.evaluation import HierarchicalEvaluation
 from hierarchicalforecast.methods import BottomUp, TopDown, MiddleOut
 # compute base forecast no coherent
 from statsforecast.core import StatsForecast
-from statsforecast.models import auto_arima, naive
+from statsforecast.models import AutoARIMA, Naive
 
 # Load TourismSmall dataset
 Y_df, S, tags = HierarchicalData.load('./data', 'TourismSmall')
@@ -87,7 +87,12 @@ Y_df_test = Y_df_test.set_index('unique_id')
 Y_df_train = Y_df_train.set_index('unique_id')
 
 # Compute base auto-ARIMA predictions
-fcst = StatsForecast(df=Y_df_train, models=[(auto_arima,12), naive], freq='M', n_jobs=-1)
+fcst = StatsForecast(
+    df=Y_df_train, 
+    models=[AutoARIMA(season_length=12), Naive()], 
+    freq='M', 
+    n_jobs=-1
+)
 Y_hat_df = fcst.forecast(h=12)
 
 # Reconcile the base predictions
@@ -108,7 +113,7 @@ def mse(y, y_hat):
 
 evaluator = HierarchicalEvaluation(evaluators=[mse])
 evaluator.evaluate(Y_h=Y_rec_df, Y_test=Y_df_test, 
-                   tags=tags, benchmark='naive')
+                   tags=tags, benchmark='Naive')
 ```
 
 ##  How to cite
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index 57510a2b..00000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1,1 +0,0 @@
-_site/
diff --git a/docs/AustralianDomesticTourism.html b/docs/AustralianDomesticTourism.html
deleted file mode 100644
index ca3db544..00000000
--- a/docs/AustralianDomesticTourism.html
+++ /dev/null
@@ -1,1062 +0,0 @@
----
-
-title: Forecasting Australian domestic tourism
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "examples/AustralianDomesticTourism.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: examples/AustralianDomesticTourism.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p><a href="https://colab.research.google.com/github/Nixtla/hierarchicalforecast/blob/main/examples/AustralianDomesticTourism.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a></p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In many cases, only the time series at the lowest level of the hierarchies (bottom time series) are available. <code>HierarchicalForecast</code> has tools to create time series for all hierarchies. In this notebook we will see how to do it.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">hierarchicalforecast</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">statsforecast</span> <span class="n">numba</span> <span class="n">statsmodels</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-
-<span class="c1">#obtain hierarchical reconciliation methods and evaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.core</span> <span class="kn">import</span> <span class="n">HierarchicalReconciliation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.evaluation</span> <span class="kn">import</span> <span class="n">HierarchicalEvaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.methods</span> <span class="kn">import</span> <span class="n">BottomUp</span><span class="p">,</span> <span class="n">MinTrace</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.utils</span> <span class="kn">import</span> <span class="n">aggregate</span>
-<span class="c1"># compute base forecast no coherent</span>
-<span class="kn">from</span> <span class="nn">statsforecast.core</span> <span class="kn">import</span> <span class="n">StatsForecast</span>
-<span class="kn">from</span> <span class="nn">statsforecast.models</span> <span class="kn">import</span> <span class="n">ets</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Aggregate-bottom-time-series">Aggregate bottom time series<a class="anchor-link" href="#Aggregate-bottom-time-series"> </a></h2>
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In this example we will use the <a href="https://otexts.com/fpp3/tourism.html">Tourism</a> dataset from the <a href="https://otexts.com/fpp3/">Forecasting: Principles and Practice</a> book. The dataset only contains the time series at the lowest level, so we need to create the time series for all hierarchies.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/tourism.csv&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">rename</span><span class="p">({</span><span class="s1">&#39;Trips&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="s1">&#39;Quarter&#39;</span><span class="p">:</span> <span class="s1">&#39;ds&#39;</span><span class="p">},</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Australia&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="p">[[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Region&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Purpose&#39;</span><span class="p">,</span> <span class="s1">&#39;ds&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">]]</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">str</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;(\d+) (Q\d)&#39;</span><span class="p">,</span> <span class="sa">r</span><span class="s1">&#39;\1-\2&#39;</span><span class="p">,</span> <span class="n">regex</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">])</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Country</th>
-      <th>Region</th>
-      <th>State</th>
-      <th>Purpose</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>Adelaide</td>
-      <td>South Australia</td>
-      <td>Business</td>
-      <td>1998-01-01</td>
-      <td>135.077690</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>Adelaide</td>
-      <td>South Australia</td>
-      <td>Business</td>
-      <td>1998-04-01</td>
-      <td>109.987316</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>Adelaide</td>
-      <td>South Australia</td>
-      <td>Business</td>
-      <td>1998-07-01</td>
-      <td>166.034687</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>Adelaide</td>
-      <td>South Australia</td>
-      <td>Business</td>
-      <td>1998-10-01</td>
-      <td>127.160464</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>Adelaide</td>
-      <td>South Australia</td>
-      <td>Business</td>
-      <td>1999-01-01</td>
-      <td>137.448533</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataset can be grouped in the following non-strictly hierarchical structure.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">spec</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">],</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Purpose&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Region&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Purpose&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Region&#39;</span><span class="p">,</span> <span class="s1">&#39;Purpose&#39;</span><span class="p">]</span>
-<span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>Using the <a href="/hierarchicalforecast/utils.html#aggregate"><code>aggregate</code></a> function from <code>HierarchicalForecast</code> we can get the full set of time series.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="n">aggregate</span><span class="p">(</span><span class="n">Y_df</span><span class="p">,</span> <span class="n">spec</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>unique_id</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>1998-01-01</td>
-      <td>23182.197269</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>1998-04-01</td>
-      <td>20323.380067</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>1998-07-01</td>
-      <td>19826.640511</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>1998-10-01</td>
-      <td>20830.129891</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>1999-01-01</td>
-      <td>22087.353380</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">S</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:</span><span class="mi">5</span><span class="p">,</span> <span class="p">:</span><span class="mi">5</span><span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Australia/ACT/Canberra/Business</th>
-      <th>Australia/ACT/Canberra/Holiday</th>
-      <th>Australia/ACT/Canberra/Other</th>
-      <th>Australia/ACT/Canberra/Visiting</th>
-      <th>Australia/New South Wales/Blue Mountains/Business</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/ACT</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/New South Wales</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/Northern Territory</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/Queensland</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Purpose&#39;</span><span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-
-<div class="output_text output_subarea output_execute_result">
-<pre>array([&#39;Australia/Business&#39;, &#39;Australia/Holiday&#39;, &#39;Australia/Other&#39;,
-       &#39;Australia/Visiting&#39;], dtype=object)</pre>
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Split-Train/Test-sets">Split Train/Test sets<a class="anchor-link" href="#Split-Train/Test-sets"> </a></h3><p>We use the final two years (8 quarters) as test set.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tail</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Y_df_test</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df_test</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df_train</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_train</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">size</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-
-<div class="output_text output_subarea output_execute_result">
-<pre>unique_id
-Australia                                                72
-Australia/ACT                                            72
-Australia/ACT/Business                                   72
-Australia/ACT/Canberra                                   72
-Australia/ACT/Canberra/Business                          72
-                                                         ..
-Australia/Western Australia/Experience Perth/Other       72
-Australia/Western Australia/Experience Perth/Visiting    72
-Australia/Western Australia/Holiday                      72
-Australia/Western Australia/Other                        72
-Australia/Western Australia/Visiting                     72
-Length: 425, dtype: int64</pre>
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Computing-base-forecasts">Computing base forecasts<a class="anchor-link" href="#Computing-base-forecasts"> </a></h2><p>The following cell computes the <strong>base forecasts</strong> for each time series in <code>Y_df</code> using the <code>auto_arima</code> and <code>naive</code> models. Observe that <code>Y_hat_df</code> contains the forecasts but they are not coherent.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fcst</span> <span class="o">=</span> <span class="n">StatsForecast</span><span class="p">(</span><span class="n">df</span><span class="o">=</span><span class="n">Y_df_train</span><span class="p">,</span> 
-                     <span class="n">models</span><span class="o">=</span><span class="p">[(</span><span class="n">ets</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">&#39;ZZA&#39;</span><span class="p">)],</span> 
-                     <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;QS&#39;</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_hat_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast</span><span class="p">(</span><span class="n">h</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">fitted</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-<span class="n">Y_fitted_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast_fitted_values</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Reconcile-forecasts">Reconcile forecasts<a class="anchor-link" href="#Reconcile-forecasts"> </a></h2><p>The following cell makes the previous forecasts coherent using the <a href="/hierarchicalforecast/core.html#HierarchicalReconciliation"><code>HierarchicalReconciliation</code></a> class. Since the hierarchy structure is not strict, we can't use methods such as <a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a> or <a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>. In this example we use <a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a> and <a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a>.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">reconcilers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="n">BottomUp</span><span class="p">(),</span>
-    <span class="n">MinTrace</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;mint_shrink&#39;</span><span class="p">),</span>
-    <span class="n">MinTrace</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;ols&#39;</span><span class="p">)</span>
-<span class="p">]</span>
-<span class="n">hrec</span> <span class="o">=</span> <span class="n">HierarchicalReconciliation</span><span class="p">(</span><span class="n">reconcilers</span><span class="o">=</span><span class="n">reconcilers</span><span class="p">)</span>
-<span class="n">Y_rec_df</span> <span class="o">=</span> <span class="n">hrec</span><span class="o">.</span><span class="n">reconcile</span><span class="p">(</span><span class="n">Y_hat_df</span><span class="p">,</span> <span class="n">Y_fitted_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataframe <code>Y_rec_df</code> contains the reconciled forecasts.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_rec_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>ds</th>
-      <th>ets_season_length-4_model-ZZA</th>
-      <th>ets_season_length-4_model-ZZA/BottomUp</th>
-      <th>ets_season_length-4_model-ZZA/MinTrace_method-mint_shrink</th>
-      <th>ets_season_length-4_model-ZZA/MinTrace_method-ols</th>
-    </tr>
-    <tr>
-      <th>unique_id</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>2016-01-01</td>
-      <td>25990.068359</td>
-      <td>24379.683594</td>
-      <td>25438.888305</td>
-      <td>25894.418893</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2016-04-01</td>
-      <td>24458.490234</td>
-      <td>22902.664062</td>
-      <td>23925.188497</td>
-      <td>24357.230480</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2016-07-01</td>
-      <td>23974.056641</td>
-      <td>22412.984375</td>
-      <td>23440.310292</td>
-      <td>23865.929521</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2016-10-01</td>
-      <td>24563.455078</td>
-      <td>23127.638672</td>
-      <td>24101.001789</td>
-      <td>24470.783968</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2017-01-01</td>
-      <td>25990.068359</td>
-      <td>24516.175781</td>
-      <td>25556.667568</td>
-      <td>25901.382401</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Evaluation">Evaluation<a class="anchor-link" href="#Evaluation"> </a></h2><p>The <code>HierarchicalForecast</code> package includes the <a href="/hierarchicalforecast/evaluation.html#HierarchicalEvaluation"><code>HierarchicalEvaluation</code></a> class to evaluate the different hierarchies and also is capable of compute scaled metrics compared to a benchmark model.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">rmse</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">):</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">((</span><span class="n">y</span><span class="o">-</span><span class="n">y_hat</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)))</span>
-
-<span class="k">def</span> <span class="nf">mase</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">,</span> <span class="n">y_insample</span><span class="p">,</span> <span class="n">seasonality</span><span class="o">=</span><span class="mi">4</span><span class="p">):</span>
-    <span class="n">errors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">y_hat</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="n">scale</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y_insample</span><span class="p">[:,</span> <span class="n">seasonality</span><span class="p">:]</span> <span class="o">-</span> <span class="n">y_insample</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="n">seasonality</span><span class="p">]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">errors</span> <span class="o">/</span> <span class="n">scale</span><span class="p">)</span>
-
-<span class="n">eval_tags</span> <span class="o">=</span> <span class="p">{}</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Total&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Purpose&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Purpose&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;State&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State&#39;</span><span class="p">]</span><span class="c1">#np.concatenate([val for key, val in tags.items() if &#39;State&#39; in key])</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Regions&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State/Region&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Bottom&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State/Region/Purpose&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;All&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tags</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
-
-<span class="n">evaluator</span> <span class="o">=</span> <span class="n">HierarchicalEvaluation</span><span class="p">(</span><span class="n">evaluators</span><span class="o">=</span><span class="p">[</span><span class="n">rmse</span><span class="p">,</span> <span class="n">mase</span><span class="p">])</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluator</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span>
-        <span class="n">Y_h</span><span class="o">=</span><span class="n">Y_rec_df</span><span class="p">,</span> <span class="n">Y_test</span><span class="o">=</span><span class="n">Y_df_test</span><span class="p">,</span> 
-        <span class="n">tags</span><span class="o">=</span><span class="n">eval_tags</span><span class="p">,</span> <span class="n">Y_df</span><span class="o">=</span><span class="n">Y_df_train</span>
-<span class="p">)</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluation</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="s1">&#39;Overall&#39;</span><span class="p">)</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Base&#39;</span><span class="p">,</span> <span class="s1">&#39;BottomUp&#39;</span><span class="p">,</span> <span class="s1">&#39;MinTrace(mint_shrink)&#39;</span><span class="p">,</span> <span class="s1">&#39;MinTrace(ols)&#39;</span><span class="p">]</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluation</span><span class="o">.</span><span class="n">applymap</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:.2f}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-<div class="output_subarea output_stream output_stderr output_text">
-<pre>/var/folders/7x/1l3vkh3x4_q3s4r36b60s8f00000gn/T/ipykernel_42856/1783873245.py:22: PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.
-  evaluation = evaluation.drop(&#39;Overall&#39;)
-</pre>
-</div>
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="RMSE">RMSE<a class="anchor-link" href="#RMSE"> </a></h3><p>The following table shows the performance measured using RMSE across levels for each reconciliation method.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">evaluation</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s1">&#39;metric == &quot;rmse&quot;&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th></th>
-      <th>Base</th>
-      <th>BottomUp</th>
-      <th>MinTrace(mint_shrink)</th>
-      <th>MinTrace(ols)</th>
-    </tr>
-    <tr>
-      <th>level</th>
-      <th>metric</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Total</th>
-      <th>rmse</th>
-      <td>1743.29</td>
-      <td>3028.93</td>
-      <td>2102.47</td>
-      <td>1818.94</td>
-    </tr>
-    <tr>
-      <th>Purpose</th>
-      <th>rmse</th>
-      <td>534.75</td>
-      <td>791.28</td>
-      <td>574.84</td>
-      <td>515.53</td>
-    </tr>
-    <tr>
-      <th>State</th>
-      <th>rmse</th>
-      <td>308.15</td>
-      <td>413.43</td>
-      <td>315.89</td>
-      <td>287.34</td>
-    </tr>
-    <tr>
-      <th>Regions</th>
-      <th>rmse</th>
-      <td>51.65</td>
-      <td>55.14</td>
-      <td>46.48</td>
-      <td>46.29</td>
-    </tr>
-    <tr>
-      <th>Bottom</th>
-      <th>rmse</th>
-      <td>19.37</td>
-      <td>19.37</td>
-      <td>17.78</td>
-      <td>18.19</td>
-    </tr>
-    <tr>
-      <th>All</th>
-      <th>rmse</th>
-      <td>45.19</td>
-      <td>54.95</td>
-      <td>44.59</td>
-      <td>42.71</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="MASE">MASE<a class="anchor-link" href="#MASE"> </a></h3><p>The following table shows the performance measured using MASE across levels for each reconciliation method.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">evaluation</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s1">&#39;metric == &quot;mase&quot;&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th></th>
-      <th>Base</th>
-      <th>BottomUp</th>
-      <th>MinTrace(mint_shrink)</th>
-      <th>MinTrace(ols)</th>
-    </tr>
-    <tr>
-      <th>level</th>
-      <th>metric</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Total</th>
-      <th>mase</th>
-      <td>1.59</td>
-      <td>3.16</td>
-      <td>2.05</td>
-      <td>1.67</td>
-    </tr>
-    <tr>
-      <th>Purpose</th>
-      <th>mase</th>
-      <td>1.32</td>
-      <td>2.28</td>
-      <td>1.48</td>
-      <td>1.25</td>
-    </tr>
-    <tr>
-      <th>State</th>
-      <th>mase</th>
-      <td>1.39</td>
-      <td>1.90</td>
-      <td>1.39</td>
-      <td>1.25</td>
-    </tr>
-    <tr>
-      <th>Regions</th>
-      <th>mase</th>
-      <td>1.12</td>
-      <td>1.19</td>
-      <td>1.01</td>
-      <td>0.99</td>
-    </tr>
-    <tr>
-      <th>Bottom</th>
-      <th>mase</th>
-      <td>0.98</td>
-      <td>0.98</td>
-      <td>0.94</td>
-      <td>1.01</td>
-    </tr>
-    <tr>
-      <th>All</th>
-      <th>mase</th>
-      <td>1.03</td>
-      <td>1.08</td>
-      <td>0.98</td>
-      <td>1.02</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Comparison-fable">Comparison fable<a class="anchor-link" href="#Comparison-fable"> </a></h3><p>Observe that we can recover the results reported by the <a href="https://otexts.com/fpp3/tourism.html">Forecasting: Principles and Practice</a>. The original results were calculated using the R package <a href="https://github.com/tidyverts/fable">fable</a>.</p>
-<p><img src="/hierarchicalforecast/./AustralianDomesticTourism-results-fable.png" alt="image.png"></p>
-
-</div>
-</div>
-</div>
-</div>
-
-
diff --git a/docs/AustralianPrisonPopulation.html b/docs/AustralianPrisonPopulation.html
deleted file mode 100644
index 4912a67a..00000000
--- a/docs/AustralianPrisonPopulation.html
+++ /dev/null
@@ -1,856 +0,0 @@
----
-
-title: Forecasting Australian prison population
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "examples/AustralianPrisonPopulation.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: examples/AustralianPrisonPopulation.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p><a href="https://colab.research.google.com/github/Nixtla/hierarchicalforecast/blob/main/examples/AustralianPrisonPopulation.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a></p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In this notebook we will explain how to produce coherent forecast for the Australian prison population across diferent groups, replicating the results of the book <a href="https://otexts.com/fpp3/prison.html">Forecasting: Principles and Practice</a>.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">hierarchicalforecast</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">statsforecast</span> <span class="n">numba</span> <span class="n">statsmodels</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-
-<span class="c1">#obtain hierarchical reconciliation methods and evaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.core</span> <span class="kn">import</span> <span class="n">HierarchicalReconciliation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.evaluation</span> <span class="kn">import</span> <span class="n">HierarchicalEvaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.methods</span> <span class="kn">import</span> <span class="n">BottomUp</span><span class="p">,</span> <span class="n">MinTrace</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.utils</span> <span class="kn">import</span> <span class="n">aggregate</span>
-<span class="c1"># compute base forecast no coherent</span>
-<span class="kn">from</span> <span class="nn">statsforecast.core</span> <span class="kn">import</span> <span class="n">StatsForecast</span>
-<span class="kn">from</span> <span class="nn">statsforecast.models</span> <span class="kn">import</span> <span class="n">ets</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Aggregate-bottom-time-series">Aggregate bottom time series<a class="anchor-link" href="#Aggregate-bottom-time-series"> </a></h2>
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataset only contains the time series at the lowest level, so we need to create the time series for all hierarchies.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;https://OTexts.com/fpp3/extrafiles/prison_population.csv&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">rename</span><span class="p">({</span><span class="s1">&#39;Count&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="s1">&#39;Date&#39;</span><span class="p">:</span> <span class="s1">&#39;ds&#39;</span><span class="p">},</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Australia&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="p">[[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">,</span> <span class="s1">&#39;Indigenous&#39;</span><span class="p">,</span> <span class="s1">&#39;ds&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">]]</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">])</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Country</th>
-      <th>State</th>
-      <th>Gender</th>
-      <th>Legal</th>
-      <th>Indigenous</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Remanded</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>0</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Remanded</td>
-      <td>Non-ATSI</td>
-      <td>2005-03-01</td>
-      <td>2</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Sentenced</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>0</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Sentenced</td>
-      <td>Non-ATSI</td>
-      <td>2005-03-01</td>
-      <td>5</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Male</td>
-      <td>Remanded</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>7</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataset can be grouped in the following grouped structure.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">hiers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">],</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">]</span>
-<span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>Using the <a href="/hierarchicalforecast/utils.html#aggregate"><code>aggregate</code></a> function from <code>HierarchicalForecast</code> we can get the full set of time series.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="n">aggregate</span><span class="p">(</span><span class="n">Y_df</span><span class="p">,</span> <span class="n">hiers</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1e3</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>unique_id</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>2005-03-01</td>
-      <td>24.296</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>2005-06-01</td>
-      <td>24.643</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>2005-09-01</td>
-      <td>24.511</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>2005-12-01</td>
-      <td>24.393</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>2006-03-01</td>
-      <td>24.524</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">S</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:</span><span class="mi">5</span><span class="p">,</span> <span class="p">:</span><span class="mi">5</span><span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Australia/ACT/Female/Remanded</th>
-      <th>Australia/ACT/Female/Sentenced</th>
-      <th>Australia/ACT/Male/Remanded</th>
-      <th>Australia/ACT/Male/Sentenced</th>
-      <th>Australia/NSW/Female/Remanded</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/ACT</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/NSW</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/NT</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/QLD</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">tags</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-
-<div class="output_text output_subarea output_execute_result">
-<pre>{&#39;Country&#39;: array([&#39;Australia&#39;], dtype=object),
- &#39;Country/State&#39;: array([&#39;Australia/ACT&#39;, &#39;Australia/NSW&#39;, &#39;Australia/NT&#39;, &#39;Australia/QLD&#39;,
-        &#39;Australia/SA&#39;, &#39;Australia/TAS&#39;, &#39;Australia/VIC&#39;, &#39;Australia/WA&#39;],
-       dtype=object),
- &#39;Country/Gender&#39;: array([&#39;Australia/Female&#39;, &#39;Australia/Male&#39;], dtype=object),
- &#39;Country/Legal&#39;: array([&#39;Australia/Remanded&#39;, &#39;Australia/Sentenced&#39;], dtype=object),
- &#39;Country/State/Gender/Legal&#39;: array([&#39;Australia/ACT/Female/Remanded&#39;, &#39;Australia/ACT/Female/Sentenced&#39;,
-        &#39;Australia/ACT/Male/Remanded&#39;, &#39;Australia/ACT/Male/Sentenced&#39;,
-        &#39;Australia/NSW/Female/Remanded&#39;, &#39;Australia/NSW/Female/Sentenced&#39;,
-        &#39;Australia/NSW/Male/Remanded&#39;, &#39;Australia/NSW/Male/Sentenced&#39;,
-        &#39;Australia/NT/Female/Remanded&#39;, &#39;Australia/NT/Female/Sentenced&#39;,
-        &#39;Australia/NT/Male/Remanded&#39;, &#39;Australia/NT/Male/Sentenced&#39;,
-        &#39;Australia/QLD/Female/Remanded&#39;, &#39;Australia/QLD/Female/Sentenced&#39;,
-        &#39;Australia/QLD/Male/Remanded&#39;, &#39;Australia/QLD/Male/Sentenced&#39;,
-        &#39;Australia/SA/Female/Remanded&#39;, &#39;Australia/SA/Female/Sentenced&#39;,
-        &#39;Australia/SA/Male/Remanded&#39;, &#39;Australia/SA/Male/Sentenced&#39;,
-        &#39;Australia/TAS/Female/Remanded&#39;, &#39;Australia/TAS/Female/Sentenced&#39;,
-        &#39;Australia/TAS/Male/Remanded&#39;, &#39;Australia/TAS/Male/Sentenced&#39;,
-        &#39;Australia/VIC/Female/Remanded&#39;, &#39;Australia/VIC/Female/Sentenced&#39;,
-        &#39;Australia/VIC/Male/Remanded&#39;, &#39;Australia/VIC/Male/Sentenced&#39;,
-        &#39;Australia/WA/Female/Remanded&#39;, &#39;Australia/WA/Female/Sentenced&#39;,
-        &#39;Australia/WA/Male/Remanded&#39;, &#39;Australia/WA/Male/Sentenced&#39;],
-       dtype=object)}</pre>
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Split-Train/Test-sets">Split Train/Test sets<a class="anchor-link" href="#Split-Train/Test-sets"> </a></h3><p>We use the final two years (8 quarters) as test set.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tail</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Y_df_test</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df_test</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df_train</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Computing-base-forecasts">Computing base forecasts<a class="anchor-link" href="#Computing-base-forecasts"> </a></h2><p>The following cell computes the <strong>base forecasts</strong> for each time series in <code>Y_df</code> using the <code>auto_arima</code> and <code>naive</code> models. Observe that <code>Y_hat_df</code> contains the forecasts but they are not coherent.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">fcst</span> <span class="o">=</span> <span class="n">StatsForecast</span><span class="p">(</span><span class="n">df</span><span class="o">=</span><span class="n">Y_df_train</span><span class="p">,</span> 
-                     <span class="n">models</span><span class="o">=</span><span class="p">[(</span><span class="n">ets</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">&#39;ZMZ&#39;</span><span class="p">)],</span> 
-                     <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;QS&#39;</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_hat_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast</span><span class="p">(</span><span class="n">h</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">fitted</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-<span class="n">Y_fitted_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast_fitted_values</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Reconcile-forecasts">Reconcile forecasts<a class="anchor-link" href="#Reconcile-forecasts"> </a></h2><p>The following cell makes the previous forecasts coherent using the <a href="/hierarchicalforecast/core.html#HierarchicalReconciliation"><code>HierarchicalReconciliation</code></a> class. Since the hierarchy structure is not strict, we can't use methods such as <a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a> or <a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>. In this example we use <a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a> and <a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a>.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">reconcilers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="n">BottomUp</span><span class="p">(),</span>
-    <span class="n">MinTrace</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;mint_shrink&#39;</span><span class="p">)</span>
-<span class="p">]</span>
-<span class="n">hrec</span> <span class="o">=</span> <span class="n">HierarchicalReconciliation</span><span class="p">(</span><span class="n">reconcilers</span><span class="o">=</span><span class="n">reconcilers</span><span class="p">)</span>
-<span class="n">Y_rec_df</span> <span class="o">=</span> <span class="n">hrec</span><span class="o">.</span><span class="n">reconcile</span><span class="p">(</span><span class="n">Y_hat_df</span><span class="p">,</span> <span class="n">Y_fitted_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataframe <code>Y_rec_df</code> contains the reconciled forecasts.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_rec_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>ds</th>
-      <th>ets_season_length-4_model-ZMZ</th>
-      <th>ets_season_length-4_model-ZMZ/BottomUp</th>
-      <th>ets_season_length-4_model-ZMZ/MinTrace_method-mint_shrink</th>
-    </tr>
-    <tr>
-      <th>unique_id</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>2015-01-01</td>
-      <td>34.799496</td>
-      <td>34.933872</td>
-      <td>34.963669</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-04-01</td>
-      <td>35.192638</td>
-      <td>35.473522</td>
-      <td>35.521146</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-07-01</td>
-      <td>35.188217</td>
-      <td>35.687302</td>
-      <td>35.630352</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-10-01</td>
-      <td>35.888626</td>
-      <td>36.010601</td>
-      <td>36.147547</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2016-01-01</td>
-      <td>36.045437</td>
-      <td>36.400002</td>
-      <td>36.492036</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Evaluation">Evaluation<a class="anchor-link" href="#Evaluation"> </a></h2><p>The <code>HierarchicalForecast</code> package includes the <a href="/hierarchicalforecast/evaluation.html#HierarchicalEvaluation"><code>HierarchicalEvaluation</code></a> class to evaluate the different hierarchies and also is capable of compute scaled metrics compared to a benchmark model.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">mase</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">,</span> <span class="n">y_insample</span><span class="p">,</span> <span class="n">seasonality</span><span class="o">=</span><span class="mi">4</span><span class="p">):</span>
-    <span class="n">errors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">y_hat</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="n">scale</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y_insample</span><span class="p">[:,</span> <span class="n">seasonality</span><span class="p">:]</span> <span class="o">-</span> <span class="n">y_insample</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="n">seasonality</span><span class="p">]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">errors</span> <span class="o">/</span> <span class="n">scale</span><span class="p">)</span>
-
-<span class="n">eval_tags</span> <span class="o">=</span> <span class="p">{}</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Total&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;State&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Legal status&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Legal&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Gender&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Gender&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Bottom&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State/Gender/Legal&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;All series&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tags</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
-
-<span class="n">evaluator</span> <span class="o">=</span> <span class="n">HierarchicalEvaluation</span><span class="p">(</span><span class="n">evaluators</span><span class="o">=</span><span class="p">[</span><span class="n">mase</span><span class="p">])</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluator</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span>
-    <span class="n">Y_h</span><span class="o">=</span><span class="n">Y_rec_df</span><span class="p">,</span> <span class="n">Y_test</span><span class="o">=</span><span class="n">Y_df_test</span><span class="p">,</span> 
-    <span class="n">tags</span><span class="o">=</span><span class="n">eval_tags</span><span class="p">,</span>
-    <span class="n">Y_df</span><span class="o">=</span><span class="n">Y_df_train</span>    
-<span class="p">)</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluation</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="s1">&#39;metric&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;level&#39;</span><span class="p">)</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Base&#39;</span><span class="p">,</span> <span class="s1">&#39;BottomUp&#39;</span><span class="p">,</span> <span class="s1">&#39;MinTrace(mint_shrink)&#39;</span><span class="p">]</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">applymap</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:.2f}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Base</th>
-      <th>BottomUp</th>
-      <th>MinTrace(mint_shrink)</th>
-    </tr>
-    <tr>
-      <th>level</th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Total</th>
-      <td>1.36</td>
-      <td>1.02</td>
-      <td>0.96</td>
-    </tr>
-    <tr>
-      <th>State</th>
-      <td>1.66</td>
-      <td>1.57</td>
-      <td>1.60</td>
-    </tr>
-    <tr>
-      <th>Legal status</th>
-      <td>2.40</td>
-      <td>2.50</td>
-      <td>2.42</td>
-    </tr>
-    <tr>
-      <th>Gender</th>
-      <td>1.08</td>
-      <td>0.81</td>
-      <td>0.80</td>
-    </tr>
-    <tr>
-      <th>Bottom</th>
-      <td>2.17</td>
-      <td>2.17</td>
-      <td>2.18</td>
-    </tr>
-    <tr>
-      <th>All series</th>
-      <td>2.03</td>
-      <td>2.00</td>
-      <td>2.00</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Comparison-fable">Comparison fable<a class="anchor-link" href="#Comparison-fable"> </a></h3><p>Observe that we can recover the results reported by the <a href="https://otexts.com/fpp3/prison.html">Forecasting: Principles and Practice</a> book. The original results were calculated using the R package <a href="https://github.com/tidyverts/fable">fable</a>.</p>
-<p><img src="/hierarchicalforecast/./AustralianPrisonPopulation-results-fable.png" alt="image"></p>
-
-</div>
-</div>
-</div>
-</div>
-
-
diff --git a/docs/Gemfile b/docs/Gemfile
deleted file mode 100644
index e9f579a5..00000000
--- a/docs/Gemfile
+++ /dev/null
@@ -1,4 +0,0 @@
-source "https://rubygems.org"
-
-gem "jekyll", ">= 3.7"
-gem "jekyll-remote-theme"
diff --git a/docs/Prison.html b/docs/Prison.html
deleted file mode 100644
index 545fd2b6..00000000
--- a/docs/Prison.html
+++ /dev/null
@@ -1,849 +0,0 @@
----
-
-title: Reconcile time series having only the lowest hierarchy
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "examples/Prison.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: examples/Prison.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p><a href="https://colab.research.google.com/github/Nixtla/hierarchicalforecast/blob/main/examples/ReconcileFromBottomSeries.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a></p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In many cases, only the time series at the lowest level of the hierarchies (bottom time series) are available. <code>HierarchicalForecast</code> has tools to create time series for all hierarchies. In this notebook we will see how to do it.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">hierarchicalforecast</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">statsforecast</span> <span class="n">numba</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-
-<span class="c1">#obtain hierarchical reconciliation methods and evaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.core</span> <span class="kn">import</span> <span class="n">HierarchicalReconciliation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.evaluation</span> <span class="kn">import</span> <span class="n">HierarchicalEvaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.methods</span> <span class="kn">import</span> <span class="n">BottomUp</span><span class="p">,</span> <span class="n">MinTrace</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.utils</span> <span class="kn">import</span> <span class="n">hierarchize</span>
-<span class="c1"># compute base forecast no coherent</span>
-<span class="kn">from</span> <span class="nn">statsforecast.core</span> <span class="kn">import</span> <span class="n">StatsForecast</span>
-<span class="kn">from</span> <span class="nn">statsforecast.models</span> <span class="kn">import</span> <span class="n">ets</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Aggregate-bottom-time-series">Aggregate bottom time series<a class="anchor-link" href="#Aggregate-bottom-time-series"> </a></h2>
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In this example we will use the <a href="https://otexts.com/fpp3/tourism.html">Tourism</a> dataset. The dataset only contains the time series at the lowest level, so we need to create the time series for all hierarchies.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">read_csv</span><span class="p">(</span><span class="s1">&#39;https://OTexts.com/fpp3/extrafiles/prison_population.csv&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">rename</span><span class="p">({</span><span class="s1">&#39;Count&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">,</span> <span class="s1">&#39;Date&#39;</span><span class="p">:</span> <span class="s1">&#39;ds&#39;</span><span class="p">},</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Australia&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="p">[[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">,</span> <span class="s1">&#39;Indigenous&#39;</span><span class="p">,</span> <span class="s1">&#39;ds&#39;</span><span class="p">,</span> <span class="s1">&#39;y&#39;</span><span class="p">]]</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">])</span>
-<span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Country</th>
-      <th>State</th>
-      <th>Gender</th>
-      <th>Legal</th>
-      <th>Indigenous</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Remanded</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>0</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Remanded</td>
-      <td>Non-ATSI</td>
-      <td>2005-03-01</td>
-      <td>2</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Sentenced</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>0</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Female</td>
-      <td>Sentenced</td>
-      <td>Non-ATSI</td>
-      <td>2005-03-01</td>
-      <td>5</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>ACT</td>
-      <td>Male</td>
-      <td>Remanded</td>
-      <td>ATSI</td>
-      <td>2005-03-01</td>
-      <td>7</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataset can be grouped in the following non-strictly hierarchical structure.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">hiers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">],</span>
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">],</span> 
-    <span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">,</span> <span class="s1">&#39;State&#39;</span><span class="p">,</span> <span class="s1">&#39;Gender&#39;</span><span class="p">,</span> <span class="s1">&#39;Legal&#39;</span><span class="p">]</span>
-<span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>Using the <code>hierarchize</code> function from <code>HierarchicalForecast</code> we can get the full set of time series.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="n">hierarchize</span><span class="p">(</span><span class="n">Y_df</span><span class="p">,</span> <span class="n">hiers</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">/</span> <span class="mf">1e3</span><span class="p">)</span>
-<span class="n">Y_df</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>unique_id</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>Australia</td>
-      <td>2005-03-01</td>
-      <td>24.296</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>Australia</td>
-      <td>2005-06-01</td>
-      <td>24.643</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>Australia</td>
-      <td>2005-09-01</td>
-      <td>24.511</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>Australia</td>
-      <td>2005-12-01</td>
-      <td>24.393</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>Australia</td>
-      <td>2006-03-01</td>
-      <td>24.524</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">S</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:</span><span class="mi">5</span><span class="p">,</span> <span class="p">:</span><span class="mi">5</span><span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Australia/ACT/Female/Remanded</th>
-      <th>Australia/ACT/Female/Sentenced</th>
-      <th>Australia/ACT/Male/Remanded</th>
-      <th>Australia/ACT/Male/Sentenced</th>
-      <th>Australia/NSW/Female/Remanded</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/ACT</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/NSW</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>Australia/NT</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>Australia/QLD</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">tags</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-
-<div class="output_text output_subarea output_execute_result">
-<pre>{&#39;Country&#39;: array([&#39;Australia&#39;], dtype=object),
- &#39;Country/State&#39;: array([&#39;Australia/ACT&#39;, &#39;Australia/NSW&#39;, &#39;Australia/NT&#39;, &#39;Australia/QLD&#39;,
-        &#39;Australia/SA&#39;, &#39;Australia/TAS&#39;, &#39;Australia/VIC&#39;, &#39;Australia/WA&#39;],
-       dtype=object),
- &#39;Country/Gender&#39;: array([&#39;Australia/Female&#39;, &#39;Australia/Male&#39;], dtype=object),
- &#39;Country/Legal&#39;: array([&#39;Australia/Remanded&#39;, &#39;Australia/Sentenced&#39;], dtype=object),
- &#39;Country/State/Gender/Legal&#39;: array([&#39;Australia/ACT/Female/Remanded&#39;, &#39;Australia/ACT/Female/Sentenced&#39;,
-        &#39;Australia/ACT/Male/Remanded&#39;, &#39;Australia/ACT/Male/Sentenced&#39;,
-        &#39;Australia/NSW/Female/Remanded&#39;, &#39;Australia/NSW/Female/Sentenced&#39;,
-        &#39;Australia/NSW/Male/Remanded&#39;, &#39;Australia/NSW/Male/Sentenced&#39;,
-        &#39;Australia/NT/Female/Remanded&#39;, &#39;Australia/NT/Female/Sentenced&#39;,
-        &#39;Australia/NT/Male/Remanded&#39;, &#39;Australia/NT/Male/Sentenced&#39;,
-        &#39;Australia/QLD/Female/Remanded&#39;, &#39;Australia/QLD/Female/Sentenced&#39;,
-        &#39;Australia/QLD/Male/Remanded&#39;, &#39;Australia/QLD/Male/Sentenced&#39;,
-        &#39;Australia/SA/Female/Remanded&#39;, &#39;Australia/SA/Female/Sentenced&#39;,
-        &#39;Australia/SA/Male/Remanded&#39;, &#39;Australia/SA/Male/Sentenced&#39;,
-        &#39;Australia/TAS/Female/Remanded&#39;, &#39;Australia/TAS/Female/Sentenced&#39;,
-        &#39;Australia/TAS/Male/Remanded&#39;, &#39;Australia/TAS/Male/Sentenced&#39;,
-        &#39;Australia/VIC/Female/Remanded&#39;, &#39;Australia/VIC/Female/Sentenced&#39;,
-        &#39;Australia/VIC/Male/Remanded&#39;, &#39;Australia/VIC/Male/Sentenced&#39;,
-        &#39;Australia/WA/Female/Remanded&#39;, &#39;Australia/WA/Female/Sentenced&#39;,
-        &#39;Australia/WA/Male/Remanded&#39;, &#39;Australia/WA/Male/Sentenced&#39;],
-       dtype=object)}</pre>
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Split-Train/Test-sets">Split Train/Test sets<a class="anchor-link" href="#Split-Train/Test-sets"> </a></h3><p>We use the final two years (8 quarters) as test set.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tail</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Y_df_test</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df_test</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df_train</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Computing-base-forecasts">Computing base forecasts<a class="anchor-link" href="#Computing-base-forecasts"> </a></h2><p>The following cell computes the <strong>base forecasts</strong> for each time series in <code>Y_df</code> using the <code>auto_arima</code> and <code>naive</code> models. Observe that <code>Y_hat_df</code> contains the forecasts but they are not coherent.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="n">fcst</span> <span class="o">=</span> <span class="n">StatsForecast</span><span class="p">(</span><span class="n">df</span><span class="o">=</span><span class="n">Y_df_train</span><span class="p">,</span> 
-                     <span class="n">models</span><span class="o">=</span><span class="p">[(</span><span class="n">ets</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="s1">&#39;ZMZ&#39;</span><span class="p">)],</span> 
-                     <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;QS&#39;</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_hat_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast</span><span class="p">(</span><span class="n">h</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">fitted</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
-<span class="n">Y_fitted_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast_fitted_values</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Reconcile-forecasts">Reconcile forecasts<a class="anchor-link" href="#Reconcile-forecasts"> </a></h2><p>The following cell makes the previous forecasts coherent using the <a href="/hierarchicalforecast/core.html#HierarchicalReconciliation"><code>HierarchicalReconciliation</code></a> class. Since the hierarchy structure is not strict, we can't use methods such as <a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a> or <a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>. In this example we use <a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a> and <a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a>.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">reconcilers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="n">BottomUp</span><span class="p">(),</span>
-    <span class="n">MinTrace</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;mint_shrink&#39;</span><span class="p">)</span>
-<span class="p">]</span>
-<span class="n">hrec</span> <span class="o">=</span> <span class="n">HierarchicalReconciliation</span><span class="p">(</span><span class="n">reconcilers</span><span class="o">=</span><span class="n">reconcilers</span><span class="p">)</span>
-<span class="n">Y_rec_df</span> <span class="o">=</span> <span class="n">hrec</span><span class="o">.</span><span class="n">reconcile</span><span class="p">(</span><span class="n">Y_hat_df</span><span class="p">,</span> <span class="n">Y_fitted_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The dataframe <code>Y_rec_df</code> contains the reconciled forecasts.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_rec_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>ds</th>
-      <th>ets_season_length-4_model-ZMZ</th>
-      <th>ets_season_length-4_model-ZMZ/BottomUp</th>
-      <th>ets_season_length-4_model-ZMZ/MinTrace_method-mint_shrink</th>
-    </tr>
-    <tr>
-      <th>unique_id</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Australia</th>
-      <td>2015-01-01</td>
-      <td>34.799496</td>
-      <td>34.933872</td>
-      <td>34.963669</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-04-01</td>
-      <td>35.192638</td>
-      <td>35.473522</td>
-      <td>35.521146</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-07-01</td>
-      <td>35.188217</td>
-      <td>35.687302</td>
-      <td>35.630352</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2015-10-01</td>
-      <td>35.888626</td>
-      <td>36.010601</td>
-      <td>36.147547</td>
-    </tr>
-    <tr>
-      <th>Australia</th>
-      <td>2016-01-01</td>
-      <td>36.045437</td>
-      <td>36.400002</td>
-      <td>36.492036</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="Evaluation">Evaluation<a class="anchor-link" href="#Evaluation"> </a></h2><p>The <code>HierarchicalForecast</code> package includes the <a href="/hierarchicalforecast/evaluation.html#HierarchicalEvaluation"><code>HierarchicalEvaluation</code></a> class to evaluate the different hierarchies and also is capable of compute scaled metrics compared to a benchmark model.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">mase</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">,</span> <span class="n">y_insample</span><span class="p">,</span> <span class="n">seasonality</span><span class="o">=</span><span class="mi">4</span><span class="p">):</span>
-    <span class="n">errors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">y_hat</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="n">scale</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y_insample</span><span class="p">[:,</span> <span class="n">seasonality</span><span class="p">:]</span> <span class="o">-</span> <span class="n">y_insample</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="n">seasonality</span><span class="p">]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">errors</span> <span class="o">/</span> <span class="n">scale</span><span class="p">)</span>
-
-<span class="n">eval_tags</span> <span class="o">=</span> <span class="p">{}</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Total&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;State&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Legal status&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Legal&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Gender&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/Gender&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;Bottom&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">tags</span><span class="p">[</span><span class="s1">&#39;Country/State/Gender/Legal&#39;</span><span class="p">]</span>
-<span class="n">eval_tags</span><span class="p">[</span><span class="s1">&#39;All series&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">tags</span><span class="o">.</span><span class="n">values</span><span class="p">()))</span>
-
-<span class="n">evaluator</span> <span class="o">=</span> <span class="n">HierarchicalEvaluation</span><span class="p">(</span><span class="n">evaluators</span><span class="o">=</span><span class="p">[</span><span class="n">mase</span><span class="p">])</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluator</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span>
-    <span class="n">Y_h</span><span class="o">=</span><span class="n">Y_rec_df</span><span class="p">,</span> <span class="n">Y_test</span><span class="o">=</span><span class="n">Y_df_test</span><span class="p">,</span> 
-    <span class="n">tags</span><span class="o">=</span><span class="n">eval_tags</span><span class="p">,</span>
-    <span class="n">Y_df</span><span class="o">=</span><span class="n">Y_df_train</span>    
-<span class="p">)</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluation</span><span class="o">.</span><span class="n">reset_index</span><span class="p">()</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="s1">&#39;metric&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;level&#39;</span><span class="p">)</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">columns</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Base&#39;</span><span class="p">,</span> <span class="s1">&#39;BottomUp&#39;</span><span class="p">,</span> <span class="s1">&#39;MinTrace(mint_shrink)&#39;</span><span class="p">]</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">applymap</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">{:.2f}</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>Base</th>
-      <th>BottomUp</th>
-      <th>MinTrace(mint_shrink)</th>
-    </tr>
-    <tr>
-      <th>level</th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>Total</th>
-      <td>1.36</td>
-      <td>1.02</td>
-      <td>0.96</td>
-    </tr>
-    <tr>
-      <th>State</th>
-      <td>1.66</td>
-      <td>1.57</td>
-      <td>1.60</td>
-    </tr>
-    <tr>
-      <th>Legal status</th>
-      <td>2.40</td>
-      <td>2.50</td>
-      <td>2.42</td>
-    </tr>
-    <tr>
-      <th>Gender</th>
-      <td>1.08</td>
-      <td>0.81</td>
-      <td>0.80</td>
-    </tr>
-    <tr>
-      <th>Bottom</th>
-      <td>2.17</td>
-      <td>2.17</td>
-      <td>2.18</td>
-    </tr>
-    <tr>
-      <th>All series</th>
-      <td>2.03</td>
-      <td>2.00</td>
-      <td>2.00</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-</div>
-
-
diff --git a/docs/TourismSmall.html b/docs/TourismSmall.html
deleted file mode 100644
index 5d64dee9..00000000
--- a/docs/TourismSmall.html
+++ /dev/null
@@ -1,595 +0,0 @@
----
-
-title: Hierarchical Reconciliation for TourismSmall dataset
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "examples/TourismSmall.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: examples/TourismSmall.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p><a href="https://colab.research.google.com/github/Nixtla/hierarchicalforecast/blob/main/examples/TourismSmall.ipynb" target="_parent"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"/></a></p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>Large collections of time series organized into structures at different aggregation levels often require their forecasts to follow their aggregation constraints, which poses the challenge of creating novel algorithms capable of coherent forecasts.</p>
-<p>The <code>HierarchicalForecast</code> package provides a wide collection of Python implementations of hierarchical forecasting algorithms that follow classic hierarchical reconciliation.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">hierarchicalforecast</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">statsforecast</span> <span class="n">datasetsforecast</span>
-<span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="o">-</span><span class="n">U</span> <span class="n">statsmodels</span> <span class="n">numba</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-
-<span class="c1">#obtain hierarchical data</span>
-<span class="kn">from</span> <span class="nn">datasetsforecast.hierarchical</span> <span class="kn">import</span> <span class="n">HierarchicalData</span>
-<span class="c1">#obtain hierarchical reconciliation methods and evaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.core</span> <span class="kn">import</span> <span class="n">HierarchicalReconciliation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.evaluation</span> <span class="kn">import</span> <span class="n">HierarchicalEvaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.methods</span> <span class="kn">import</span> <span class="n">BottomUp</span><span class="p">,</span> <span class="n">TopDown</span><span class="p">,</span> <span class="n">MiddleOut</span>
-<span class="c1"># compute base forecast no coherent</span>
-<span class="kn">from</span> <span class="nn">statsforecast.core</span> <span class="kn">import</span> <span class="n">StatsForecast</span>
-<span class="kn">from</span> <span class="nn">statsforecast.models</span> <span class="kn">import</span> <span class="n">auto_arima</span><span class="p">,</span> <span class="n">naive</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>In this example we will use the <code>TourismSmall</code> dataset. The following cell gets the time series for the different levels in the hierarchy, the summing matrix <code>S</code> which recovers the full dataset from the bottom level hierarchy and the indices of each hierarchy denoted by <code>tags</code>.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="n">HierarchicalData</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s1">&#39;./data&#39;</span><span class="p">,</span> <span class="s1">&#39;TourismSmall&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">])</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df</span><span class="o">.</span><span class="n">head</span><span class="p">()</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>unique_id</th>
-      <th>ds</th>
-      <th>y</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>0</th>
-      <td>total</td>
-      <td>1998-03-31</td>
-      <td>84503</td>
-    </tr>
-    <tr>
-      <th>1</th>
-      <td>total</td>
-      <td>1998-06-30</td>
-      <td>65312</td>
-    </tr>
-    <tr>
-      <th>2</th>
-      <td>total</td>
-      <td>1998-09-30</td>
-      <td>72753</td>
-    </tr>
-    <tr>
-      <th>3</th>
-      <td>total</td>
-      <td>1998-12-31</td>
-      <td>70880</td>
-    </tr>
-    <tr>
-      <th>4</th>
-      <td>total</td>
-      <td>1999-03-31</td>
-      <td>86893</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">S</span><span class="o">.</span><span class="n">iloc</span><span class="p">[:</span><span class="mi">5</span><span class="p">,</span> <span class="p">:</span><span class="mi">5</span><span class="p">]</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead th {
-        text-align: right;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr style="text-align: right;">
-      <th></th>
-      <th>nsw-hol-city</th>
-      <th>nsw-hol-noncity</th>
-      <th>vic-hol-city</th>
-      <th>vic-hol-noncity</th>
-      <th>qld-hol-city</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>total</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>hol</th>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-      <td>1.0</td>
-    </tr>
-    <tr>
-      <th>vfr</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>bus</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-    <tr>
-      <th>oth</th>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-      <td>0.0</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">tags</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-
-<div class="output_text output_subarea output_execute_result">
-<pre>{&#39;Country&#39;: array([&#39;total&#39;], dtype=object),
- &#39;Country/Purpose&#39;: array([&#39;hol&#39;, &#39;vfr&#39;, &#39;bus&#39;, &#39;oth&#39;], dtype=object),
- &#39;Country/Purpose/State&#39;: array([&#39;nsw-hol&#39;, &#39;vic-hol&#39;, &#39;qld-hol&#39;, &#39;sa-hol&#39;, &#39;wa-hol&#39;, &#39;tas-hol&#39;,
-        &#39;nt-hol&#39;, &#39;nsw-vfr&#39;, &#39;vic-vfr&#39;, &#39;qld-vfr&#39;, &#39;sa-vfr&#39;, &#39;wa-vfr&#39;,
-        &#39;tas-vfr&#39;, &#39;nt-vfr&#39;, &#39;nsw-bus&#39;, &#39;vic-bus&#39;, &#39;qld-bus&#39;, &#39;sa-bus&#39;,
-        &#39;wa-bus&#39;, &#39;tas-bus&#39;, &#39;nt-bus&#39;, &#39;nsw-oth&#39;, &#39;vic-oth&#39;, &#39;qld-oth&#39;,
-        &#39;sa-oth&#39;, &#39;wa-oth&#39;, &#39;tas-oth&#39;, &#39;nt-oth&#39;], dtype=object),
- &#39;Country/Purpose/State/CityNonCity&#39;: array([&#39;nsw-hol-city&#39;, &#39;nsw-hol-noncity&#39;, &#39;vic-hol-city&#39;,
-        &#39;vic-hol-noncity&#39;, &#39;qld-hol-city&#39;, &#39;qld-hol-noncity&#39;,
-        &#39;sa-hol-city&#39;, &#39;sa-hol-noncity&#39;, &#39;wa-hol-city&#39;, &#39;wa-hol-noncity&#39;,
-        &#39;tas-hol-city&#39;, &#39;tas-hol-noncity&#39;, &#39;nt-hol-city&#39;, &#39;nt-hol-noncity&#39;,
-        &#39;nsw-vfr-city&#39;, &#39;nsw-vfr-noncity&#39;, &#39;vic-vfr-city&#39;,
-        &#39;vic-vfr-noncity&#39;, &#39;qld-vfr-city&#39;, &#39;qld-vfr-noncity&#39;,
-        &#39;sa-vfr-city&#39;, &#39;sa-vfr-noncity&#39;, &#39;wa-vfr-city&#39;, &#39;wa-vfr-noncity&#39;,
-        &#39;tas-vfr-city&#39;, &#39;tas-vfr-noncity&#39;, &#39;nt-vfr-city&#39;, &#39;nt-vfr-noncity&#39;,
-        &#39;nsw-bus-city&#39;, &#39;nsw-bus-noncity&#39;, &#39;vic-bus-city&#39;,
-        &#39;vic-bus-noncity&#39;, &#39;qld-bus-city&#39;, &#39;qld-bus-noncity&#39;,
-        &#39;sa-bus-city&#39;, &#39;sa-bus-noncity&#39;, &#39;wa-bus-city&#39;, &#39;wa-bus-noncity&#39;,
-        &#39;tas-bus-city&#39;, &#39;tas-bus-noncity&#39;, &#39;nt-bus-city&#39;, &#39;nt-bus-noncity&#39;,
-        &#39;nsw-oth-city&#39;, &#39;nsw-oth-noncity&#39;, &#39;vic-oth-city&#39;,
-        &#39;vic-oth-noncity&#39;, &#39;qld-oth-city&#39;, &#39;qld-oth-noncity&#39;,
-        &#39;sa-oth-city&#39;, &#39;sa-oth-noncity&#39;, &#39;wa-oth-city&#39;, &#39;wa-oth-noncity&#39;,
-        &#39;tas-oth-city&#39;, &#39;tas-oth-noncity&#39;, &#39;nt-oth-city&#39;, &#39;nt-oth-noncity&#39;],
-       dtype=object)}</pre>
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>We split the dataframe in train/test splits.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tail</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Y_df_test</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df_test</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df_train</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The following cell computes the <em>base forecast</em> for each time series using the <code>auto_arima</code> and <code>naive</code> models. Observe that <code>Y_hat_df</code> contains the forecasts but they are not coherent.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="o">%%capture</span>
-<span class="n">fcst</span> <span class="o">=</span> <span class="n">StatsForecast</span><span class="p">(</span><span class="n">df</span><span class="o">=</span><span class="n">Y_df_train</span><span class="p">,</span> <span class="n">models</span><span class="o">=</span><span class="p">[(</span><span class="n">auto_arima</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span> <span class="n">naive</span><span class="p">],</span> <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;M&#39;</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_hat_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast</span><span class="p">(</span><span class="n">h</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-<div class="output_subarea output_stream output_stderr output_text">
-<pre>INFO:statsforecast.core:Computing forecasts
-INFO:statsforecast.core:Computed forecasts for auto_arima_season_length-12.
-INFO:statsforecast.core:Computed forecasts for naive.
-</pre>
-</div>
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The following cell makes the previous forecasts coherent using the <a href="/hierarchicalforecast/core.html#HierarchicalReconciliation"><code>HierarchicalReconciliation</code></a> class. The used methods to make the forecasts coherent are:</p>
-<ul>
-<li><a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a>: The reconciliation of the method is a simple addition to the upper levels.</li>
-<li><a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a>: The second method constrains the base-level predictions to the top-most aggregate-level serie and then distributes it to the disaggregate series through the use of proportions. </li>
-<li><a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>: Anchors the base predictions in a middle level.</li>
-</ul>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="n">reconcilers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="n">BottomUp</span><span class="p">(),</span>
-    <span class="n">TopDown</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;forecast_proportions&#39;</span><span class="p">),</span>
-    <span class="n">MiddleOut</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="s1">&#39;Country/Purpose/State&#39;</span><span class="p">,</span> <span class="n">top_down_method</span><span class="o">=</span><span class="s1">&#39;forecast_proportions&#39;</span><span class="p">)</span>
-<span class="p">]</span>
-<span class="n">hrec</span> <span class="o">=</span> <span class="n">HierarchicalReconciliation</span><span class="p">(</span><span class="n">reconcilers</span><span class="o">=</span><span class="n">reconcilers</span><span class="p">)</span>
-<span class="n">Y_rec_df</span> <span class="o">=</span> <span class="n">hrec</span><span class="o">.</span><span class="n">reconcile</span><span class="p">(</span><span class="n">Y_hat_df</span><span class="p">,</span> <span class="n">Y_df_train</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The <code>HierarchicalForecast</code> package includes the <a href="/hierarchicalforecast/evaluation.html#HierarchicalEvaluation"><code>HierarchicalEvaluation</code></a> class to evaluate the different hierarchies and also is capable of compute scaled metrics compared to a benchmark model.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">mse</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">):</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">((</span><span class="n">y</span><span class="o">-</span><span class="n">y_hat</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
-
-<span class="n">evaluator</span> <span class="o">=</span> <span class="n">HierarchicalEvaluation</span><span class="p">(</span><span class="n">evaluators</span><span class="o">=</span><span class="p">[</span><span class="n">mse</span><span class="p">])</span>
-<span class="n">evaluation</span> <span class="o">=</span> <span class="n">evaluator</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span>
-        <span class="n">Y_h</span><span class="o">=</span><span class="n">Y_rec_df</span><span class="p">,</span> <span class="n">Y_test</span><span class="o">=</span><span class="n">Y_df_test</span><span class="p">,</span> 
-        <span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">benchmark</span><span class="o">=</span><span class="s1">&#39;naive&#39;</span>
-<span class="p">)</span>
-<span class="n">evaluation</span><span class="o">.</span><span class="n">filter</span><span class="p">(</span><span class="n">like</span><span class="o">=</span><span class="s1">&#39;arima&#39;</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">T</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_html rendered_html output_subarea output_execute_result"><div>
-<style scoped>
-    .dataframe tbody tr th:only-of-type {
-        vertical-align: middle;
-    }
-
-    .dataframe tbody tr th {
-        vertical-align: top;
-    }
-
-    .dataframe thead tr th {
-        text-align: left;
-    }
-</style>
-<table border="1" class="dataframe">
-  <thead>
-    <tr>
-      <th>level</th>
-      <th>Overall</th>
-      <th>Country</th>
-      <th>Country/Purpose</th>
-      <th>Country/Purpose/State</th>
-      <th>Country/Purpose/State/CityNonCity</th>
-    </tr>
-    <tr>
-      <th>metric</th>
-      <th>mse-scaled</th>
-      <th>mse-scaled</th>
-      <th>mse-scaled</th>
-      <th>mse-scaled</th>
-      <th>mse-scaled</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <th>auto_arima_season_length-12</th>
-      <td>0.958433</td>
-      <td>1.05191</td>
-      <td>0.903941</td>
-      <td>0.909366</td>
-      <td>0.84693</td>
-    </tr>
-    <tr>
-      <th>auto_arima_season_length-12/BottomUp</th>
-      <td>0.908254</td>
-      <td>0.978696</td>
-      <td>0.861644</td>
-      <td>0.867018</td>
-      <td>0.84693</td>
-    </tr>
-    <tr>
-      <th>auto_arima_season_length-12/TopDown_method-forecast_proportions</th>
-      <td>0.973065</td>
-      <td>1.05191</td>
-      <td>0.887653</td>
-      <td>0.973846</td>
-      <td>0.949697</td>
-    </tr>
-    <tr>
-      <th>auto_arima_season_length-12/MiddleOut_level-Country/Purpose/State_top_down_method-forecast_proportions</th>
-      <td>0.896154</td>
-      <td>0.950772</td>
-      <td>0.830192</td>
-      <td>0.909366</td>
-      <td>0.885367</td>
-    </tr>
-  </tbody>
-</table>
-</div></div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-</div>
-
-
diff --git a/docs/_config.yml b/docs/_config.yml
deleted file mode 100644
index 39cfb47a..00000000
--- a/docs/_config.yml
+++ /dev/null
@@ -1,66 +0,0 @@
-repository: Nixtla/hierarchicalforecast
-output: web
-topnav_title: hierarchicalforecast
-site_title: hierarchicalforecast
-company_name: Nixtla Inc.
-description: Datasets for Time series forecasting
-# Set to false to disable KaTeX math
-use_math: true
-# Add Google analytics id if you have one and want to use it here
-google_analytics:
-# See http://nbdev.fast.ai/search for help with adding Search
-google_search:
-
-host: 127.0.0.1
-# the preview server used. Leave as is.
-port: 4000
-# the port where the preview is rendered.
-
-exclude:
-  - .idea/
-  - .gitignore
-  - vendor
- 
-exclude: [vendor]
-
-highlighter: rouge
-markdown: kramdown
-kramdown:
- input: GFM
- auto_ids: true
- hard_wrap: false
- syntax_highlighter: rouge
-
-collections:
-  tooltips:
-    output: false
-
-defaults:
-  -
-    scope:
-      path: ""
-      type: "pages"
-    values:
-      layout: "page"
-      comments: true
-      search: true
-      sidebar: home_sidebar
-      topnav: topnav
-  -
-    scope:
-      path: ""
-      type: "tooltips"
-    values:
-      layout: "page"
-      comments: true
-      search: true
-      tooltip: true
-
-sidebars:
-- home_sidebar
-
-plugins:
-    - jekyll-remote-theme
-    
-remote_theme: fastai/nbdev-jekyll-theme
-baseurl: /hierarchicalforecast/
diff --git a/docs/_data/sidebars/home_sidebar.yml b/docs/_data/sidebars/home_sidebar.yml
deleted file mode 100644
index 93fa9abd..00000000
--- a/docs/_data/sidebars/home_sidebar.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# Instead edit ../../sidebar.json
-entries:
-- folders:
-  - folderitems:
-    - output: web,pdf
-      title: Overview
-      url: /
-      subfolders:
-      - output: web
-        subfolderitems:
-        - output: web,pdf
-          title: Hierarchical Reconciliation
-          url: /core
-        - output: web,pdf
-          title: Hierachical Reconciliation Methods
-          url: /methods
-        - output: web,pdf
-          title: 'Hierarchical Evaluation '
-          url: /evaluation
-        - output: web,pdf
-          title: Utils
-          url: /utils
-        title: Reference
-      - output: web
-        subfolderitems:
-        - output: web,pdf
-          title: Reconcile Tourism Small Dataset
-          url: /TourismSmall
-        - output: web,pdf
-          title: Forecasting Australian domestic tourism
-          url: /AustralianDomesticTourism
-        - output: web,pdf
-          title: Forecasting Australian prison population
-          url: /AustralianPrisonPopulation
-        title: Quick Start
-    output: web
-    title: HierarchicalForecast
-  output: web
-  title: Sidebar
diff --git a/docs/_data/topnav.yml b/docs/_data/topnav.yml
deleted file mode 100644
index cee178e8..00000000
--- a/docs/_data/topnav.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-topnav:
-- title: Topnav
-  items:
-    - title: github
-      external_url: https://github.com/Nixtla/statsforecast/tree/main/
-
-#Topnav dropdowns
-topnav_dropdowns:
-- title: Topnav dropdowns
-  folders:
\ No newline at end of file
diff --git a/docs/assets b/docs/assets
deleted file mode 160000
index 0d5975a8..00000000
--- a/docs/assets
+++ /dev/null
@@ -1,1 +0,0 @@
-Subproject commit 0d5975a8287c73e94598a1418510fdc6c64ee64c
diff --git a/docs/core.html b/docs/core.html
deleted file mode 100644
index 9203fef3..00000000
--- a/docs/core.html
+++ /dev/null
@@ -1,148 +0,0 @@
----
-
-title: Core Hierarchical 
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-summary: "Hierarchical Reconciliation using time series in long format and `Pandas`."
-description: "Hierarchical Reconciliation using time series in long format and `Pandas`."
-nb_path: "nbs/core.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: nbs/core.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="HierarchicalReconciliation" class="doc_header"><code>class</code> <code>HierarchicalReconciliation</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/core.py#L23" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>HierarchicalReconciliation</code>(<strong><code>reconcilers</code></strong>:<code>List</code>[<code>typing.Callable</code>])</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>reconcilers</code></strong></td>
-<td><code>typing.List[typing.Callable]</code></td>
-<td></td>
-<td>Reconciliation classes of the <a href="/hierarchicalforecast/methods.html"><code>methods</code></a> module</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="HierarchicalReconciliation.reconcile" class="doc_header"><code>HierarchicalReconciliation.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/core.py#L31" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>HierarchicalReconciliation.reconcile</code>(<strong><code>Y_h</code></strong>:<code>DataFrame</code>, <strong><code>Y_df</code></strong>:<code>DataFrame</code>, <strong><code>S</code></strong>:<code>DataFrame</code>, <strong><code>tags</code></strong>:<code>Dict</code>[<code>str</code>, <code>ndarray</code>])</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>Y_h</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>Base forecasts with columns <code>ds</code> and models to reconcile indexed by <code>unique_id</code>.</td>
-</tr>
-<tr>
-<td><strong><code>Y_df</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>Training set of base time series with columns <code>['ds', 'y']</code> indexed by <code>unique_id</code></td>
-</tr>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>Summing matrix of size <code>(base, bottom)</code>.</td>
-</tr>
-<tr>
-<td><strong><code>tags</code></strong></td>
-<td><code>typing.Dict[str, numpy.ndarray]</code></td>
-<td></td>
-<td>Each key is a level and its value contains tags associated to that level.</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-</div>
-
-
diff --git a/docs/evaluation.html b/docs/evaluation.html
deleted file mode 100644
index 9ecb59df..00000000
--- a/docs/evaluation.html
+++ /dev/null
@@ -1,206 +0,0 @@
----
-
-title: Hierarchical Evaluation 
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-summary: "Module for Hierarchical Evaluation."
-description: "Module for Hierarchical Evaluation."
-nb_path: "nbs/evaluation.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: nbs/evaluation.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="HierarchicalEvaluation" class="doc_header"><code>class</code> <code>HierarchicalEvaluation</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/evaluation.py#L13" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>HierarchicalEvaluation</code>(<strong><code>evaluators</code></strong>:<code>List</code>[<code>typing.Callable</code>])</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>evaluators</code></strong></td>
-<td><code>typing.List[typing.Callable]</code></td>
-<td></td>
-<td>functions with arguments <code>y</code>, <code>y_hat</code></td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="HierarchicalEvaluation.evaluate" class="doc_header"><code>HierarchicalEvaluation.evaluate</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/evaluation.py#L21" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>HierarchicalEvaluation.evaluate</code>(<strong><code>Y_h</code></strong>:<code>DataFrame</code>, <strong><code>Y_test</code></strong>:<code>DataFrame</code>, <strong><code>tags</code></strong>:<code>Dict</code>[<code>str</code>, <code>ndarray</code>], <strong><code>Y_df</code></strong>:<code>Optional</code>[<code>DataFrame</code>]=<em><code>None</code></em>, <strong><code>benchmark</code></strong>:<code>Optional</code>[<code>str</code>]=<em><code>None</code></em>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>Y_h</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>Forecasts with columns <code>['ds']</code> and models to evaluate.</td>
-</tr>
-<tr>
-<td><strong><code>Y_test</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>True values with columns <code>['ds', 'y']</code></td>
-</tr>
-<tr>
-<td><strong><code>tags</code></strong></td>
-<td><code>typing.Dict[str, numpy.ndarray]</code></td>
-<td></td>
-<td>Each key is a level and its value contains tags associated to that level.</td>
-</tr>
-<tr>
-<td><strong><code>Y_df</code></strong></td>
-<td><code>typing.Optional[pandas.core.frame.DataFrame]</code></td>
-<td><code>None</code></td>
-<td>Training set of base time series with columns <code>['ds', 'y']</code> indexed by <code>unique_id</code></td>
-</tr>
-<tr>
-<td><strong><code>benchmark</code></strong></td>
-<td><code>typing.Optional[str]</code></td>
-<td><code>None</code></td>
-<td>If passed, evaluators are scaled by the error of this benchark.</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>You can use your own metrics to evaluate the performance of each level in the structure. The metrics receive <code>y</code> and <code>y_hat</code> as arguments and they are numpy arrays of size <code>(series, horizon)</code>. Consider, for example, the function <code>rmse</code> that calculates the root mean squared error.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">rmse</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">):</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">((</span><span class="n">y</span><span class="o">-</span><span class="n">y_hat</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">,</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)))</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>Additionally, you can use functions based on insample values, such as <code>mase</code> (mean absolute scaled error). In this case you have to include the argument <code>y_insample</code> (of size <code>(series, insample_size)</code>) in your function. For example,</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-<div class="input">
-
-<div class="inner_cell">
-    <div class="input_area">
-<div class=" highlight hl-ipython3"><pre><span></span><span class="k">def</span> <span class="nf">mase</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">,</span> <span class="n">y_insample</span><span class="p">,</span> <span class="n">seasonality</span><span class="o">=</span><span class="mi">4</span><span class="p">):</span>
-    <span class="n">errors</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y</span> <span class="o">-</span> <span class="n">y_hat</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="n">scale</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">y_insample</span><span class="p">[:,</span> <span class="n">seasonality</span><span class="p">:]</span> <span class="o">-</span> <span class="n">y_insample</span><span class="p">[:,</span> <span class="p">:</span><span class="o">-</span><span class="n">seasonality</span><span class="p">]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">(</span><span class="n">errors</span> <span class="o">/</span> <span class="n">scale</span><span class="p">)</span>
-</pre></div>
-
-    </div>
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-</div>
-
-
diff --git a/docs/feed.xml b/docs/feed.xml
deleted file mode 100644
index d8d6ac99..00000000
--- a/docs/feed.xml
+++ /dev/null
@@ -1,32 +0,0 @@
----
-search: exclude
-layout: none
----
-
-<?xml version="1.0" encoding="UTF-8"?>
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
-    <channel>
-        <title>{{ site.title | xml_escape }}</title>
-        <description>{{ site.description | xml_escape }}</description>
-        <link>{{ site.url }}/</link>
-        <atom:link href="{{ "/feed.xml" | prepend: site.url }}" rel="self" type="application/rss+xml"/>
-        <pubDate>{{ site.time | date_to_rfc822 }}</pubDate>
-        <lastBuildDate>{{ site.time | date_to_rfc822 }}</lastBuildDate>
-        <generator>Jekyll v{{ jekyll.version }}</generator>
-        {% for post in site.posts limit:10 %}
-        <item>
-            <title>{{ post.title | xml_escape }}</title>
-            <description>{{ post.content | xml_escape }}</description>
-            <pubDate>{{ post.date | date_to_rfc822 }}</pubDate>
-            <link>{{ post.url | prepend: site.url }}</link>
-            <guid isPermaLink="true">{{ post.url | prepend: site.url }}</guid>
-            {% for tag in post.tags %}
-            <category>{{ tag | xml_escape }}</category>
-            {% endfor %}
-            {% for tag in page.tags %}
-            <category>{{ cat | xml_escape }}</category>
-            {% endfor %}
-        </item>
-        {% endfor %}
-    </channel>
-</rss>
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index fe2a18ff..00000000
--- a/docs/index.html
+++ /dev/null
@@ -1,168 +0,0 @@
----
-
-title: Hierarchical 👑 Forecast
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "nbs/index.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: nbs/index.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p><strong>HierarchicalForecast</strong> offers a collection of reconciliation methods, including <a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a>, <a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a>, <a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>, <a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a> and <a href="/hierarchicalforecast/methods.html#ERM"><code>ERM</code></a>.</p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="%F0%9F%8E%8A-Features">&#127882; Features<a class="anchor-link" href="#%F0%9F%8E%8A-Features"> </a></h2><ul>
-<li>Classic reconciliation methods:<ul>
-<li><a href="/hierarchicalforecast/methods.html#BottomUp"><code>BottomUp</code></a>: Simple addition to the upper levels.</li>
-<li><a href="/hierarchicalforecast/methods.html#TopDown"><code>TopDown</code></a>: Distributes the top levels forecasts trough the hierarchies.</li>
-</ul>
-</li>
-<li>Alternative reconciliation methods:<ul>
-<li><a href="/hierarchicalforecast/methods.html#MiddleOut"><code>MiddleOut</code></a>: It anchors the base predictions in a middle level. The levels above the base predictions use the bottom-up approach, while the levels below use a top-down.</li>
-<li><a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a>: Minimizes the total forecast variance of the space of coherent forecasts, with the Minimum Trace reconciliation.</li>
-<li><a href="/hierarchicalforecast/methods.html#ERM"><code>ERM</code></a>: Optimizes the reconciliation matrix minimizing an L1 regularized objective.</li>
-</ul>
-</li>
-</ul>
-<p>Missing something? Please open an issue here or write us in <a href="https://join.slack.com/t/nixtlaworkspace/shared_invite/zt-135dssye9-fWTzMpv2WBthq8NK0Yvu6A"><img src="https://img.shields.io/badge/Slack-4A154B?&amp;logo=slack&amp;logoColor=white" alt="Slack"></a></p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="%F0%9F%93%96-Why?">&#128214; Why?<a class="anchor-link" href="#%F0%9F%93%96-Why?"> </a></h2><p><strong>Short</strong>: We want to contribute to the ML field by providing reliable baselines and benchmarks for hierarchical forecasting task in industry and academia. Here's the complete <a href="https://arxiv.org/abs/2207.03517">paper</a>.</p>
-<p><strong>Verbose</strong>: <code>HierarchicalForecast</code> integrates publicly available processed datasets, evaluation metrics, and a curated set of statistical baselines. In this library we provide usage examples and references to extensive experiments where we showcase the baseline's use and evaluate the accuracy of their predictions. With this work, we hope to contribute to Machine Learning forecasting by bridging the gap to statistical and econometric modeling, as well as providing tools for the development of novel hierarchical forecasting algorithms rooted in a thorough comparison of these well-established models. We intend to continue maintaining and increasing the repository, promoting collaboration across the forecasting community.</p>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="%F0%9F%92%BB-Installation">&#128187; Installation<a class="anchor-link" href="#%F0%9F%92%BB-Installation"> </a></h2><h3 id="PyPI">PyPI<a class="anchor-link" href="#PyPI"> </a></h3><p>You can install the <em>released version</em> of <code>HierarchicalForecast</code> from the <a href="https://pypi.org">Python package index</a> with:</p>
-<div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">hierarchicalforecast</span>
-</pre></div>
-<p>(Installing inside a python virtualenvironment or a conda environment is recommended.)</p>
-<h3 id="Conda">Conda<a class="anchor-link" href="#Conda"> </a></h3><p>Also you can install the <em>released version</em> of <code>HierarchicalForecast</code> from <a href="https://anaconda.org">conda</a> with:</p>
-<div class="highlight"><pre><span></span><span class="n">conda</span> <span class="n">install</span> <span class="o">-</span><span class="n">c</span> <span class="n">conda</span><span class="o">-</span><span class="n">forge</span> <span class="n">hierarchicalforecast</span>
-</pre></div>
-<p>(Installing inside a python virtualenvironment or a conda environment is recommended.)</p>
-<h3 id="Dev-Mode">Dev Mode<a class="anchor-link" href="#Dev-Mode"> </a></h3><p>If you want to make some modifications to the code and see the effects in real time (without reinstalling), follow the steps below:</p>
-<div class="highlight"><pre><span></span>git clone https://github.com/Nixtla/hierarchicalforecast.git
-<span class="nb">cd</span> hierarchicalforecast
-pip install -e .
-</pre></div>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="%F0%9F%A7%AC-How-to-use">&#129516; How to use<a class="anchor-link" href="#%F0%9F%A7%AC-How-to-use"> </a></h2><p>The following example needs <code>statsforecast</code> and <code>datasetsforecast</code> as additional packages. If not installed, install it via your preferred method, e.g. <code>pip install statsforecast datasetsforecast</code>.
-The <code>datasetsforecast</code> library allows us to download hierarhical datasets and we will use <code>statsforecast</code> to compute base forecasts to be reconciled.</p>
-<p>You can open this example in Colab <a href="https://colab.research.google.com/github/nixtla/hierarchicalforecast/blob/main/examples/TourismSmall.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a></p>
-<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
-<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="nn">pd</span>
-
-<span class="c1">#obtain hierarchical dataset</span>
-<span class="kn">from</span> <span class="nn">datasetsforecast.hierarchical</span> <span class="kn">import</span> <span class="n">HierarchicalData</span>
-<span class="c1">#obtain hierarchical reconciliation methods and evaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.core</span> <span class="kn">import</span> <span class="n">HierarchicalReconciliation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.evaluation</span> <span class="kn">import</span> <span class="n">HierarchicalEvaluation</span>
-<span class="kn">from</span> <span class="nn">hierarchicalforecast.methods</span> <span class="kn">import</span> <span class="n">BottomUp</span><span class="p">,</span> <span class="n">TopDown</span><span class="p">,</span> <span class="n">MiddleOut</span>
-<span class="c1"># compute base forecast no coherent</span>
-<span class="kn">from</span> <span class="nn">statsforecast.core</span> <span class="kn">import</span> <span class="n">StatsForecast</span>
-<span class="kn">from</span> <span class="nn">statsforecast.models</span> <span class="kn">import</span> <span class="n">auto_arima</span><span class="p">,</span> <span class="n">naive</span>
-
-<span class="c1"># Load TourismSmall dataset</span>
-<span class="n">Y_df</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span> <span class="o">=</span> <span class="n">HierarchicalData</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s1">&#39;./data&#39;</span><span class="p">,</span> <span class="s1">&#39;TourismSmall&#39;</span><span class="p">)</span>
-<span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="o">.</span><span class="n">to_datetime</span><span class="p">(</span><span class="n">Y_df</span><span class="p">[</span><span class="s1">&#39;ds&#39;</span><span class="p">])</span>
-
-<span class="c1">#split train/test sets</span>
-<span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">tail</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df</span><span class="o">.</span><span class="n">drop</span><span class="p">(</span><span class="n">Y_df_test</span><span class="o">.</span><span class="n">index</span><span class="p">)</span>
-<span class="n">Y_df_test</span> <span class="o">=</span> <span class="n">Y_df_test</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-<span class="n">Y_df_train</span> <span class="o">=</span> <span class="n">Y_df_train</span><span class="o">.</span><span class="n">set_index</span><span class="p">(</span><span class="s1">&#39;unique_id&#39;</span><span class="p">)</span>
-
-<span class="c1"># Compute base auto-ARIMA predictions</span>
-<span class="n">fcst</span> <span class="o">=</span> <span class="n">StatsForecast</span><span class="p">(</span><span class="n">df</span><span class="o">=</span><span class="n">Y_df_train</span><span class="p">,</span> <span class="n">models</span><span class="o">=</span><span class="p">[(</span><span class="n">auto_arima</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span> <span class="n">naive</span><span class="p">],</span> <span class="n">freq</span><span class="o">=</span><span class="s1">&#39;M&#39;</span><span class="p">,</span> <span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
-<span class="n">Y_hat_df</span> <span class="o">=</span> <span class="n">fcst</span><span class="o">.</span><span class="n">forecast</span><span class="p">(</span><span class="n">h</span><span class="o">=</span><span class="mi">12</span><span class="p">)</span>
-
-<span class="c1"># Reconcile the base predictions</span>
-<span class="n">reconcilers</span> <span class="o">=</span> <span class="p">[</span>
-    <span class="n">BottomUp</span><span class="p">(),</span>
-    <span class="n">TopDown</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="s1">&#39;forecast_proportions&#39;</span><span class="p">),</span>
-    <span class="n">MiddleOut</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="s1">&#39;Country/Purpose/State&#39;</span><span class="p">,</span> <span class="n">top_down_method</span><span class="o">=</span><span class="s1">&#39;forecast_proportions&#39;</span><span class="p">)</span>
-<span class="p">]</span>
-<span class="n">hrec</span> <span class="o">=</span> <span class="n">HierarchicalReconciliation</span><span class="p">(</span><span class="n">reconcilers</span><span class="o">=</span><span class="n">reconcilers</span><span class="p">)</span>
-<span class="n">Y_rec_df</span> <span class="o">=</span> <span class="n">hrec</span><span class="o">.</span><span class="n">reconcile</span><span class="p">(</span><span class="n">Y_hat_df</span><span class="p">,</span> <span class="n">Y_df_train</span><span class="p">,</span> <span class="n">S</span><span class="p">,</span> <span class="n">tags</span><span class="p">)</span>
-</pre></div>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h3 id="Evaluation">Evaluation<a class="anchor-link" href="#Evaluation"> </a></h3><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">mse</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">y_hat</span><span class="p">):</span>
-    <span class="k">return</span> <span class="n">np</span><span class="o">.</span><span class="n">mean</span><span class="p">((</span><span class="n">y</span><span class="o">-</span><span class="n">y_hat</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
-
-<span class="n">evaluator</span> <span class="o">=</span> <span class="n">HierarchicalEvaluation</span><span class="p">(</span><span class="n">evaluators</span><span class="o">=</span><span class="p">[</span><span class="n">mse</span><span class="p">])</span>
-<span class="n">evaluator</span><span class="o">.</span><span class="n">evaluate</span><span class="p">(</span><span class="n">Y_h</span><span class="o">=</span><span class="n">Y_rec_df</span><span class="p">,</span> <span class="n">Y_test</span><span class="o">=</span><span class="n">Y_df_test</span><span class="p">,</span> 
-                   <span class="n">tags</span><span class="o">=</span><span class="n">tags</span><span class="p">,</span> <span class="n">benchmark</span><span class="o">=</span><span class="s1">&#39;naive&#39;</span><span class="p">)</span>
-</pre></div>
-
-</div>
-</div>
-</div>
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<h2 id="How-to-cite">How to cite<a class="anchor-link" href="#How-to-cite"> </a></h2><p>Here's the complete <a href="https://arxiv.org/abs/2207.03517">paper</a>.</p>
-<div class="highlight"><pre><span></span><span class="nc">@article</span><span class="p">{</span><span class="nl">olivares2022hierarchicalforecast</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">author</span><span class="w">    </span><span class="p">=</span><span class="w"> </span><span class="s">{Kin G. Olivares and</span>
-<span class="s">                 Federico Garza and </span>
-<span class="s">                 David Luo and </span>
-<span class="s">                 Cristian Challú and</span>
-<span class="s">                 Max Mergenthaler and</span>
-<span class="s">                 Artur Dubrawski}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">title</span><span class="w">     </span><span class="p">=</span><span class="w"> </span><span class="s">{HierarchicalForecast: A Reference Framework for Hierarchical Forecasting in Python}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">journal</span><span class="w">   </span><span class="p">=</span><span class="w"> </span><span class="s">{Computing Research Repository}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">volume</span><span class="w">    </span><span class="p">=</span><span class="w"> </span><span class="s">{abs/2207.03517}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">year</span><span class="w">      </span><span class="p">=</span><span class="w"> </span><span class="s">{2022}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">url</span><span class="w">       </span><span class="p">=</span><span class="w"> </span><span class="s">{https://arxiv.org/abs/2207.03517}</span><span class="p">,</span><span class="w"></span>
-<span class="w">    </span><span class="na">archivePrefix</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">{arXiv}</span><span class="w"></span>
-<span class="p">}</span><span class="w"></span>
-</pre></div>
-
-</div>
-</div>
-</div>
-</div>
-
-
diff --git a/docs/methods.html b/docs/methods.html
deleted file mode 100644
index b6f4f267..00000000
--- a/docs/methods.html
+++ /dev/null
@@ -1,769 +0,0 @@
----
-
-title: Hierachical Reconciliation Methods
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-summary: "Classes in this module have the `reconcile` method capable of reconcile base forecasts using `numpy` arrays.  "
-description: "Classes in this module have the `reconcile` method capable of reconcile base forecasts using `numpy` arrays.  "
-nb_path: "nbs/methods.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: nbs/methods.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="BottomUp" class="doc_header"><code>class</code> <code>BottomUp</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L33" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>BottomUp</code>()</p>
-</blockquote>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="BottomUp.reconcile" class="doc_header"><code>BottomUp.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L35" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>BottomUp.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>idx_bottom</code></strong>:<code>ndarray</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>idx_bottom</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Indices corresponding to the bottom level of <code>S</code>, size (<code>bottom</code>)</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The most basic hierarchical reconciliation is performed using an Bottom-Up strategy. It was proposed for the first time by Orcutt in 1968.
-The corresponding hierarchical "projection" matrix is defined as:</p>
-<p>{% raw %}
-$$\mathbf{P}_{\text{BU}} = [\mathbf{0}_{\mathrm{[b],[a]}}\;|\;\mathbf{I}_{\mathrm{[b][b]}}]$$
-{% endraw %}</p>
-<ul>
-<li><a href="http://www.jstor.org/stable/1815532">Orcutt, G.H., Watts, H.W., &amp; Edwards, J.B.(1968). Data aggregation and information loss. The American Economic Review, 58 , 773{787)</a></li>
-</ul>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="TopDown" class="doc_header"><code>class</code> <code>TopDown</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L137" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>TopDown</code>(<strong><code>method</code></strong>:<code>str</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>method</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>One of <code>forecast_proportions</code>, <code>average_proportions</code> and <code>proportion_averages</code></td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="TopDown.reconcile" class="doc_header"><code>TopDown.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L145" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>TopDown.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>y_insample</code></strong>:<code>ndarray</code>, <strong><code>levels</code></strong>:<code>Dict</code>[<code>str</code>, <code>ndarray</code>])</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample values of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>levels</code></strong></td>
-<td><code>typing.Dict[str, numpy.ndarray]</code></td>
-<td></td>
-<td>Each key is a level and each value its <code>S</code> indices</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The Top Down hierarchical reconciliation method, distributes the total aggregate predictions and decomposes it down the hierarchy using proportions $\mathbf{p}_{\mathrm{[b]}}$ that can be actual historical values or estimated.</p>
-<p>{% raw %}
-$$\mathbf{P}=[\mathbf{p}_{\mathrm{[b]}}\;|\;\mathbf{0}_{\mathrm{[b][a,b\;-1]}}]$$
-{% endraw %}</p>
-<ul>
-<li><a href="https://onlinelibrary.wiley.com/doi/abs/10.1002/for.3980090304">Disaggregation methods to expedite product line forecasting. Journal of Forecasting, 9 , 233–254. doi:10.1002/for.3980090304</a></li>
-<li><a href="https://doi.org/10.1016/S0305-0548(99">An investigation of aggregate variable time series forecast strategies with specific subaggregate time series statistical correlation. Computers and Operations Research, 26 , 1133–1149. doi:10.1016/S0305-0548(99)00017-9</a>00017-9)</li>
-</ul>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="MiddleOut" class="doc_header"><code>class</code> <code>MiddleOut</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L226" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>MiddleOut</code>(<strong><code>level</code></strong>:<code>str</code>, <strong><code>top_down_method</code></strong>:<code>str</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>level</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>Middle level</td>
-</tr>
-<tr>
-<td><strong><code>top_down_method</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>One of <code>forecast_proportions</code>, <code>average_proportions</code> and <code>proportion_averages</code></td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="MiddleOut.reconcile" class="doc_header"><code>MiddleOut.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L236" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>MiddleOut.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>y_insample</code></strong>:<code>ndarray</code>, <strong><code>levels</code></strong>:<code>Dict</code>[<code>str</code>, <code>ndarray</code>])</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample values of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>levels</code></strong></td>
-<td><code>typing.Dict[str, numpy.ndarray]</code></td>
-<td></td>
-<td>Each key is a level and each value its <code>S</code> indices</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>This method is only available for strictly hierarchical structures. It anchors the base predictions in a middle level. The levels above the base predictions use the bottom-up approach, while the levels below use a top-down.</p>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="MinTrace" class="doc_header"><code>class</code> <code>MinTrace</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L305" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>MinTrace</code>(<strong><code>method</code></strong>:<code>str</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>method</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>One of <code>ols</code>, <code>wls_struct</code>, <code>wls_var</code>, <code>mint_shrink</code>, <code>mint_co</code></td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="MinTrace.reconcile" class="doc_header"><code>MinTrace.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L313" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>MinTrace.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>y_insample</code></strong>:<code>ndarray</code>, <strong><code>y_hat_insample</code></strong>:<code>ndarray</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample values of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample forecasts of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>This reconciliation algorithm proposed by Wickramasuriya et al. depends on a generalized least squares estimator and an estimator of the covariance matrix of the coherency errors $\mathbf{W}_{h}$. The Min Trace algorithm minimizes the squared errors for the coherent forecasts under an unbiasedness assumption; the solution has a closed form.</p>
-<p>{% raw %}
-$$\mathbf{P}_{\text{MinT}} = \left(\mathbf{S}^{\intercal}\mathbf{W}_{h}\mathbf{S}\right)^{-1} \mathbf{S}^{\intercal} \mathbf{W}^{-1}_{h}$$
-{% endraw %}</p>
-<ul>
-<li><a href="https://robjhyndman.com/publications/mint/">Wickramasuriya, S. L., Athanasopoulos, G., &amp; Hyndman, R. J. (2019). Optimal forecast reconciliation for hierarchical and grouped time series through trace minimization. Journal of the American Statistical Association, 114 , 804–819. doi:10.1080/01621459.2018.1448825.</a></li>
-</ul>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="OptimalCombination" class="doc_header"><code>class</code> <code>OptimalCombination</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L340" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>OptimalCombination</code>(<strong><code>method</code></strong>:<code>str</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>method</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>Allowed Optimal Combination Methods: 'ols', 'wls_struct'</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="OptimalCombination.reconcile" class="doc_header"><code>OptimalCombination.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L352" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>OptimalCombination.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>y_insample</code></strong>:<code>ndarray</code>=<em><code>None</code></em>, <strong><code>y_hat_insample</code></strong>:<code>ndarray</code>=<em><code>None</code></em>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td><code>None</code></td>
-<td>Insample values of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td><code>None</code></td>
-<td>Insample forecasts of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>This reconciliation algorithm was proposed by Hyndman et al. 2011, the method uses generalized least squares estimator using the coherency errors covariance matrix. Consider the covariance of the base forecast $\textrm{Var}(\epsilon_{h}) = \Sigma_{h}$, the $\mathbf{P}$ matrix of this method is defined by:</p>
-<p>{% raw %}
-$$ \mathbf{P} = \left(\mathbf{S}^{\intercal}\Sigma_{h}^{\dagger}\mathbf{S}\right)^{-1}\mathbf{S}^{\intercal}\Sigma^{\dagger}_{h}$$
-{% endraw %}</p>
-<p>where $\Sigma_{h}^{\dagger}$ denotes the variance pseudo-inverse. The method was later proven equivalent to <a href="/hierarchicalforecast/methods.html#MinTrace"><code>MinTrace</code></a> variants.</p>
-<ul>
-<li><a href="https://robjhyndman.com/papers/Hierarchical6.pdf">Rob J. Hyndman, Roman A. Ahmed, George Athanasopoulos, Han Lin Shang. "Optimal Combination Forecasts for Hierarchical Time Series" (2010).</a></li>
-<li><a href="https://robjhyndman.com/papers/MinT.pdf">Shanika L. Wickramasuriya, George Athanasopoulos and Rob J. Hyndman. "Optimal Combination Forecasts for Hierarchical Time Series" (2010).</a></li>
-</ul>
-
-</div>
-</div>
-</div>
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h2 id="ERM" class="doc_header"><code>class</code> <code>ERM</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L444" class="source_link" style="float:right">[source]</a></h2><blockquote><p><code>ERM</code>(<strong><code>method</code></strong>:<code>str</code>, <strong><code>lambda_reg</code></strong>:<code>float</code>=<em><code>0.01</code></em>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>method</code></strong></td>
-<td><code>str</code></td>
-<td></td>
-<td>one of <code>closed</code>, <code>reg</code> and <code>reg_bu</code></td>
-</tr>
-<tr>
-<td><strong><code>lambda_reg</code></strong></td>
-<td><code>float</code></td>
-<td><code>0.01</code></td>
-<td>l1 regularizer for <code>reg</code> and <code>reg_bu</code></td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="ERM.reconcile" class="doc_header"><code>ERM.reconcile</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/methods.py#L454" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>ERM.reconcile</code>(<strong><code>S</code></strong>:<code>ndarray</code>, <strong><code>y_hat</code></strong>:<code>ndarray</code>, <strong><code>y_insample</code></strong>:<code>ndarray</code>, <strong><code>y_hat_insample</code></strong>:<code>ndarray</code>, <strong><code>idx_bottom</code></strong>:<code>ndarray</code>)</p>
-</blockquote>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>S</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Summing matrix of size (<code>base</code>, <code>bottom</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Forecast values of size (<code>base</code>, <code>horizon</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample values of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>y_hat_insample</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Insample forecasts of size (<code>base</code>, <code>insample_size</code>)</td>
-</tr>
-<tr>
-<td><strong><code>idx_bottom</code></strong></td>
-<td><code>ndarray</code></td>
-<td></td>
-<td>Indices corresponding to the bottom level of <code>S</code>, size (<code>bottom</code>)</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-<div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
-<div class="text_cell_render border-box-sizing rendered_html">
-<p>The Empirical Risk Minimization reconciliation strategy relaxes the unbiasedness assumptions from
-previous reconciliation methods like MinT and optimizes square errors between the reconciled predictions
-and the validation data to obtain an optimal reconciliation matrix P.</p>
-<p>The exact solution for $\mathbf{P}$ (<code>method='closed'</code>) follows the expression:</p>
-<p>{% raw %}
-$$\mathbf{P}^{*} = \left(\mathbf{S}^{\intercal}\mathbf{S}\right)^{-1}\mathbf{Y}^{\intercal}\hat{\mathbf{Y}}\left(\hat{\mathbf{Y}}\hat{\mathbf{Y}}\right)^{-1}$$
-{% endraw %}</p>
-<p>The alternative Lasso regularized $\mathbf{P}$ solution (<code>method='reg_bu'</code>) is useful when the observations of validation data is 
-limited or the exact solution has low numerical stability.</p>
-<p>{% raw %}
-$$\mathbf{P}^{*} = \text{argmin}_{\mathbf{P}} ||\mathbf{Y}-\mathbf{S} \mathbf{P} \hat{Y} ||^{2}_{2} + \lambda ||\mathbf{P}-\mathbf{P}_{\text{BU}}||_{1}$$
-{% endraw %}</p>
-<ul>
-<li><a href="https://doi.org/10.1145/3292500.3330976">Ben Taieb, S., &amp; Koo, B. (2019). Regularized regression for hierarchical forecasting without unbiasedness conditions. In Proceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery &amp; Data Mining KDD '19 (p. 1337{1347). New York, NY, USA: Association for Computing Machinery.</a></li>
-</ul>
-
-</div>
-</div>
-</div>
-</div>
-
-
diff --git a/docs/sidebar.json b/docs/sidebar.json
deleted file mode 100644
index 3cadc9db..00000000
--- a/docs/sidebar.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-  "HierarchicalForecast": {
-    "Overview": "/",
-	"": {
-		"Reference": {
-			"Hierarchical Reconciliation": "/core",
-			"Hierachical Reconciliation Methods": "/methods",
-			"Hierarchical Evaluation ": "/evaluation",
-			"Utils": "/utils"
-		}
-	},
-	"empty2": {
-		"Quick Start": {
-			"Reconcile Tourism Small Dataset": "/TourismSmall",
-			"Forecasting Australian domestic tourism": "/AustralianDomesticTourism",
-			"Forecasting Australian prison population": "/AustralianPrisonPopulation"
-		  }
-	}
-  }
-}
diff --git a/docs/sitemap.xml b/docs/sitemap.xml
deleted file mode 100644
index 38a04d6c..00000000
--- a/docs/sitemap.xml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-layout: none
-search: exclude
----
-
-<?xml version="1.0" encoding="UTF-8"?>
-<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
-  {% for post in site.posts %}
-  {% unless post.search == "exclude" %}
-  <url>
-    <loc>{{site.url}}{{post.url}}</loc>
-  </url>
-  {% endunless %}
-  {% endfor %}
-
-
-  {% for page in site.pages %}
-  {% unless page.search == "exclude" %}
-  <url>
-    <loc>{{site.url}}{{ page.url}}</loc>
-  </url>
-  {% endunless %}
-  {% endfor %}
-</urlset>
\ No newline at end of file
diff --git a/docs/utils.html b/docs/utils.html
deleted file mode 100644
index 0e3e5235..00000000
--- a/docs/utils.html
+++ /dev/null
@@ -1,102 +0,0 @@
----
-
-title: Utils for Hierarchical Time Series Forecasting
-
-
-keywords: fastai
-sidebar: home_sidebar
-
-
-
-nb_path: "nbs/utils.ipynb"
----
-<!--
-
-#################################################
-### THIS FILE WAS AUTOGENERATED! DO NOT EDIT! ###
-#################################################
-# file to edit: nbs/utils.ipynb
-# command to build the docs after a change: nbdev_build_docs
-
--->
-
-<div class="container" id="notebook-container">
-        
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-</div>
-    {% endraw %}
-
-    {% raw %}
-    
-<div class="cell border-box-sizing code_cell rendered">
-
-<div class="output_wrapper">
-<div class="output">
-
-<div class="output_area">
-
-
-<div class="output_markdown rendered_html output_subarea ">
-<h4 id="aggregate" class="doc_header"><code>aggregate</code><a href="https://github.com/Nixtla/hierarchicalforecast/tree/main/hierarchicalforecast/utils.py#L27" class="source_link" style="float:right">[source]</a></h4><blockquote><p><code>aggregate</code>(<strong><code>df</code></strong>:<code>DataFrame</code>, <strong><code>spec</code></strong>:<code>List</code>[<code>typing.List[str]</code>], <strong><code>agg_fn</code></strong>:<code>typing.Callable</code>=<em><code>sum</code></em>)</p>
-</blockquote>
-<p>Aggregates <code>df</code> according to <code>spec</code> using <code>agg_fn</code>.</p>
-<table>
-<thead><tr>
-<th></th>
-<th>Type</th>
-<th>Default</th>
-<th>Details</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td><strong><code>df</code></strong></td>
-<td><code>DataFrame</code></td>
-<td></td>
-<td>DataFrame with columns <code>['ds', 'y']</code> and columns to aggregate</td>
-</tr>
-<tr>
-<td><strong><code>spec</code></strong></td>
-<td><code>typing.List[typing.List[str]]</code></td>
-<td></td>
-<td>List of levels. Each element of the list contains a list of columns of <code>df</code> to aggregate.</td>
-</tr>
-<tr>
-<td><strong><code>agg_fn</code></strong></td>
-<td><code>typing.Callable</code></td>
-<td><code>sum</code></td>
-<td>Function used to aggregate <code>'y'</code>.</td>
-</tr>
-</tbody>
-</table>
-
-</div>
-
-</div>
-
-</div>
-</div>
-
-</div>
-    {% endraw %}
-
-</div>
-
-
diff --git a/environment.yml b/environment.yml
index c1c14b9a..8ee4f209 100644
--- a/environment.yml
+++ b/environment.yml
@@ -10,4 +10,4 @@ dependencies:
   - statsmodels
   - pip
   - pip:
-    - nbdev==1.2.10
+    - nbdev
diff --git a/examples/AustralianDomesticTourism-results-fable.png b/examples/AustralianDomesticTourism-results-fable.png
deleted file mode 100644
index 15f437d0..00000000
Binary files a/examples/AustralianDomesticTourism-results-fable.png and /dev/null differ
diff --git a/examples/AustralianPrisonPopulation-results-fable.png b/examples/AustralianPrisonPopulation-results-fable.png
deleted file mode 100644
index fc4f988c..00000000
Binary files a/examples/AustralianPrisonPopulation-results-fable.png and /dev/null differ
diff --git a/hierarchicalforecast/_modidx.py b/hierarchicalforecast/_modidx.py
new file mode 100644
index 00000000..4544bbc5
--- /dev/null
+++ b/hierarchicalforecast/_modidx.py
@@ -0,0 +1,51 @@
+# Autogenerated by nbdev
+
+d = { 'settings': { 'allowed_cell_metadata_keys': '',
+                'allowed_metadata_keys': '',
+                'audience': 'Developers',
+                'author': 'Nixtla',
+                'author_email': 'business@nixtla.io',
+                'black_formatting': 'False',
+                'branch': 'main',
+                'clean_ids': 'True',
+                'copyright': 'Nixtla Inc.',
+                'custom_sidebar': 'True',
+                'description': 'Hierarchical Methods Time series forecasting',
+                'doc_baseurl': '/hierarchicalforecast/',
+                'doc_host': 'https://Nixtla.github.io',
+                'doc_path': '_docs',
+                'git_url': 'https://github.com/Nixtla/hierarchicalforecast/tree/main/',
+                'host': 'github',
+                'jupyter_hooks': 'True',
+                'keywords': 'time-series forecasting datasets hierarchical',
+                'language': 'English',
+                'lib_name': 'hierarchicalforecast',
+                'lib_path': 'hierarchicalforecast',
+                'license': 'mit',
+                'min_python': '3.7',
+                'nbs_path': 'nbs',
+                'readme_nb': 'index.ipynb',
+                'recursive': 'False',
+                'requirements': 'numpy numba pandas scikit-learn statsmodels',
+                'status': '2',
+                'title': 'hierarchicalforecast',
+                'tst_flags': '',
+                'user': 'Nixtla',
+                'version': '0.0.6'},
+  'syms': { 'hierarchicalforecast.core': { 'hierarchicalforecast.core.HierarchicalReconciliation': 'https://Nixtla.github.io/hierarchicalforecast/core.html#hierarchicalreconciliation',
+                                           'hierarchicalforecast.core.HierarchicalReconciliation.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/core.html#hierarchicalreconciliation.reconcile'},
+            'hierarchicalforecast.evaluation': { 'hierarchicalforecast.evaluation.HierarchicalEvaluation': 'https://Nixtla.github.io/hierarchicalforecast/evaluation.html#hierarchicalevaluation',
+                                                 'hierarchicalforecast.evaluation.HierarchicalEvaluation.evaluate': 'https://Nixtla.github.io/hierarchicalforecast/evaluation.html#hierarchicalevaluation.evaluate'},
+            'hierarchicalforecast.methods': { 'hierarchicalforecast.methods.BottomUp': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#bottomup',
+                                              'hierarchicalforecast.methods.BottomUp.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#bottomup.reconcile',
+                                              'hierarchicalforecast.methods.ERM': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#erm',
+                                              'hierarchicalforecast.methods.ERM.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#erm.reconcile',
+                                              'hierarchicalforecast.methods.MiddleOut': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#middleout',
+                                              'hierarchicalforecast.methods.MiddleOut.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#middleout.reconcile',
+                                              'hierarchicalforecast.methods.MinTrace': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#mintrace',
+                                              'hierarchicalforecast.methods.MinTrace.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#mintrace.reconcile',
+                                              'hierarchicalforecast.methods.OptimalCombination': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#optimalcombination',
+                                              'hierarchicalforecast.methods.OptimalCombination.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#optimalcombination.reconcile',
+                                              'hierarchicalforecast.methods.TopDown': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#topdown',
+                                              'hierarchicalforecast.methods.TopDown.reconcile': 'https://Nixtla.github.io/hierarchicalforecast/methods.html#topdown.reconcile'},
+            'hierarchicalforecast.utils': {'hierarchicalforecast.utils.aggregate': 'https://Nixtla.github.io/hierarchicalforecast/utils.html#aggregate'}}}
\ No newline at end of file
diff --git a/hierarchicalforecast/core.py b/hierarchicalforecast/core.py
index 6b65a2f1..98eae4f6 100644
--- a/hierarchicalforecast/core.py
+++ b/hierarchicalforecast/core.py
@@ -1,8 +1,9 @@
-# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/core.ipynb (unless otherwise specified).
+# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/core.ipynb.
 
+# %% auto 0
 __all__ = ['HierarchicalReconciliation']
 
-# Cell
+# %% ../nbs/core.ipynb 2
 from functools import partial
 from inspect import signature
 from typing import Callable, Dict, List, Optional
@@ -10,7 +11,7 @@
 import numpy as np
 import pandas as pd
 
-# Internal Cell
+# %% ../nbs/core.ipynb 4
 def _build_fn_name(fn) -> str:
     fn_name = type(fn).__name__
     func_params = fn.__dict__
@@ -19,17 +20,17 @@ def _build_fn_name(fn) -> str:
         fn_name += '_' + '_'.join(func_params)
     return fn_name
 
-# Cell
+# %% ../nbs/core.ipynb 5
 class HierarchicalReconciliation:
-
+    
     def __init__(
-            self,
-            reconcilers: List[Callable] # Reconciliation classes of the `methods` module
+            self, 
+            reconcilers: List[Callable] # Reconciliation classes of the `methods` module 
         ):
         self.reconcilers = reconcilers
-
+        
     def reconcile(
-            self,
+            self, 
             Y_h: pd.DataFrame, # Base forecasts with columns `ds` and models to reconcile indexed by `unique_id`.
             Y_df: pd.DataFrame, # Training set of base time series with columns `['ds', 'y']` indexed by `unique_id`
                                 # If a class of `self.reconciles` receives
@@ -59,7 +60,7 @@ def reconcile(
                     if model_name in Y_df:
                         y_hat_insample = Y_df.pivot(columns='ds', values=model_name).loc[uids].values
                         y_hat_insample = y_hat_insample.astype(np.float32)
-                        common_vals['y_hat_insample'] = y_hat_insample
+                        common_vals['y_hat_insample'] = y_hat_insample 
                     else:
                         # some methods have the residuals argument
                         # but they don't need them
@@ -71,4 +72,4 @@ def reconcile(
                 fcsts[f'{model_name}/{reconcile_fn_name}'] = fcsts_model.flatten()
                 if has_fitted:
                     del common_vals['y_hat_insample']
-        return fcsts
\ No newline at end of file
+        return fcsts
diff --git a/hierarchicalforecast/evaluation.py b/hierarchicalforecast/evaluation.py
index a4052037..b6a7738b 100644
--- a/hierarchicalforecast/evaluation.py
+++ b/hierarchicalforecast/evaluation.py
@@ -1,25 +1,26 @@
-# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/evaluation.ipynb (unless otherwise specified).
+# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/evaluation.ipynb.
 
+# %% auto 0
 __all__ = ['HierarchicalEvaluation']
 
-# Cell
+# %% ../nbs/evaluation.ipynb 2
 from inspect import signature
 from typing import Callable, Dict, List, Optional
 
 import numpy as np
 import pandas as pd
 
-# Cell
+# %% ../nbs/evaluation.ipynb 4
 class HierarchicalEvaluation:
-
+    
     def __init__(
-            self,
-            evaluators: List[Callable] # functions with arguments `y`, `y_hat`
+            self, 
+            evaluators: List[Callable] # functions with arguments `y`, `y_hat` 
         ):
         self.evaluators = evaluators
-
+        
     def evaluate(
-            self,
+            self, 
             Y_h: pd.DataFrame, # Forecasts with columns `['ds']` and models to evaluate.
             Y_test: pd.DataFrame, # True values with columns `['ds', 'y']`
             tags: Dict[str, np.ndarray], # Each key is a level and its value contains tags associated to that level.
@@ -60,4 +61,4 @@ def evaluate(
                                 scale = 1.
                         loss /= scale
                     evaluation.loc[(level, fn_name), model] = loss
-        return evaluation
\ No newline at end of file
+        return evaluation
diff --git a/hierarchicalforecast/methods.py b/hierarchicalforecast/methods.py
index a562f1fc..0e9c106e 100644
--- a/hierarchicalforecast/methods.py
+++ b/hierarchicalforecast/methods.py
@@ -1,8 +1,9 @@
-# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/methods.ipynb (unless otherwise specified).
+# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/methods.ipynb.
 
+# %% auto 0
 __all__ = ['BottomUp', 'TopDown', 'MiddleOut', 'MinTrace', 'OptimalCombination', 'ERM']
 
-# Cell
+# %% ../nbs/methods.ipynb 2
 from collections import OrderedDict
 from copy import deepcopy
 from typing import Dict, List, Union
@@ -11,14 +12,14 @@
 from numba import njit
 from statsmodels.stats.moment_helpers import cov2corr
 
-# Cell
-def _reconcile(S: np.ndarray, P: np.ndarray, W: np.ndarray,
+# %% ../nbs/methods.ipynb 4
+def _reconcile(S: np.ndarray, P: np.ndarray, W: np.ndarray, 
                y_hat: np.ndarray, SP: np.ndarray = None):
     if SP is None:
         SP = S @ P
     return np.matmul(SP, y_hat)
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 5
 def bottom_up(S: np.ndarray,
               y_hat: np.ndarray,
               idx_bottom: List[int]):
@@ -29,9 +30,9 @@ def bottom_up(S: np.ndarray,
     W = np.eye(n_hiers, dtype=np.float32)
     return _reconcile(S, P, W, y_hat)
 
-# Cell
+# %% ../nbs/methods.ipynb 6
 class BottomUp:
-
+    
     def reconcile(
             self,
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
@@ -39,11 +40,11 @@ def reconcile(
             idx_bottom: np.ndarray # Indices corresponding to the bottom level of `S`, size (`bottom`)
         ):
         return bottom_up(S=S, y_hat=y_hat, idx_bottom=idx_bottom)
-
+    
     __call__ = reconcile
 
-# Internal Cell
-def is_strictly_hierarchical(S: np.ndarray,
+# %% ../nbs/methods.ipynb 13
+def is_strictly_hierarchical(S: np.ndarray, 
                              levels: Dict[str, np.ndarray]):
     # main idea:
     # if S represents a strictly hierarchical structure
@@ -56,11 +57,11 @@ def is_strictly_hierarchical(S: np.ndarray,
     # making S categorical
     hiers = [np.argmax(S[idx], axis=0) + 1 for _, idx in levels_.items()]
     hiers = np.vstack(hiers)
-    paths = np.unique(hiers, axis=1).shape[1]
+    paths = np.unique(hiers, axis=1).shape[1] 
     nodes = levels_.popitem()[1].size
     return paths == nodes
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 15
 def _get_child_nodes(S: np.ndarray, levels: Dict[str, np.ndarray]):
     childs = {}
     level_names = list(levels.keys())
@@ -68,7 +69,7 @@ def _get_child_nodes(S: np.ndarray, levels: Dict[str, np.ndarray]):
     for i_level, level in enumerate(level_names[:-1]):
         parent = levels[level]
         child = np.zeros_like(S)
-        idx_child = levels[level_names[i_level+1]]
+        idx_child = levels[level_names[i_level+1]] 
         child[idx_child] = S[idx_child]
         nodes_level = {}
         for idx_parent_node in parent:
@@ -77,9 +78,9 @@ def _get_child_nodes(S: np.ndarray, levels: Dict[str, np.ndarray]):
             idx_node, = np.where(idx_node.sum(axis=1) > 0)
             nodes_level[idx_parent_node] = [idx for idx in idx_child if idx in idx_node]
         nodes[level] = nodes_level
-    return nodes
+    return nodes        
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 16
 def _reconcile_fcst_proportions(S: np.ndarray, y_hat: np.ndarray,
                                 levels: Dict[str, np.ndarray],
                                 nodes: Dict[str, Dict[int, np.ndarray]],
@@ -96,24 +97,24 @@ def _reconcile_fcst_proportions(S: np.ndarray, y_hat: np.ndarray,
                 reconciled[idx_child] = y_hat[idx_child] * fcst_parent / childs_sum
     return reconciled
 
-# Internal Cell
-def top_down(S: np.ndarray,
+# %% ../nbs/methods.ipynb 17
+def top_down(S: np.ndarray, 
              y_hat: np.ndarray,
              y_insample: np.ndarray,
              levels: Dict[str, np.ndarray],
              method: str):
     if not is_strictly_hierarchical(S, levels):
         raise ValueError('Top down reconciliation requires strictly hierarchical structures.')
-
+    
     n_hiers, n_bottom = S.shape
     idx_top = int(S.sum(axis=1).argmax())
     levels_ = dict(sorted(levels.items(), key=lambda x: len(x[1])))
     idx_bottom = levels_[list(levels_)[-1]]
-
+    
     if method == 'forecast_proportions':
         nodes = _get_child_nodes(S=S, levels=levels_)
-        reconciled = [_reconcile_fcst_proportions(S=S, y_hat=y_hat_[:, None],
-                                                  levels=levels_,
+        reconciled = [_reconcile_fcst_proportions(S=S, y_hat=y_hat_[:, None], 
+                                                  levels=levels_, 
                                                   nodes=nodes,
                                                   idx_top=idx_top) \
                       for y_hat_ in y_hat.T]
@@ -133,31 +134,31 @@ def top_down(S: np.ndarray,
     W = np.eye(n_hiers, dtype=np.float32)
     return _reconcile(S, P, W, y_hat)
 
-# Cell
+# %% ../nbs/methods.ipynb 18
 class TopDown:
-
+    
     def __init__(
-            self,
+            self, 
             method: str # One of `forecast_proportions`, `average_proportions` and `proportion_averages`
         ):
         self.method = method
-
+    
     def reconcile(
-            self,
+            self, 
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
             y_hat: np.ndarray, # Forecast values of size (`base`, `horizon`)
             y_insample: np.ndarray, # Insample values of size (`base`, `insample_size`)
             levels: Dict[str, np.ndarray] # Each key is a level and each value its `S` indices
         ):
-        return top_down(S=S, y_hat=y_hat,
-                        y_insample=y_insample,
+        return top_down(S=S, y_hat=y_hat, 
+                        y_insample=y_insample, 
                         levels=levels,
                         method=self.method)
-
+    
     __call__ = reconcile
 
-# Internal Cell
-def middle_out(S: np.ndarray,
+# %% ../nbs/methods.ipynb 24
+def middle_out(S: np.ndarray, 
                y_hat: np.ndarray,
                y_insample: np.ndarray,
                levels: Dict[str, np.ndarray],
@@ -178,11 +179,11 @@ def middle_out(S: np.ndarray,
             break
     idxs_bu = np.hstack(idxs_bu)
     #bottom up forecasts
-    bu = bottom_up(S=np.unique(S[idxs_bu], axis=1),
-                   y_hat=y_hat[idxs_bu],
+    bu = bottom_up(S=np.unique(S[idxs_bu], axis=1), 
+                   y_hat=y_hat[idxs_bu], 
                    idx_bottom=np.arange(len(idxs_bu))[-len(cut_nodes):])
     reconciled[idxs_bu] = bu
-
+    
     #top down
     child_nodes = _get_child_nodes(S, levels_)
     # parents contains each node in the middle out level
@@ -202,7 +203,7 @@ def middle_out(S: np.ndarray,
                 if any(idx_parent in val for val in idxs_parents):
                     complete_idxs_child.append(idxs_child)
             parents[idx_middle_out][lv_child] = np.hstack(complete_idxs_child)
-
+ 
     for node, levels_node in parents.items():
         idxs_node = np.hstack(list(levels_node.values()))
         S_node = S[idxs_node]
@@ -213,47 +214,47 @@ def middle_out(S: np.ndarray,
             idxs_len = len(idxs_level)
             levels_node_[lv_name] = np.arange(counter, idxs_len + counter)
             counter += idxs_len
-        td = top_down(S_node,
-                      y_hat[idxs_node],
-                      y_insample[idxs_node],
-                      levels_node_,
+        td = top_down(S_node, 
+                      y_hat[idxs_node], 
+                      y_insample[idxs_node], 
+                      levels_node_, 
                       method=top_down_method)
         reconciled[idxs_node] = td
     return reconciled
+        
 
-
-# Cell
+# %% ../nbs/methods.ipynb 25
 class MiddleOut:
-
+    
     def __init__(
-            self,
-            level: str, # Middle level
+            self, 
+            level: str, # Middle level 
             top_down_method: str # One of `forecast_proportions`, `average_proportions` and `proportion_averages`
         ):
         self.level = level
-        self.top_down_method = top_down_method
-
+        self.top_down_method = top_down_method 
+    
     def reconcile(
-            self,
+            self, 
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
             y_hat: np.ndarray, # Forecast values of size (`base`, `horizon`)
             y_insample: np.ndarray, # Insample values of size (`base`, `insample_size`)
             levels: Dict[str, np.ndarray] # Each key is a level and each value its `S` indices
         ):
-        return middle_out(S=S, y_hat=y_hat,
-                          y_insample=y_insample,
+        return middle_out(S=S, y_hat=y_hat, 
+                          y_insample=y_insample, 
                           levels=levels,
                           level=self.level,
                           top_down_method=self.top_down_method)
-
+    
     __call__ = reconcile
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 31
 def crossprod(x):
     return x.T @ x
 
-# Internal Cell
-def min_trace(S: np.ndarray,
+# %% ../nbs/methods.ipynb 32
+def min_trace(S: np.ndarray, 
               y_hat: np.ndarray,
               y_insample: np.ndarray,
               y_hat_insample: np.ndarray,
@@ -291,64 +292,64 @@ def min_trace(S: np.ndarray,
             W = lmd * tar + (1 - lmd) * covm
     else:
         raise ValueError(f'Unkown reconciliation method {method}')
-
+    
     eigenvalues, _ = np.linalg.eig(W)
     if any(eigenvalues < 1e-8):
         raise Exception(f'min_trace ({method}) needs covariance matrix to be positive definite.')
-
+    
     R = S.T @ np.linalg.pinv(W)
     P = np.linalg.pinv(R @ S) @ R
-
+    
     return _reconcile(S, P, W, y_hat)
 
-# Cell
+# %% ../nbs/methods.ipynb 33
 class MinTrace:
-
+    
     def __init__(
-            self,
+            self, 
             method: str # One of `ols`, `wls_struct`, `wls_var`, `mint_shrink`, `mint_co`
         ):
         self.method = method
-
+        
     def reconcile(
-            self,
+            self, 
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
             y_hat: np.ndarray, # Forecast values of size (`base`, `horizon`)
             y_insample: np.ndarray, # Insample values of size (`base`, `insample_size`)
             y_hat_insample: np.ndarray # Insample forecasts of size (`base`, `insample_size`)
         ):
-        return min_trace(S=S, y_hat=y_hat,
+        return min_trace(S=S, y_hat=y_hat, 
                          y_insample=y_insample,
                          y_hat_insample=y_hat_insample,
                          method=self.method)
-
+    
     __call__ = reconcile
 
-# Internal Cell
-def optimal_combination(S: np.ndarray,
+# %% ../nbs/methods.ipynb 39
+def optimal_combination(S: np.ndarray, 
                         y_hat: np.ndarray,
                         method: str,
                         y_insample: np.ndarray = None,
                         y_hat_insample: np.ndarray = None):
-
-    return min_trace(S=S, y_hat=y_hat,
+    
+    return min_trace(S=S, y_hat=y_hat, 
                          y_insample=y_insample,
                          y_hat_insample=y_hat_insample,
                          method=method)
 
-# Cell
+# %% ../nbs/methods.ipynb 40
 class OptimalCombination:
-
+    
     def __init__(
-            self,
+            self, 
             method: str # Allowed Optimal Combination Methods: 'ols', 'wls_struct'
         ):
         comb_methods = ['ols', 'wls_struct']
         if method not in comb_methods:
             raise ValueError(f"Optimal Combination class does not support method: \"{method}\"")
-
+        
         self.method = method
-
+    
     def reconcile(
             self,
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
@@ -356,17 +357,17 @@ def reconcile(
             y_insample: np.ndarray = None, # Insample values of size (`base`, `insample_size`)
             y_hat_insample: np.ndarray = None # Insample forecasts of size (`base`, `insample_size`)
         ):
-        return optimal_combination(S=S,
-                                   y_hat=y_hat,
-                                   y_insample=y_insample,
-                                   y_hat_insample=y_hat_insample,
+        return optimal_combination(S=S, 
+                                   y_hat=y_hat, 
+                                   y_insample=y_insample, 
+                                   y_hat_insample=y_hat_insample, 
                                    method=self.method)
-
+    
     __call__ = reconcile
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 46
 @njit
-def lasso(X: np.ndarray, y: np.ndarray,
+def lasso(X: np.ndarray, y: np.ndarray, 
           lambda_reg: float, max_iters: int = 1_000,
           tol: float = 1e-4):
     # lasso cyclic coordinate descent
@@ -375,10 +376,10 @@ def lasso(X: np.ndarray, y: np.ndarray,
     beta = np.zeros(feats, dtype=np.float32)
     beta_changes = np.zeros(feats, dtype=np.float32)
     residuals = y.copy()
-
+    
     for it in range(max_iters):
         for i, betai in enumerate(beta):
-            # is feature is close to zero, we
+            # is feature is close to zero, we 
             # continue to the next.
             # in this case is optimal betai= 0
             if abs(norms[i]) < 1e-8:
@@ -396,7 +397,7 @@ def lasso(X: np.ndarray, y: np.ndarray,
     #print(it)
     return beta
 
-# Internal Cell
+# %% ../nbs/methods.ipynb 47
 def erm(S: np.ndarray,
         y_hat: np.ndarray,
         y_insample: np.ndarray,
@@ -410,7 +411,7 @@ def erm(S: np.ndarray,
     nan_idx = np.isnan(y_hat_insample).any(axis=0)
     y_insample = y_insample[:, ~nan_idx]
     y_hat_insample = y_hat_insample[:, ~nan_idx]
-    #only using h validation steps to avoid
+    #only using h validation steps to avoid 
     #computational burden
     #print(y_hat.shape)
     h = min(y_hat.shape[1], y_hat_insample.shape[1])
@@ -435,34 +436,34 @@ def erm(S: np.ndarray,
         P = P.reshape(-1, n_bottom, order='F').T
     else:
         raise ValueError(f'Unkown reconciliation method {method}')
-
+        
     W = np.eye(n_hiers, dtype=np.float32)
-
+    
     return _reconcile(S, P, W, y_hat)
 
-# Cell
+# %% ../nbs/methods.ipynb 48
 class ERM:
-
+    
     def __init__(
-            self,
+            self, 
             method: str, # one of `closed`, `reg` and `reg_bu`
             lambda_reg: float = 1e-2 # l1 regularizer for `reg` and `reg_bu`
         ):
         self.method = method
         self.lambda_reg = lambda_reg
-
+        
     def reconcile(
-            self,
+            self, 
             S: np.ndarray, # Summing matrix of size (`base`, `bottom`)
             y_hat: np.ndarray, # Forecast values of size (`base`, `horizon`)
             y_insample: np.ndarray, # Insample values of size (`base`, `insample_size`)
             y_hat_insample: np.ndarray, # Insample forecasts of size (`base`, `insample_size`)
             idx_bottom: np.ndarray # Indices corresponding to the bottom level of `S`, size (`bottom`)
         ):
-        return erm(S=S, y_hat=y_hat,
+        return erm(S=S, y_hat=y_hat, 
                    y_insample=y_insample,
                    y_hat_insample=y_hat_insample,
                    idx_bottom=idx_bottom,
                    method=self.method, lambda_reg=self.lambda_reg)
-
-    __call__ = reconcile
\ No newline at end of file
+    
+    __call__ = reconcile
diff --git a/hierarchicalforecast/utils.py b/hierarchicalforecast/utils.py
index b6a1d7f4..1a67512a 100644
--- a/hierarchicalforecast/utils.py
+++ b/hierarchicalforecast/utils.py
@@ -1,8 +1,9 @@
-# AUTOGENERATED! DO NOT EDIT! File to edit: nbs/utils.ipynb (unless otherwise specified).
+# AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/utils.ipynb.
 
+# %% auto 0
 __all__ = ['aggregate']
 
-# Cell
+# %% ../nbs/utils.ipynb 2
 from itertools import chain
 from typing import Callable, List
 
@@ -10,7 +11,7 @@
 import pandas as pd
 from sklearn.preprocessing import OneHotEncoder
 
-# Internal Cell
+# %% ../nbs/utils.ipynb 4
 def _to_summing_matrix(S_df: pd.DataFrame):
     """Transforms the DataFrame `df` of hierarchies to a summing matrix S."""
     categories = [S_df[col].unique() for col in S_df.columns]
@@ -23,7 +24,7 @@ def _to_summing_matrix(S_df: pd.DataFrame):
     tags = dict(zip(S_df.columns, categories))
     return S, tags
 
-# Cell
+# %% ../nbs/utils.ipynb 5
 def aggregate(
         df: pd.DataFrame, # DataFrame with columns `['ds', 'y']` and columns to aggregate
         spec: List[List[str]], # List of levels. Each element of the list contains a list of columns of `df` to aggregate.
@@ -46,10 +47,10 @@ def aggregate(
     S_df = S_df.fillna('agg')
     hiers_cols = []
     for hier in spec:
-        hier_col = '/'.join(hier)
+        hier_col = '/'.join(hier) 
         S_df[hier_col] = S_df[hier].agg('/'.join, axis=1)
         hiers_cols.append(hier_col)
     y_df = df_hiers[['unique_id', 'ds', 'y']].set_index('unique_id')
     #S definition
     S, tags = _to_summing_matrix(S_df.loc[bottom_hier, hiers_cols])
-    return y_df, S, tags
\ No newline at end of file
+    return y_df, S, tags
diff --git a/nbs/.gitignore b/nbs/.gitignore
new file mode 100644
index 00000000..075b2542
--- /dev/null
+++ b/nbs/.gitignore
@@ -0,0 +1,1 @@
+/.quarto/
diff --git a/nbs/_quarto.yml b/nbs/_quarto.yml
new file mode 100644
index 00000000..b6e0bdae
--- /dev/null
+++ b/nbs/_quarto.yml
@@ -0,0 +1,40 @@
+ipynb-filters: [nbdev_filter]
+
+project:
+  type: website
+  output-dir: _docs
+  preview:
+    port: 3000
+    browser: false
+
+format:
+  html:
+    theme: cosmo
+    css: styles.css
+    toc: true
+    toc-depth: 4
+
+website:
+  title: "hierarchicalforecast"
+  site-url: "https://Nixtla.github.io/hierarchicalforecast/"
+  description: "Hierarchical Methods Time series forecasting"
+  execute: 
+    enabled: false
+  twitter-card: true
+  open-graph: true
+  reader-mode: true
+  repo-branch: main
+  repo-url: "https://github.com/Nixtla/hierarchicalforecast/tree/main/"
+  repo-actions: [issue]
+  navbar:
+    background: primary
+    search: true
+    right:
+      - icon: github
+        href: "https://github.com/Nixtla/hierarchicalforecast/tree/main/"
+  sidebar:
+    style: "floating"
+
+metadata-files: 
+  - sidebar.yml
+  - custom.yml
diff --git a/nbs/core.ipynb b/nbs/core.ipynb
index 96215b40..4dfcb4f8 100644
--- a/nbs/core.ipynb
+++ b/nbs/core.ipynb
@@ -6,7 +6,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# default_exp core"
+    "#| default_exp core"
    ]
   },
   {
@@ -24,7 +24,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "from functools import partial\n",
     "from inspect import signature\n",
     "from typing import Callable, Dict, List, Optional\n",
@@ -39,7 +39,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from fastcore.test import test_close, test_fail\n",
     "from nbdev.showdoc import add_docs, show_doc"
    ]
@@ -50,7 +50,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def _build_fn_name(fn) -> str:\n",
     "    fn_name = type(fn).__name__\n",
     "    func_params = fn.__dict__\n",
@@ -66,7 +66,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class HierarchicalReconciliation:\n",
     "    \n",
     "    def __init__(\n",
@@ -127,7 +127,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(HierarchicalReconciliation, \"Apply distinct reconciliation methods to a pandas dataframe.\",\n",
     "         reconcile=\"Reconcile using distinct approaches.\")"
    ]
@@ -156,7 +156,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from hierarchicalforecast.methods import (\n",
     "    BottomUp, TopDown, MiddleOut, MinTrace, ERM,\n",
     ")\n",
@@ -169,7 +169,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/tourism.csv')\n",
     "df = df.rename({'Trips': 'y', 'Quarter': 'ds'}, axis=1)\n",
     "df.insert(0, 'Country', 'Australia')\n",
@@ -201,7 +201,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "hier_grouped_df['y_model'] = hier_grouped_df['y']\n",
     "# we should be able to recover y using the methods\n",
     "hier_grouped_df_h = hier_grouped_df.groupby('unique_id').tail(12)\n",
@@ -236,7 +236,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "# top down should break\n",
     "# with non strictly hierarchical structures\n",
     "hrec = HierarchicalReconciliation([TopDown(method='average_proportions')])\n",
@@ -253,10 +253,10 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "# methods should work with\n",
     "# srtictly hierarchical structures\n",
-    "#hide\n",
+    "#| hide\n",
     "hier_strict_df['y_model'] = hier_strict_df['y']\n",
     "# we should be able to recover y using the methods\n",
     "hier_strict_df_h = hier_strict_df.groupby('unique_id').tail(12)\n",
@@ -329,7 +329,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "#test methods that dont use residuals\n",
     "#even if their signature includes\n",
     "#that argument\n",
@@ -345,7 +345,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "reconciled.loc[tags_grouped['Country/State']]"
    ]
   }
@@ -355,18 +355,6 @@
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
   }
  },
  "nbformat": 4,
diff --git a/nbs/custom.yml b/nbs/custom.yml
new file mode 100644
index 00000000..70588a29
--- /dev/null
+++ b/nbs/custom.yml
@@ -0,0 +1,21 @@
+website:
+  reader-mode: false
+  navbar:
+    collapse-below: lg
+    left:
+      - text: "Get Started"
+        href: examples/AustralianDomesticTourism.ipynb
+      - text: "Experiments"
+        href: https://github.com/Nixtla/hierarchicalforecast/tree/main/experiments
+      - text: "Help"
+        menu:
+          - text: "Report an Issue"
+            icon: bug
+            href: https://github.com/nixtla/hierarchicalforecast/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/evaluation.ipynb b/nbs/evaluation.ipynb
index 779f18d5..f7272911 100644
--- a/nbs/evaluation.ipynb
+++ b/nbs/evaluation.ipynb
@@ -6,7 +6,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# default_exp evaluation"
+    "#| default_exp evaluation"
    ]
   },
   {
@@ -24,7 +24,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "from inspect import signature\n",
     "from typing import Callable, Dict, List, Optional\n",
     "\n",
@@ -38,7 +38,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from fastcore.test import test_close, test_fail\n",
     "from nbdev.showdoc import add_docs, show_doc"
    ]
@@ -49,7 +49,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class HierarchicalEvaluation:\n",
     "    \n",
     "    def __init__(\n",
@@ -109,7 +109,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(HierarchicalEvaluation, \"Evaluate reconciliation methods.\",\n",
     "         evaluate=\"Evaluate reconciliation methods for distinct levels.\")"
    ]
@@ -174,7 +174,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from hierarchicalforecast.core import HierarchicalReconciliation\n",
     "from hierarchicalforecast.methods import BottomUp, MinTrace, ERM\n",
     "from hierarchicalforecast.utils import aggregate\n",
@@ -230,7 +230,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "def mse(y, y_hat):\n",
     "    return np.mean((y-y_hat)**2)\n",
     "def rmse(y, y_hat):\n",
@@ -248,7 +248,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "def mase(y, y_hat, y_insample, seasonality=4):\n",
     "    errors = np.mean(np.abs(y - y_hat), axis=1)\n",
     "    scale = np.mean(np.abs(y_insample[:, seasonality:] - y_insample[:, :-seasonality]), axis=1)\n",
@@ -267,18 +267,6 @@
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
   }
  },
  "nbformat": 4,
diff --git a/nbs/examples/.nodoc b/nbs/examples/.nodoc
new file mode 100644
index 00000000..e69de29b
diff --git a/docs/AustralianDomesticTourism-results-fable.png b/nbs/examples/AustralianDomesticTourism-results-fable.png
similarity index 100%
rename from docs/AustralianDomesticTourism-results-fable.png
rename to nbs/examples/AustralianDomesticTourism-results-fable.png
diff --git a/examples/AustralianDomesticTourism.ipynb b/nbs/examples/AustralianDomesticTourism.ipynb
similarity index 92%
rename from examples/AustralianDomesticTourism.ipynb
rename to nbs/examples/AustralianDomesticTourism.ipynb
index 413fc9be..a1cf83a8 100644
--- a/examples/AustralianDomesticTourism.ipynb
+++ b/nbs/examples/AustralianDomesticTourism.ipynb
@@ -48,7 +48,7 @@
     "from hierarchicalforecast.utils import aggregate\n",
     "# compute base forecast no coherent\n",
     "from statsforecast.core import StatsForecast\n",
-    "from statsforecast.models import ets"
+    "from statsforecast.models import ETS"
    ]
   },
   {
@@ -519,7 +519,7 @@
    "outputs": [],
    "source": [
     "fcst = StatsForecast(df=Y_df_train, \n",
-    "                     models=[(ets, 4, 'ZZA')], \n",
+    "                     models=[ETS(season_length=4, model='ZZA')], \n",
     "                     freq='QS', n_jobs=-1)\n",
     "Y_hat_df = fcst.forecast(h=8, fitted=True)\n",
     "Y_fitted_df = fcst.forecast_fitted_values()"
@@ -583,10 +583,10 @@
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>ds</th>\n",
-       "      <th>ets_season_length-4_model-ZZA</th>\n",
-       "      <th>ets_season_length-4_model-ZZA/BottomUp</th>\n",
-       "      <th>ets_season_length-4_model-ZZA/MinTrace_method-mint_shrink</th>\n",
-       "      <th>ets_season_length-4_model-ZZA/MinTrace_method-ols</th>\n",
+       "      <th>ETS</th>\n",
+       "      <th>ETS/BottomUp</th>\n",
+       "      <th>ETS/MinTrace_method-mint_shrink</th>\n",
+       "      <th>ETS/MinTrace_method-ols</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>unique_id</th>\n",
@@ -643,37 +643,21 @@
        "</div>"
       ],
       "text/plain": [
-       "                  ds  ets_season_length-4_model-ZZA  \\\n",
-       "unique_id                                             \n",
-       "Australia 2016-01-01                   25990.068359   \n",
-       "Australia 2016-04-01                   24458.490234   \n",
-       "Australia 2016-07-01                   23974.056641   \n",
-       "Australia 2016-10-01                   24563.455078   \n",
-       "Australia 2017-01-01                   25990.068359   \n",
+       "                  ds           ETS  ETS/BottomUp  \\\n",
+       "unique_id                                          \n",
+       "Australia 2016-01-01  25990.068359  24379.683594   \n",
+       "Australia 2016-04-01  24458.490234  22902.664062   \n",
+       "Australia 2016-07-01  23974.056641  22412.984375   \n",
+       "Australia 2016-10-01  24563.455078  23127.638672   \n",
+       "Australia 2017-01-01  25990.068359  24516.175781   \n",
        "\n",
-       "           ets_season_length-4_model-ZZA/BottomUp  \\\n",
-       "unique_id                                           \n",
-       "Australia                            24379.683594   \n",
-       "Australia                            22902.664062   \n",
-       "Australia                            22412.984375   \n",
-       "Australia                            23127.638672   \n",
-       "Australia                            24516.175781   \n",
-       "\n",
-       "           ets_season_length-4_model-ZZA/MinTrace_method-mint_shrink  \\\n",
-       "unique_id                                                              \n",
-       "Australia                                       25438.888305           \n",
-       "Australia                                       23925.188497           \n",
-       "Australia                                       23440.310292           \n",
-       "Australia                                       24101.001789           \n",
-       "Australia                                       25556.667568           \n",
-       "\n",
-       "           ets_season_length-4_model-ZZA/MinTrace_method-ols  \n",
-       "unique_id                                                     \n",
-       "Australia                                       25894.418893  \n",
-       "Australia                                       24357.230480  \n",
-       "Australia                                       23865.929521  \n",
-       "Australia                                       24470.783968  \n",
-       "Australia                                       25901.382401  "
+       "           ETS/MinTrace_method-mint_shrink  ETS/MinTrace_method-ols  \n",
+       "unique_id                                                            \n",
+       "Australia                     25438.888305             25894.418893  \n",
+       "Australia                     23925.188497             24357.230480  \n",
+       "Australia                     23440.310292             23865.929521  \n",
+       "Australia                     24101.001789             24470.783968  \n",
+       "Australia                     25556.667568             25901.382401  "
       ]
      },
      "execution_count": null,
@@ -703,7 +687,7 @@
      "name": "stderr",
      "output_type": "stream",
      "text": [
-      "/var/folders/7x/1l3vkh3x4_q3s4r36b60s8f00000gn/T/ipykernel_42856/1783873245.py:22: PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.\n",
+      "/var/folders/7x/1l3vkh3x4_q3s4r36b60s8f00000gn/T/ipykernel_18603/1783873245.py:22: PerformanceWarning: dropping on a non-lexsorted multi-index without a level parameter may impact performance.\n",
       "  evaluation = evaluation.drop('Overall')\n"
      ]
     }
diff --git a/docs/AustralianPrisonPopulation-results-fable.png b/nbs/examples/AustralianPrisonPopulation-results-fable.png
similarity index 100%
rename from docs/AustralianPrisonPopulation-results-fable.png
rename to nbs/examples/AustralianPrisonPopulation-results-fable.png
diff --git a/examples/AustralianPrisonPopulation.ipynb b/nbs/examples/AustralianPrisonPopulation.ipynb
similarity index 93%
rename from examples/AustralianPrisonPopulation.ipynb
rename to nbs/examples/AustralianPrisonPopulation.ipynb
index c1dcdf0d..1fdf2e99 100644
--- a/examples/AustralianPrisonPopulation.ipynb
+++ b/nbs/examples/AustralianPrisonPopulation.ipynb
@@ -48,7 +48,7 @@
     "from hierarchicalforecast.utils import aggregate\n",
     "# compute base forecast no coherent\n",
     "from statsforecast.core import StatsForecast\n",
-    "from statsforecast.models import ets"
+    "from statsforecast.models import ETS"
    ]
   },
   {
@@ -498,7 +498,7 @@
    "outputs": [],
    "source": [
     "fcst = StatsForecast(df=Y_df_train, \n",
-    "                     models=[(ets, 4, 'ZMZ')], \n",
+    "                     models=[ETS(season_length=4, model='ZMZ')], \n",
     "                     freq='QS', n_jobs=-1)\n",
     "Y_hat_df = fcst.forecast(h=8, fitted=True)\n",
     "Y_fitted_df = fcst.forecast_fitted_values()"
@@ -561,9 +561,9 @@
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
        "      <th>ds</th>\n",
-       "      <th>ets_season_length-4_model-ZMZ</th>\n",
-       "      <th>ets_season_length-4_model-ZMZ/BottomUp</th>\n",
-       "      <th>ets_season_length-4_model-ZMZ/MinTrace_method-mint_shrink</th>\n",
+       "      <th>ETS</th>\n",
+       "      <th>ETS/BottomUp</th>\n",
+       "      <th>ETS/MinTrace_method-mint_shrink</th>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>unique_id</th>\n",
@@ -614,29 +614,13 @@
        "</div>"
       ],
       "text/plain": [
-       "                  ds  ets_season_length-4_model-ZMZ  \\\n",
-       "unique_id                                             \n",
-       "Australia 2015-01-01                      34.799496   \n",
-       "Australia 2015-04-01                      35.192638   \n",
-       "Australia 2015-07-01                      35.188217   \n",
-       "Australia 2015-10-01                      35.888626   \n",
-       "Australia 2016-01-01                      36.045437   \n",
-       "\n",
-       "           ets_season_length-4_model-ZMZ/BottomUp  \\\n",
-       "unique_id                                           \n",
-       "Australia                               34.933872   \n",
-       "Australia                               35.473522   \n",
-       "Australia                               35.687302   \n",
-       "Australia                               36.010601   \n",
-       "Australia                               36.400002   \n",
-       "\n",
-       "           ets_season_length-4_model-ZMZ/MinTrace_method-mint_shrink  \n",
-       "unique_id                                                             \n",
-       "Australia                                          34.963669          \n",
-       "Australia                                          35.521146          \n",
-       "Australia                                          35.630352          \n",
-       "Australia                                          36.147547          \n",
-       "Australia                                          36.492036          "
+       "                  ds        ETS  ETS/BottomUp  ETS/MinTrace_method-mint_shrink\n",
+       "unique_id                                                                     \n",
+       "Australia 2015-01-01  34.799496     34.933872                        34.963669\n",
+       "Australia 2015-04-01  35.192638     35.473522                        35.521146\n",
+       "Australia 2015-07-01  35.188217     35.687302                        35.630352\n",
+       "Australia 2015-10-01  35.888626     36.010601                        36.147547\n",
+       "Australia 2016-01-01  36.045437     36.400002                        36.492036"
       ]
      },
      "execution_count": null,
diff --git a/examples/TourismSmall.ipynb b/nbs/examples/TourismSmall.ipynb
similarity index 89%
rename from examples/TourismSmall.ipynb
rename to nbs/examples/TourismSmall.ipynb
index d23f6cef..25356793 100644
--- a/examples/TourismSmall.ipynb
+++ b/nbs/examples/TourismSmall.ipynb
@@ -35,7 +35,7 @@
    "source": [
     "%%capture\n",
     "!pip install hierarchicalforecast\n",
-    "!pip install statsforecast datasetsforecast\n",
+    "!pip install -U statsforecast datasetsforecast\n",
     "!pip install -U statsmodels numba"
    ]
   },
@@ -57,7 +57,7 @@
     "from hierarchicalforecast.methods import BottomUp, TopDown, MiddleOut\n",
     "# compute base forecast no coherent\n",
     "from statsforecast.core import StatsForecast\n",
-    "from statsforecast.models import auto_arima, naive"
+    "from statsforecast.models import AutoARIMA, Naive"
    ]
   },
   {
@@ -355,20 +355,15 @@
    "execution_count": null,
    "id": "f99e7b7b-f4b8-4f2f-a1a7-c8be98a1e280",
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "INFO:statsforecast.core:Computing forecasts\n",
-      "INFO:statsforecast.core:Computed forecasts for auto_arima_season_length-12.\n",
-      "INFO:statsforecast.core:Computed forecasts for naive.\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "%%capture\n",
-    "fcst = StatsForecast(df=Y_df_train, models=[(auto_arima,12), naive], freq='M', n_jobs=-1)\n",
+    "fcst = StatsForecast(\n",
+    "    df=Y_df_train, \n",
+    "    models=[AutoARIMA(season_length=12), Naive()], \n",
+    "    freq='M', \n",
+    "    n_jobs=-1\n",
+    ")\n",
     "Y_hat_df = fcst.forecast(h=12)"
    ]
   },
@@ -451,7 +446,7 @@
        "  </thead>\n",
        "  <tbody>\n",
        "    <tr>\n",
-       "      <th>auto_arima_season_length-12</th>\n",
+       "      <th>AutoARIMA</th>\n",
        "      <td>0.958433</td>\n",
        "      <td>1.05191</td>\n",
        "      <td>0.903941</td>\n",
@@ -459,7 +454,7 @@
        "      <td>0.84693</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>auto_arima_season_length-12/BottomUp</th>\n",
+       "      <th>AutoARIMA/BottomUp</th>\n",
        "      <td>0.908254</td>\n",
        "      <td>0.978696</td>\n",
        "      <td>0.861644</td>\n",
@@ -467,7 +462,7 @@
        "      <td>0.84693</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>auto_arima_season_length-12/TopDown_method-forecast_proportions</th>\n",
+       "      <th>AutoARIMA/TopDown_method-forecast_proportions</th>\n",
        "      <td>0.973065</td>\n",
        "      <td>1.05191</td>\n",
        "      <td>0.887653</td>\n",
@@ -475,7 +470,7 @@
        "      <td>0.949697</td>\n",
        "    </tr>\n",
        "    <tr>\n",
-       "      <th>auto_arima_season_length-12/MiddleOut_level-Country/Purpose/State_top_down_method-forecast_proportions</th>\n",
+       "      <th>AutoARIMA/MiddleOut_level-Country/Purpose/State_top_down_method-forecast_proportions</th>\n",
        "      <td>0.896154</td>\n",
        "      <td>0.950772</td>\n",
        "      <td>0.830192</td>\n",
@@ -489,31 +484,31 @@
       "text/plain": [
        "level                                                 Overall    Country  \\\n",
        "metric                                             mse-scaled mse-scaled   \n",
-       "auto_arima_season_length-12                          0.958433    1.05191   \n",
-       "auto_arima_season_length-12/BottomUp                 0.908254   0.978696   \n",
-       "auto_arima_season_length-12/TopDown_method-fore...   0.973065    1.05191   \n",
-       "auto_arima_season_length-12/MiddleOut_level-Cou...   0.896154   0.950772   \n",
+       "AutoARIMA                                            0.958433    1.05191   \n",
+       "AutoARIMA/BottomUp                                   0.908254   0.978696   \n",
+       "AutoARIMA/TopDown_method-forecast_proportions        0.973065    1.05191   \n",
+       "AutoARIMA/MiddleOut_level-Country/Purpose/State...   0.896154   0.950772   \n",
        "\n",
        "level                                              Country/Purpose  \\\n",
        "metric                                                  mse-scaled   \n",
-       "auto_arima_season_length-12                               0.903941   \n",
-       "auto_arima_season_length-12/BottomUp                      0.861644   \n",
-       "auto_arima_season_length-12/TopDown_method-fore...        0.887653   \n",
-       "auto_arima_season_length-12/MiddleOut_level-Cou...        0.830192   \n",
+       "AutoARIMA                                                 0.903941   \n",
+       "AutoARIMA/BottomUp                                        0.861644   \n",
+       "AutoARIMA/TopDown_method-forecast_proportions             0.887653   \n",
+       "AutoARIMA/MiddleOut_level-Country/Purpose/State...        0.830192   \n",
        "\n",
        "level                                              Country/Purpose/State  \\\n",
        "metric                                                        mse-scaled   \n",
-       "auto_arima_season_length-12                                     0.909366   \n",
-       "auto_arima_season_length-12/BottomUp                            0.867018   \n",
-       "auto_arima_season_length-12/TopDown_method-fore...              0.973846   \n",
-       "auto_arima_season_length-12/MiddleOut_level-Cou...              0.909366   \n",
+       "AutoARIMA                                                       0.909366   \n",
+       "AutoARIMA/BottomUp                                              0.867018   \n",
+       "AutoARIMA/TopDown_method-forecast_proportions                   0.973846   \n",
+       "AutoARIMA/MiddleOut_level-Country/Purpose/State...              0.909366   \n",
        "\n",
        "level                                              Country/Purpose/State/CityNonCity  \n",
        "metric                                                                    mse-scaled  \n",
-       "auto_arima_season_length-12                                                  0.84693  \n",
-       "auto_arima_season_length-12/BottomUp                                         0.84693  \n",
-       "auto_arima_season_length-12/TopDown_method-fore...                          0.949697  \n",
-       "auto_arima_season_length-12/MiddleOut_level-Cou...                          0.885367  "
+       "AutoARIMA                                                                    0.84693  \n",
+       "AutoARIMA/BottomUp                                                           0.84693  \n",
+       "AutoARIMA/TopDown_method-forecast_proportions                               0.949697  \n",
+       "AutoARIMA/MiddleOut_level-Country/Purpose/State...                          0.885367  "
       ]
      },
      "execution_count": null,
@@ -528,9 +523,9 @@
     "evaluator = HierarchicalEvaluation(evaluators=[mse])\n",
     "evaluation = evaluator.evaluate(\n",
     "        Y_h=Y_rec_df, Y_test=Y_df_test, \n",
-    "        tags=tags, benchmark='naive'\n",
+    "        tags=tags, benchmark='Naive'\n",
     ")\n",
-    "evaluation.filter(like='arima', axis=1).T"
+    "evaluation.filter(like='ARIMA', axis=1).T"
    ]
   }
  ],
diff --git a/nbs/index.ipynb b/nbs/index.ipynb
index 41af3b9c..89c6cbd6 100644
--- a/nbs/index.ipynb
+++ b/nbs/index.ipynb
@@ -108,7 +108,7 @@
     "from hierarchicalforecast.methods import BottomUp, TopDown, MiddleOut\n",
     "# compute base forecast no coherent\n",
     "from statsforecast.core import StatsForecast\n",
-    "from statsforecast.models import auto_arima, naive\n",
+    "from statsforecast.models import AutoARIMA, Naive\n",
     "\n",
     "# Load TourismSmall dataset\n",
     "Y_df, S, tags = HierarchicalData.load('./data', 'TourismSmall')\n",
@@ -121,7 +121,12 @@
     "Y_df_train = Y_df_train.set_index('unique_id')\n",
     "\n",
     "# Compute base auto-ARIMA predictions\n",
-    "fcst = StatsForecast(df=Y_df_train, models=[(auto_arima,12), naive], freq='M', n_jobs=-1)\n",
+    "fcst = StatsForecast(\n",
+    "    df=Y_df_train, \n",
+    "    models=[AutoARIMA(season_length=12), Naive()], \n",
+    "    freq='M', \n",
+    "    n_jobs=-1\n",
+    ")\n",
     "Y_hat_df = fcst.forecast(h=12)\n",
     "\n",
     "# Reconcile the base predictions\n",
@@ -148,7 +153,7 @@
     "\n",
     "evaluator = HierarchicalEvaluation(evaluators=[mse])\n",
     "evaluator.evaluate(Y_h=Y_rec_df, Y_test=Y_df_test, \n",
-    "                   tags=tags, benchmark='naive')\n",
+    "                   tags=tags, benchmark='Naive')\n",
     "```"
    ]
   },
@@ -185,18 +190,6 @@
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
   }
  },
  "nbformat": 4,
diff --git a/nbs/methods.ipynb b/nbs/methods.ipynb
index 9f28914a..a05313c7 100644
--- a/nbs/methods.ipynb
+++ b/nbs/methods.ipynb
@@ -6,7 +6,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# default_exp methods"
+    "#| default_exp methods"
    ]
   },
   {
@@ -23,7 +23,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "from collections import OrderedDict\n",
     "from copy import deepcopy\n",
     "from typing import Dict, List, Union\n",
@@ -39,7 +39,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from fastcore.test import ExceptionExpected, test_close, test_eq\n",
     "from nbdev.showdoc import add_docs, show_doc"
    ]
@@ -50,7 +50,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "def _reconcile(S: np.ndarray, P: np.ndarray, W: np.ndarray, \n",
     "               y_hat: np.ndarray, SP: np.ndarray = None):\n",
     "    if SP is None:\n",
@@ -64,7 +64,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def bottom_up(S: np.ndarray,\n",
     "              y_hat: np.ndarray,\n",
     "              idx_bottom: List[int]):\n",
@@ -82,7 +82,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class BottomUp:\n",
     "    \n",
     "    def reconcile(\n",
@@ -102,7 +102,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(BottomUp, \"Bottom up reconciliation method.\",\n",
     "         reconcile=\"Reconcile using `BottomUp` approach.\")"
    ]
@@ -143,7 +143,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "S = np.array([\n",
     "    [1., 1., 1., 1.],\n",
     "    [1., 1., 0., 0.],\n",
@@ -171,7 +171,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "cls_bottom_up = BottomUp()\n",
     "test_eq(\n",
     "    cls_bottom_up(S=S, y_hat=S @ y_hat_bottom, idx_bottom=idx_bottom),\n",
@@ -185,7 +185,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def is_strictly_hierarchical(S: np.ndarray, \n",
     "                             levels: Dict[str, np.ndarray]):\n",
     "    # main idea:\n",
@@ -210,7 +210,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "assert is_strictly_hierarchical(S, levels)\n",
     "S_non_hier = np.array([\n",
     "    [1., 1., 1., 1.], # total\n",
@@ -238,7 +238,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def _get_child_nodes(S: np.ndarray, levels: Dict[str, np.ndarray]):\n",
     "    childs = {}\n",
     "    level_names = list(levels.keys())\n",
@@ -264,7 +264,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def _reconcile_fcst_proportions(S: np.ndarray, y_hat: np.ndarray,\n",
     "                                levels: Dict[str, np.ndarray],\n",
     "                                nodes: Dict[str, Dict[int, np.ndarray]],\n",
@@ -288,7 +288,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def top_down(S: np.ndarray, \n",
     "             y_hat: np.ndarray,\n",
     "             y_insample: np.ndarray,\n",
@@ -332,7 +332,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class TopDown:\n",
     "    \n",
     "    def __init__(\n",
@@ -362,7 +362,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(TopDown, \"Top down reconciliation method.\",\n",
     "         reconcile=\"Reconcile using `TopDown` approach.\")"
    ]
@@ -403,7 +403,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "# we are able to recover forecasts \n",
     "# from top_down in this example\n",
     "# because the time series\n",
@@ -429,7 +429,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def middle_out(S: np.ndarray, \n",
     "               y_hat: np.ndarray,\n",
     "               y_insample: np.ndarray,\n",
@@ -502,7 +502,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class MiddleOut:\n",
     "    \n",
     "    def __init__(\n",
@@ -535,7 +535,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(MiddleOut, \"Middle out reconciliation method.\",\n",
     "         reconcile=\"Reconcile using `MiddleOut` approach.\")"
    ]
@@ -571,7 +571,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "# we are able to recover forecasts \n",
     "# from middle out in this example\n",
     "# because the time series\n",
@@ -597,7 +597,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def crossprod(x):\n",
     "    return x.T @ x"
    ]
@@ -608,7 +608,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def min_trace(S: np.ndarray, \n",
     "              y_hat: np.ndarray,\n",
     "              y_insample: np.ndarray,\n",
@@ -664,7 +664,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class MinTrace:\n",
     "    \n",
     "    def __init__(\n",
@@ -694,7 +694,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(MinTrace, \"Min trace reconciliation method.\",\n",
     "         reconcile=\"Reconcile using `MinTrace` approach.\")"
    ]
@@ -734,7 +734,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "for method in ['ols', 'wls_struct', 'wls_var', 'mint_shrink']:\n",
     "    cls_min_trace = MinTrace(method=method)\n",
     "    test_close(\n",
@@ -762,7 +762,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def optimal_combination(S: np.ndarray, \n",
     "                        y_hat: np.ndarray,\n",
     "                        method: str,\n",
@@ -781,7 +781,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class OptimalCombination:\n",
     "    \n",
     "    def __init__(\n",
@@ -816,7 +816,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(OptimalCombination, \"Optimal combination reconciliation method.\",\n",
     "         reconcile=\"Reconcile using optimal combination approach.\")"
    ]
@@ -858,7 +858,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "for method in ['ols', 'wls_struct']:\n",
     "    cls_optimal_combination = OptimalCombination(method=method)\n",
     "    test_close(\n",
@@ -876,7 +876,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "@njit\n",
     "def lasso(X: np.ndarray, y: np.ndarray, \n",
     "          lambda_reg: float, max_iters: int = 1_000,\n",
@@ -915,7 +915,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def erm(S: np.ndarray,\n",
     "        y_hat: np.ndarray,\n",
     "        y_insample: np.ndarray,\n",
@@ -966,7 +966,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "class ERM:\n",
     "    \n",
     "    def __init__(\n",
@@ -1000,7 +1000,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "add_docs(ERM, \"ERM reconciliation method.\",\n",
     "         reconcile=\"Reconcile using `ERM` approach.\")"
    ]
@@ -1051,7 +1051,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "for method in ['reg_bu']:\n",
     "    cls_erm = ERM(method=method, lambda_reg=None)\n",
     "    test_close(\n",
@@ -1072,18 +1072,6 @@
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
   }
  },
  "nbformat": 4,
diff --git a/nbs/styles.css b/nbs/styles.css
new file mode 100644
index 00000000..66ccc49e
--- /dev/null
+++ b/nbs/styles.css
@@ -0,0 +1,37 @@
+.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;
+}
+
+.cell-output > .sourceCode {
+  background: none;
+  margin-top: 0;
+}
+
+div.description {
+  padding-left: 2px;
+  padding-top: 5px;
+  font-style: italic;
+  font-size: 135%;
+  opacity: 70%;
+}
diff --git a/nbs/utils.ipynb b/nbs/utils.ipynb
index 865b261b..e7fc53f8 100644
--- a/nbs/utils.ipynb
+++ b/nbs/utils.ipynb
@@ -7,7 +7,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "# default_exp utils"
+    "#| default_exp utils"
    ]
   },
   {
@@ -25,7 +25,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "from itertools import chain\n",
     "from typing import Callable, List\n",
     "\n",
@@ -41,7 +41,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "from fastcore.test import test_eq\n",
     "from nbdev.showdoc import show_doc"
    ]
@@ -53,7 +53,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#exporti\n",
+    "#| exporti\n",
     "def _to_summing_matrix(S_df: pd.DataFrame):\n",
     "    \"\"\"Transforms the DataFrame `df` of hierarchies to a summing matrix S.\"\"\"\n",
     "    categories = [S_df[col].unique() for col in S_df.columns]\n",
@@ -74,7 +74,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#export\n",
+    "#| export\n",
     "def aggregate(\n",
     "        df: pd.DataFrame, # DataFrame with columns `['ds', 'y']` and columns to aggregate\n",
     "        spec: List[List[str]], # List of levels. Each element of the list contains a list of columns of `df` to aggregate.\n",
@@ -123,7 +123,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "#hide\n",
+    "#| hide\n",
     "df = pd.read_csv('https://raw.githubusercontent.com/Nixtla/transfer-learning-time-series/main/datasets/tourism.csv')\n",
     "df = df.rename({'Trips': 'y', 'Quarter': 'ds'}, axis=1)\n",
     "df.insert(0, 'Country', 'Australia')\n",
@@ -149,18 +149,6 @@
    "display_name": "Python 3 (ipykernel)",
    "language": "python",
    "name": "python3"
-  },
-  "language_info": {
-   "codemirror_mode": {
-    "name": "ipython",
-    "version": 3
-   },
-   "file_extension": ".py",
-   "mimetype": "text/x-python",
-   "name": "python",
-   "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython3",
-   "version": "3.10.5"
   }
  },
  "nbformat": 4,
diff --git a/settings.ini b/settings.ini
index eb155aca..b75d8749 100644
--- a/settings.ini
+++ b/settings.ini
@@ -38,7 +38,7 @@ requirements = numpy numba pandas scikit-learn statsmodels
 
 # Change to, e.g. "nbs", to put your notebooks in nbs dir instead of repo root
 nbs_path = nbs
-doc_path = docs
+doc_path = _docs
 
 # Whether to look for library notebooks recursively in the `nbs_path` dir
 recursive = False
diff --git a/setup.py b/setup.py
index 646711e5..09450925 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from pkg_resources import parse_version
 from configparser import ConfigParser
-import setuptools,re,sys
+import setuptools
 assert parse_version(setuptools.__version__)>=parse_version('36.2')
 
 # note: all settings are in settings.ini; edit there, not here
@@ -13,10 +13,6 @@
 for o in expected: assert o in cfg, "missing expected setting: {}".format(o)
 setup_cfg = {o:cfg[o] for o in cfg_keys}
 
-if len(sys.argv)>1 and sys.argv[1]=='version':
-    print(setup_cfg['version'])
-    exit()
-
 licenses = {
     'apache2': ('Apache Software License 2.0','OSI Approved :: Apache Software License'),
     'mit': ('MIT License', 'OSI Approved :: MIT License'),
@@ -26,22 +22,14 @@
 }
 statuses = [ '1 - Planning', '2 - Pre-Alpha', '3 - Alpha',
     '4 - Beta', '5 - Production/Stable', '6 - Mature', '7 - Inactive' ]
-py_versions = '2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 3.0 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10'.split()
-
-lic = licenses.get(cfg['license'].lower(), (cfg['license'], None))
-min_python = cfg['min_python']
+py_versions = '3.6 3.7 3.8 3.9 3.10'.split()
 
-requirements = ['pip', 'packaging']
-if cfg.get('requirements'): requirements += cfg.get('requirements','').split()
+requirements = cfg.get('requirements','').split()
 if cfg.get('pip_requirements'): requirements += cfg.get('pip_requirements','').split()
+min_python = cfg['min_python']
+lic = licenses.get(cfg['license'].lower(), (cfg['license'], None))
 dev_requirements = (cfg.get('dev_requirements') or '').split()
 
-long_description = open('README.md', encoding='utf8').read()
-# ![png](docs/images/output_13_0.png)
-for ext in ['png', 'svg']:
-    long_description = re.sub(r'!\['+ext+'\]\((.*)\)', '!['+ext+']('+'https://raw.githubusercontent.com/{}/{}'.format(cfg['user'],cfg['lib_name'])+'/'+cfg['branch']+'/\\1)', long_description)
-    long_description = re.sub(r'src=\"(.*)\.'+ext+'\"', 'src=\"https://raw.githubusercontent.com/{}/{}'.format(cfg['user'],cfg['lib_name'])+'/'+cfg['branch']+'/\\1.'+ext+'\"', long_description)
-
 setuptools.setup(
     name = 'hierarchicalforecast',
     license = lic[0],
@@ -55,10 +43,15 @@
     include_package_data = True,
     install_requires = requirements,
     extras_require={ 'dev': dev_requirements },
+    dependency_links = cfg.get('dep_links','').split(),
     python_requires  = '>=' + cfg['min_python'],
-    long_description = long_description,
+    long_description = open('README.md').read(),
     long_description_content_type = 'text/markdown',
     zip_safe = False,
-    entry_points = { 'console_scripts': cfg.get('console_scripts','').split() },
+    entry_points = {
+        'console_scripts': cfg.get('console_scripts','').split(),
+        'nbdev': [f'{cfg.get("lib_path")}={cfg.get("lib_path")}._modidx:d']
+    },
     **setup_cfg)
 
+


Test patch:
diff --git a/nbs/examples/.notest b/nbs/examples/.notest
new file mode 100644
index 00000000..e69de29b