Repository: sktime/sktime
Pull request #7338 (2024-10-25 20:58:49)

[MNT] [Dependabot](deps): Update pytest-randomly requirement from <3.16,>=3.15 to >=3.15,<3.17
Updates the requirements on [pytest-randomly](https://github.com/pytest-dev/pytest-randomly) to permit the latest version.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/pytest-dev/pytest-randomly/blob/main/CHANGELOG.rst">pytest-randomly's changelog</a>.</em></p>
<blockquote>
<h2>3.16.0 (2024-10-25)</h2>
<ul>
<li>
<p>Drop Python 3.8 support.</p>
</li>
<li>
<p>Support Python 3.13.</p>
</li>
</ul>
<h2>3.15.0 (2023-08-15)</h2>
<ul>
<li>Support Python 3.12.</li>
</ul>
<h2>3.14.0 (2023-08-15)</h2>
<ul>
<li>Reset the random state for <code>Model Bakery &lt;https://model-bakery.readthedocs.io/en/latest/&gt;</code>__.</li>
</ul>
<h2>3.13.0 (2023-07-10)</h2>
<ul>
<li>Drop Python 3.7 support.</li>
</ul>
<h2>3.12.0 (2022-05-11)</h2>
<ul>
<li>Support Python 3.11.</li>
</ul>
<h2>3.11.0 (2022-01-10)</h2>
<ul>
<li>Drop Python 3.6 support.</li>
</ul>
<h2>3.10.3 (2021-11-30)</h2>
<ul>
<li>
<p>Work on FIPS Python 3.9+, by declaring use of <code>hashlib.md5()</code> as not used for security.</p>
<p>Thanks to dantebben for the report in <code>Issue [#414](https://github.com/pytest-dev/pytest-randomly/issues/414) &lt;https://github.com/pytest-dev/pytest-randomly/issues/414&gt;</code>__.</p>
</li>
</ul>
<h2>3.10.2 (2021-11-10)</h2>
<ul>
<li>
<p>Fix crash when pytest’s cacheprovider is disabled.</p>
<p>Thanks to Mandeep Sandhu for the report in <code>Issue [#408](https://github.com/pytest-dev/pytest-randomly/issues/408) &lt;https://github.com/pytest-dev/pytest-randomly/issues/408&gt;</code>__.</p>
</li>
<li>
<p>Improve group name in <code>pytest --help</code>.</p>
</li>
</ul>
<p>3.10.1 (2021-08-13)</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/01a0f6c39754a41f0fd7b79c22f94ab2815ffe09"><code>01a0f6c</code></a> Version 3.16.0</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/a6b8f27dcf75d29ee984ff84d7be17e990473f0c"><code>a6b8f27</code></a> Remove logo (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/653">#653</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/032cdab12e0e7ef8f1bcf3c3c6d3f7aaf49b6b46"><code>032cdab</code></a> Support Python 3.13 (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/651">#651</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/6e487c019e6ea1df6033567ab9ee9211f83559a4"><code>6e487c0</code></a> Add automated release process (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/652">#652</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/bd36771d5b6eada7d6ab01cb45eb6d0bf6745830"><code>bd36771</code></a> Drop Python 3.8 support (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/650">#650</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/d8c34191a7564c03ece416b230cf2585e00a7d22"><code>d8c3419</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/644">#644</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/0622f5e0a62b86555bb9be223eb2ab5eacc49f67"><code>0622f5e</code></a> Bump astral-sh/setup-uv from 1 to 3 in the github-actions group (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/648">#648</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/4cfe61d59d2e408f43d4835a3ea248e97e33fc9c"><code>4cfe61d</code></a> Upgrade requirements (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/646">#646</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/61744b227c8a6055eb598058a08a94804792543d"><code>61744b2</code></a> Use uv on GitHub Actions (<a href="https://redirect.github.com/pytest-dev/pytest-randomly/issues/645">#645</a>)</li>
<li><a href="https://github.com/pytest-dev/pytest-randomly/commit/7ecb4137e15ea927ae04a519be4aee6629c0ee68"><code>7ecb413</code></a> Fix GHA upload-artifact config</li>
<li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest-randomly/compare/3.15.0...3.16.0">compare view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index bd1a81718..f48ba9a42 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -3155,6 +3155,42 @@
         "example",
         "tutorial"
       ]
+    },
+    {
+      "login": "VectorNd",
+      "name": "Rishabh Kamboj",
+      "avatar_url": "https://avatars.githubusercontent.com/u/111004091?v=4",
+      "profile": "https://github.com/VectorNd",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "jusssch",
+      "name": "Julius Schmid",
+      "avatar_url": "https://avatars.githubusercontent.com/jusssch",
+      "profile": "https://github.com/jusssch",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "jgyfutub",
+      "name": "Vedant Pandey",
+      "avatar_url": "https://avatars.githubusercontent.com/u/97391064?s=400&v=4",
+      "profile": "https://github.com/jgyfutub",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "manolotis",
+      "name": "Manuel Muñoz Sánchez",
+      "avatar_url": "https://avatars.githubusercontent.com/manolotis",
+      "profile": "https://github.com/manolotis",
+      "contributions": [
+        "doc"
+      ]
     }
   ]
 }
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 74669fad5..05ab17acd 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -6,7 +6,7 @@ Contributors
 <!-- Please add your badges to .all-contibutorsrc -->
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-309-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-312-orange.svg)](#contributors)
 <!-- ALL-CONTRIBUTORS-BADGE:END -->
 
 This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
@@ -181,9 +181,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/helloplayer1"><img src="https://avatars.githubusercontent.com/u/32032467?v=4?s=100" width="100px;" alt="Julian Haderlein"/><br /><sub><b>Julian Haderlein</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=helloplayer1" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/julnow"><img src="https://avatars.githubusercontent.com/u/21206185?v=4?s=100" width="100px;" alt="Julian Nowak"/><br /><sub><b>Julian Nowak</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ajulnow" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=julnow" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/julianarn/"><img src="https://avatars.githubusercontent.com/u/19613567?v=4?s=100" width="100px;" alt="Juliana"/><br /><sub><b>Juliana</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=julramos" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.justinshenk.com/"><img src="https://avatars.githubusercontent.com/u/10270308?v=4?s=100" width="100px;" alt="Justin Shenk"/><br /><sub><b>Justin Shenk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=justinshenk" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/jusssch"><img src="https://avatars.githubusercontent.com/jusssch?s=100" width="100px;" alt="Julius Schmid"/><br /><sub><b>Julius Schmid</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jusssch" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.justinshenk.com/"><img src="https://avatars.githubusercontent.com/u/10270308?v=4?s=100" width="100px;" alt="Justin Shenk"/><br /><sub><b>Justin Shenk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=justinshenk" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kcc-lion"><img src="?s=100" width="100px;" alt="Kai Lion"/><br /><sub><b>Kai Lion</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kanand77"><img src="https://avatars.githubusercontent.com/kanand77?s=100" width="100px;" alt="Kavin Anand"/><br /><sub><b>Kavin Anand</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kanand77" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://kejsitake.com/"><img src="https://avatars.githubusercontent.com/u/23707808?v=4?s=100" width="100px;" alt="Kejsi Take"/><br /><sub><b>Kejsi Take</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kejsitake" title="Code">💻</a></td>
@@ -192,9 +193,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://whitakerlab.github.io/"><img src="https://avatars1.githubusercontent.com/u/3626306?v=4?s=100" width="100px;" alt="Kirstie Whitaker"/><br /><sub><b>Kirstie Whitaker</b></sub></a><br /><a href="#ideas-KirstieJane" title="Ideas, Planning, & Feedback">🤔</a> <a href="#fundingFinding-KirstieJane" title="Funding Finding">🔍</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kishmanani"><img src="https://avatars.githubusercontent.com/u/30973056?v=4?s=100" width="100px;" alt="Kishan Manani"/><br /><sub><b>Kishan Manani</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=KishManani" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AKishManani" title="Bug reports">🐛</a> <a href="#ideas-KishManani" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ksharma6"><img src="https://avatars.githubusercontent.com/u/142558351?v=4?s=100" width="100px;" alt="Kishen Sharma"/><br /><sub><b>Kishen Sharma</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aksharma6" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ksharma6" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/krumeto"><img src="https://avatars3.githubusercontent.com/u/11272436?v=4?s=100" width="100px;" alt="Krum Arnaudov"/><br /><sub><b>Krum Arnaudov</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Akrumeto" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=krumeto" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/krumeto"><img src="https://avatars3.githubusercontent.com/u/11272436?v=4?s=100" width="100px;" alt="Krum Arnaudov"/><br /><sub><b>Krum Arnaudov</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Akrumeto" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=krumeto" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/koralturkk"><img src="https://avatars2.githubusercontent.com/u/18037789?s=460&v=4?s=100" width="100px;" alt="Kutay Koralturk"/><br /><sub><b>Kutay Koralturk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=koralturkk" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akoralturkk" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ltsaprounis"><img src="https://avatars.githubusercontent.com/u/64217214?v=4?s=100" width="100px;" alt="Leonidas Tsaprounis"/><br /><sub><b>Leonidas Tsaprounis</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ltsaprounis" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Altsaprounis" title="Bug reports">🐛</a> <a href="#mentoring-ltsaprounis" title="Mentoring">🧑‍🏫</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Altsaprounis" title="Reviewed Pull Requests">👀</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lielleravid"><img src="https://avatars.githubusercontent.com/u/37774194?v=4?s=100" width="100px;" alt="Lielle Ravid"/><br /><sub><b>Lielle Ravid</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Documentation">📖</a></td>
@@ -203,20 +204,21 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ltoniazzi"><img src="https://avatars.githubusercontent.com/u/61414566?s=100" width="100px;" alt="Lorenzo Toniazzi"/><br /><sub><b>Lorenzo Toniazzi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ltoniazzi" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Lovkush-A"><img src="https://avatars.githubusercontent.com/u/25344832?v=4?s=100" width="100px;" alt="Lovkush"/><br /><sub><b>Lovkush</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Lovkush-A" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Lovkush-A" title="Tests">⚠️</a> <a href="#ideas-Lovkush-A" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-Lovkush-A" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-Lovkush-A" title="Project Management">📆</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/luca-miniati"><img src="https://avatars.githubusercontent.com/u/87467600?v=4?s=100" width="100px;" alt="Luca Miniati"/><br /><sub><b>Luca Miniati</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=luca-miniati" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=luca-miniati" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/lbventura"><img src="https://avatars.githubusercontent.com/u/68004282?s=96&v=4?s=100" width="100px;" alt="Luis Ventura"/><br /><sub><b>Luis Ventura</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lbventura" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/lbventura"><img src="https://avatars.githubusercontent.com/u/68004282?s=96&v=4?s=100" width="100px;" alt="Luis Ventura"/><br /><sub><b>Luis Ventura</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lbventura" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/luiszugasti"><img src="https://avatars.githubusercontent.com/u/11198457?s=460&u=0645b72683e491824aca16db9702f1d3eb990389&v=4?s=100" width="100px;" alt="Luis Zugasti"/><br /><sub><b>Luis Zugasti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=luiszugasti" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lmmentel"><img src="https://avatars.githubusercontent.com/u/8989838?v=4?s=100" width="100px;" alt="Lukasz Mentel"/><br /><sub><b>Lukasz Mentel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Documentation">📖</a> <a href="#infra-lmmentel" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Almmentel" title="Bug reports">🐛</a> <a href="#maintenance-lmmentel" title="Maintenance">🚧</a> <a href="#mentoring-lmmentel" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/madhuri-agarwal-166080209/"><img src="https://avatars.githubusercontent.com/u/108001973?v=4&size=64?s=100" width="100px;" alt="Madhuri"/><br /><sub><b>Madhuri</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=madhuri723" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/manuel-munoz-aguirre"><img src="https://avatars.githubusercontent.com/u/5576458?v=4?s=100" width="100px;" alt="Manuel Muñoz Aguirre"/><br /><sub><b>Manuel Muñoz Aguirre</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manuel-munoz-aguirre" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/manolotis"><img src="https://avatars.githubusercontent.com/manolotis?s=100" width="100px;" alt="Manuel Muñoz Sánchez"/><br /><sub><b>Manuel Muñoz Sánchez</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manolotis" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/marrov"><img src="https://avatars.githubusercontent.com/u/54272586?v=4?s=100" width="100px;" alt="Marc Rovira"/><br /><sub><b>Marc Rovira</b></sub></a><br /><a href="#design-marrov" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/commits?author=marrov" title="Documentation">📖</a> <a href="#ideas-marrov" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-marrov" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-marrov" title="Project Management">📆</a> <a href="#talk-marrov" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://marcelotryle.com"><img src="https://avatars3.githubusercontent.com/u/7353520?v=4?s=100" width="100px;" alt="Marcelo Trylesinski"/><br /><sub><b>Marcelo Trylesinski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Kludex" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MarcoGorelli"><img src="https://avatars2.githubusercontent.com/u/33491632?v=4?s=100" width="100px;" alt="Marco Gorelli"/><br /><sub><b>Marco Gorelli</b></sub></a><br /><a href="#infra-MarcoGorelli" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/margaret-gorlin/"><img src="?s=100" width="100px;" alt="Margaret Gorlin"/><br /><sub><b>Margaret Gorlin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Code">💻</a> <a href="#example-mgorlin" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mariamjabara"><img src="?s=100" width="100px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mariamjabara" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/margaret-gorlin/"><img src="?s=100" width="100px;" alt="Margaret Gorlin"/><br /><sub><b>Margaret Gorlin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Code">💻</a> <a href="#example-mgorlin" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Tests">⚠️</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mariamjabara"><img src="?s=100" width="100px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mariamjabara" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://twitter.com/marielli"><img src="https://avatars2.githubusercontent.com/u/13499809?v=4?s=100" width="100px;" alt="Marielle"/><br /><sub><b>Marielle</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Code">💻</a> <a href="#ideas-marielledado" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mloning"><img src="https://avatars3.githubusercontent.com/u/21020482?v=4?s=100" width="100px;" alt="Markus Löning"/><br /><sub><b>Markus Löning</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mloning" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Tests">⚠️</a> <a href="#maintenance-mloning" title="Maintenance">🚧</a> <a href="#platform-mloning" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amloning" title="Reviewed Pull Requests">👀</a> <a href="#infra-mloning" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#example-mloning" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amloning" title="Bug reports">🐛</a> <a href="#tutorial-mloning" title="Tutorials">✅</a> <a href="#business-mloning" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Documentation">📖</a> <a href="#design-mloning" title="Design">🎨</a> <a href="#eventOrganizing-mloning" title="Event Organizing">📋</a> <a href="#fundingFinding-mloning" title="Funding Finding">🔍</a> <a href="#ideas-mloning" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-mloning" title="Project Management">📆</a> <a href="#question-mloning" title="Answering Questions">💬</a> <a href="#talk-mloning" title="Talks">📢</a> <a href="#mentoring-mloning" title="Mentoring">🧑‍🏫</a> <a href="#video-mloning" title="Videos">📹</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/markussagen"><img src="https://avatars.githubusercontent.com/u/20767068?v=4?s=100" width="100px;" alt="Markus Sagen"/><br /><sub><b>Markus Sagen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=markussagen" title="Code">💻</a> <a href="#example-markussagen" title="Examples">💡</a></td>
@@ -224,10 +226,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/martinagvilas"><img src="https://avatars2.githubusercontent.com/u/37339384?v=4?s=100" width="100px;" alt="Martina G. Vilas"/><br /><sub><b>Martina G. Vilas</b></sub></a><br /><a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amartinagvilas" title="Reviewed Pull Requests">👀</a> <a href="#ideas-martinagvilas" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mateuszkasprowicz"><img src="https://avatars.githubusercontent.com/mateuszkasprowicz?s=100" width="100px;" alt="Mateusz Kasprowicz"/><br /><sub><b>Mateusz Kasprowicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MCRE-BE"><img src="https://avatars.githubusercontent.com/u/99316631?s=100" width="100px;" alt="Mathias Creemers"/><br /><sub><b>Mathias Creemers</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMCRE-BE" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MCRE-BE" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars0.githubusercontent.com/u/25731235?v=4?s=100" width="100px;" alt="Matthew Middlehurst"/><br /><sub><b>Matthew Middlehurst</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Tests">⚠️</a> <a href="#tutorial-MatthewMiddlehurst" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3AMatthewMiddlehurst" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AMatthewMiddlehurst" title="Bug reports">🐛</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/tvdboom"><img src="https://avatars.githubusercontent.com/u/32366550?v=4?s=100" width="100px;" alt="Mavs"/><br /><sub><b>Mavs</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tvdboom" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars0.githubusercontent.com/u/25731235?v=4?s=100" width="100px;" alt="Matthew Middlehurst"/><br /><sub><b>Matthew Middlehurst</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Tests">⚠️</a> <a href="#tutorial-MatthewMiddlehurst" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3AMatthewMiddlehurst" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AMatthewMiddlehurst" title="Bug reports">🐛</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/tvdboom"><img src="https://avatars.githubusercontent.com/u/32366550?v=4?s=100" width="100px;" alt="Mavs"/><br /><sub><b>Mavs</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tvdboom" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/maxfrohlich/"><img src="https://avatars.githubusercontent.com/u/16393653?v=4?s=100" width="100px;" alt="Max Frohlich"/><br /><sub><b>Max Frohlich</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ninedigits" title="Code">💻</a> <a href="#ideas-ninedigits" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-ninedigits" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/solen0id"><img src="https://avatars.githubusercontent.com/u/20767606?v=4?s=100" width="100px;" alt="Max Patzelt"/><br /><sub><b>Max Patzelt</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=solen0id" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/meraldoantonio"><img src="https://avatars.githubusercontent.com/u/37468543?v=4?s=100" width="100px;" alt="Meraldo Antonio"/><br /><sub><b>Meraldo Antonio</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ameraldoantonio" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=meraldoantonio" title="Tests">⚠️</a></td>
@@ -235,10 +237,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="michaelfeil.eu"><img src="https://avatars.githubusercontent.com/u/63565275?v=4?s=100" width="100px;" alt="Michael Feil"/><br /><sub><b>Michael Feil</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Tests">⚠️</a> <a href="#ideas-michaelfeil" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mgazian000"><img src="https://avatars.githubusercontent.com/mgazian000?s=100" width="100px;" alt="Michael Gaziani"/><br /><sub><b>Michael Gaziani</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgazian000" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MMTrooper"><img src="https://avatars.githubusercontent.com/u/89777534?v=4?s=100" width="100px;" alt="Michael Mwimali"/><br /><sub><b>Michael Mwimali</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MMTrooper" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/MichalChromcak"><img src="https://avatars1.githubusercontent.com/u/12393430?v=4?s=100" width="100px;" alt="Michal Chromcak"/><br /><sub><b>Michal Chromcak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Tests">⚠️</a> <a href="#tutorial-MichalChromcak" title="Tutorials">✅</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mk406"><img src="https://avatars.githubusercontent.com/u/78024411?v=4?s=100" width="100px;" alt="Miguel Krause"/><br /><sub><b>Miguel Krause</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mk406" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/MichalChromcak"><img src="https://avatars1.githubusercontent.com/u/12393430?v=4?s=100" width="100px;" alt="Michal Chromcak"/><br /><sub><b>Michal Chromcak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Tests">⚠️</a> <a href="#tutorial-MichalChromcak" title="Tutorials">✅</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/mk406"><img src="https://avatars.githubusercontent.com/u/78024411?v=4?s=100" width="100px;" alt="Miguel Krause"/><br /><sub><b>Miguel Krause</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mk406" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/miraep8"><img src="https://avatars.githubusercontent.com/u/10511777?s=400&u=10a774fd4be767fa3b23a82a98bbfe102c17f0f3&v=4?s=100" width="100px;" alt="Mirae Parker"/><br /><sub><b>Mirae Parker</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MBristle"><img src="https://avatars.githubusercontent.com/MBristle?s=100" width="100px;" alt="Mirko Bristle"/><br /><sub><b>Mirko Bristle</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMBristle" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://mo-saif.github.io/"><img src="https://avatars0.githubusercontent.com/u/27867617?v=4?s=100" width="100px;" alt="Mohammed Saif Kazamel"/><br /><sub><b>Mohammed Saif Kazamel</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMo-Saif" title="Bug reports">🐛</a></td>
@@ -246,10 +248,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Multivin12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="Multivin12"/><br /><sub><b>Multivin12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/marcio55afr"><img src="https://avatars.githubusercontent.com/u/42646282?v=4?s=100" width="100px;" alt="Márcio A. Freitas Jr"/><br /><sub><b>Márcio A. Freitas Jr</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marcio55afr" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/niekvanderlaan"><img src="https://avatars.githubusercontent.com/u/9962825?v=4?s=100" width="100px;" alt="Niek van der Laan"/><br /><sub><b>Niek van der Laan</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=niekvanderlaan" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Dehelaan"><img src="https://avatars.githubusercontent.com/u/120308161?s=400&v=4?s=100" width="100px;" alt="Nihal Chaudhary"/><br /><sub><b>Nihal Chaudhary</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Dehelaan" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=100" width="100px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Dehelaan"><img src="https://avatars.githubusercontent.com/u/120308161?s=400&v=4?s=100" width="100px;" alt="Nihal Chaudhary"/><br /><sub><b>Nihal Chaudhary</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Dehelaan" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=100" width="100px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/nshahpazov/"><img src="https://avatars.githubusercontent.com/nshahpazov?s=100" width="100px;" alt="Nikola Shahpazov"/><br /><sub><b>Nikola Shahpazov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nshahpazov" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/nilesh05apr"><img src="https://avatars.githubusercontent.com/u/65773314?v=4?s=100" width="100px;" alt="Nilesh Kumar"/><br /><sub><b>Nilesh Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nilesh05apr" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ninfueng"><img src="https://avatars2.githubusercontent.com/u/28499769?v=4?s=100" width="100px;" alt="Ninnart Fuengfusin"/><br /><sub><b>Ninnart Fuengfusin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ninfueng" title="Code">💻</a></td>
@@ -257,10 +259,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/shchur"><img src="https://avatars.githubusercontent.com/u/6944857?v=4?s=100" width="100px;" alt="Oleksandr Shchur"/><br /><sub><b>Oleksandr Shchur</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ashchur" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=shchur" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kachayev"><img src="https://avatars.githubusercontent.com/u/485647?v=4?s=100" width="100px;" alt="Oleksii Kachaiev"/><br /><sub><b>Oleksii Kachaiev</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/olivermatthews"><img src="https://avatars.githubusercontent.com/u/31141490?v=4?s=100" width="100px;" alt="Oliver Matthews"/><br /><sub><b>Oliver Matthews</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=OliverMatthews" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=100" width="100px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Code">💻</a> <a href="#design-prockenschaub" title="Design">🎨</a> <a href="#ideas-prockenschaub" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=100" width="100px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=100" width="100px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Code">💻</a> <a href="#design-prockenschaub" title="Design">🎨</a> <a href="#ideas-prockenschaub" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Tests">⚠️</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=100" width="100px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://ber.gp"><img src="https://avatars1.githubusercontent.com/u/9824244?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Pangoraw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/paulyim97/"><img src="https://avatars.githubusercontent.com/pyyim?s=100" width="100px;" alt="Paul Yim"/><br /><sub><b>Paul Yim</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Code">💻</a> <a href="#example-pyyim" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.imes.uni-hannover.de/de/institut/team/m-sc-karl-philipp-kortmann/"><img src="https://avatars.githubusercontent.com/u/20466981?v=4?s=100" width="100px;" alt="Philipp Kortmann"/><br /><sub><b>Philipp Kortmann</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MrPr3ntice" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MrPr3ntice" title="Documentation">📖</a></td>
@@ -268,131 +270,132 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rahulporuri"><img src="https://avatars.githubusercontent.com/u/1926457?v=4?s=100" width="100px;" alt="Poruri Sai Rahul"/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rahulporuri" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/pranav-prajapati-a5b413226/"><img src="https://avatars.githubusercontent.com/u/94780581?v=4?s=100" width="100px;" alt="Pranav Prajapati"/><br /><sub><b>Pranav Prajapati</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Apranavvp16" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Prtm2110"><img src="https://avatars.githubusercontent.com/u/139000226?s=400&u=a2ef29514ad2780d1263ba9d724898132c8d18fb&v=4?s=100" width="100px;" alt="Pratham Hole"/><br /><sub><b>Pratham Hole</b></sub></a><br /><a href="#maintenance-Prtm2110" title="Maintenance">🚧</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=100" width="100px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=100" width="100px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=100" width="100px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ram0nB"><img src="https://avatars.githubusercontent.com/u/45173421?s=100" width="100px;" alt="Ramon Bussing"/><br /><sub><b>Ramon Bussing</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ARam0nB" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RavenRudi"><img src="https://avatars.githubusercontent.com/u/46402968?v=4?s=100" width="100px;" alt="RavenRudi"/><br /><sub><b>RavenRudi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RavenRudi" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wolph"><img src="?s=100" width="100px;" alt="Rick van Hattem"/><br /><sub><b>Rick van Hattem</b></sub></a><br /><a href="#infra-wolph" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RigvedManoj"><img src="https://avatars.githubusercontent.com/u/28307990?v=4?s=100" width="100px;" alt="Rigved Manoj"/><br /><sub><b>Rigved Manoj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RigvedManoj" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ris-Bali"><img src="https://avatars.githubusercontent.com/u/81592570?v=4?s=100" width="100px;" alt="Rishabh Bali"/><br /><sub><b>Rishabh Bali</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ris-Bali" title="Code">💻</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/VectorNd"><img src="https://avatars.githubusercontent.com/u/111004091?v=4?s=100" width="100px;" alt="Rishabh Kamboj"/><br /><sub><b>Rishabh Kamboj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VectorNd" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RishiKumarRay"><img src="https://avatars.githubusercontent.com/u/87641376?v=4?s=100" width="100px;" alt="Rishi Kumar Ray"/><br /><sub><b>Rishi Kumar Ray</b></sub></a><br /><a href="#infra-RishiKumarRay" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Riyabelle25"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://linkedin.com/in/robert-kuebler"><img src="https://avatars.githubusercontent.com/u/932327?v=4?s=100" width="100px;" alt="Robert Kübler"/><br /><sub><b>Robert Kübler</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AGarve" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Garve" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/romanlutz/"><img src="https://avatars.githubusercontent.com/u/10245648?v=4?s=100" width="100px;" alt="Roman Lutz"/><br /><sub><b>Roman Lutz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=romanlutz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ronnie-llamado"><img src="https://avatars.githubusercontent.com/ronnie-llamado?s=100" width="100px;" alt="Ronnie Llamado"/><br /><sub><b>Ronnie Llamado</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ronnie-llamado" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rnkuhns"><img src="https://avatars0.githubusercontent.com/u/26907244?v=4?s=100" width="100px;" alt="Ryan Kuhns"/><br /><sub><b>Ryan Kuhns</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Documentation">📖</a> <a href="#tutorial-RNKuhns" title="Tutorials">✅</a> <a href="#example-RNKuhns" title="Examples">💡</a> <a href="#ideas-RNKuhns" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3ARNKuhns" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/achieveordie"><img src="https://avatars.githubusercontent.com/u/54197164?v=4?s=100" width="100px;" alt="Sagar Mishra"/><br /><sub><b>Sagar Mishra</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aachieveordie" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=achieveordie" title="Code">💻</a> <a href="#ideas-achieveordie" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-achieveordie" title="Project Management">📆</a> <a href="https://github.com/sktime/sktime/commits?author=achieveordie" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SaiRevanth25"><img src="https://avatars.githubusercontent.com/SaiRevanth25?s=100" width="100px;" alt="Sai Revanth Gowravajhala"/><br /><sub><b>Sai Revanth Gowravajhala</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SaiRevanth25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ASaiRevanth25" title="Bug reports">🐛</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://sajay.online"><img src="https://avatars2.githubusercontent.com/u/25329624?v=4?s=100" width="100px;" alt="Sajaysurya Ganesh"/><br /><sub><b>Sajaysurya Ganesh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Documentation">📖</a> <a href="#design-sajaysurya" title="Design">🎨</a> <a href="#example-sajaysurya" title="Examples">💡</a> <a href="#ideas-sajaysurya" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Tests">⚠️</a> <a href="#tutorial-sajaysurya" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamiAlavi"><img src="https://avatars.githubusercontent.com/u/32700289?v=4?s=100" width="100px;" alt="Sami Alavi"/><br /><sub><b>Sami Alavi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamiAlavi" title="Code">💻</a> <a href="#maintenance-SamiAlavi" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamruddhiNavale"><img src="https://avatars.githubusercontent.com/u/86359115?v=4?s=100" width="100px;" alt="Samruddhi Navale"/><br /><sub><b>Samruddhi Navale</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamruddhiNavale" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sanjayk0508"><img src="https://avatars.githubusercontent.com/u/102804548?v=4?s=100" width="100px;" alt="Sanjay Kumar"/><br /><sub><b>Sanjay Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sanjayk0508" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/deysanjeeb"><img src="https://avatars.githubusercontent.com/u/39940629?v=4?s=100" width="100px;" alt="Sanjeeb Dey"/><br /><sub><b>Sanjeeb Dey</b></sub></a><br /><a href="#maintenance-deysanjeeb" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sssilvar"><img src="https://avatars.githubusercontent.com/u/16252054?v=4?s=100" width="100px;" alt="Santiago Smith Silva"/><br /><sub><b>Santiago Smith Silva</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sssilvar" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Saptarshi-Bandopadhyay"><img src="https://avatars.githubusercontent.com/u/88289395?v=4?s=100" width="100px;" alt="Saptarshi Bandopadhyay"/><br /><sub><b>Saptarshi Bandopadhyay</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Saptarshi-Bandopadhyay" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Saransh-cpp"><img src="https://avatars.githubusercontent.com/u/74055102?v=4?s=100" width="100px;" alt="Saransh Chopra"/><br /><sub><b>Saransh Chopra</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Saransh-cpp" title="Documentation">📖</a> <a href="#infra-Saransh-cpp" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/satya-pattnaik-77a430144/"><img src="https://avatars.githubusercontent.com/u/22102468?v=4?s=100" width="100px;" alt="Satya Prakash Pattnaik"/><br /><sub><b>Satya Prakash Pattnaik</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=satya-pattnaik" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/dasgupsa"><img src="https://avatars2.githubusercontent.com/u/10398956?v=4?s=100" width="100px;" alt="Saurabh Dasgupta"/><br /><sub><b>Saurabh Dasgupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=dasgupsa" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SebasKoel"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="Sebastiaan Koel"/><br /><sub><b>Sebastiaan Koel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=100" width="100px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=shagn" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bastisar"><img src="https://avatars.githubusercontent.com/u/142449680?v=4?s=100" width="100px;" alt="Sebastian Hien"/><br /><sub><b>Sebastian Hien</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Abastisar" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShivamPathak99"><img src="https://avatars.githubusercontent.com/u/98941325?s=400&v=4?s=100" width="100px;" alt="Shivam Pathak"/><br /><sub><b>Shivam Pathak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ShivamPathak99" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/AurumnPegasus"><img src="https://avatars.githubusercontent.com/u/54315149?v=4?s=100" width="100px;" alt="Shivansh Subramanian"/><br /><sub><b>Shivansh Subramanian</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=AurumnPegasus" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=AurumnPegasus" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><img src="https://gravatar.com/avatar/cbdbaac712ae282d730cd3028e862d45?s=400&d=robohash&r=x?s=100" width="100px;" alt="Shlok Sabarwal"/><br /><sub><b>Shlok Sabarwal</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=ssabarwal" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShreeshaM07"><img src="https://avatars.githubusercontent.com/u/120820143?s=400&v=4?s=100" width="100px;" alt="Shreesha M"/><br /><sub><b>Shreesha M</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AShreeshaM07" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sbuse"><img src="https://avatars.githubusercontent.com/u/24408707?v=4?s=100" width="100px;" alt="Simon B."/><br /><sub><b>Simon B.</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sbuse" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/slavik57"><img src="https://avatars.githubusercontent.com/u/6184997?v=4?s=100" width="100px;" alt="Slava Shpitalny"/><br /><sub><b>Slava Shpitalny</b></sub></a><br /><a href="#maintenance-slavik57" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/solomon-botchway-a1383821b/"><img src="https://avatars.githubusercontent.com/u/62394255?v=4?s=100" width="100px;" alt="Solomon Botchway"/><br /><sub><b>Solomon Botchway</b></sub></a><br /><a href="#maintenance-snnbotchway" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/khrapovs"><img src="https://avatars.githubusercontent.com/u/3774663?v=4?s=100" width="100px;" alt="Stanislav Khrapov"/><br /><sub><b>Stanislav Khrapov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=khrapovs" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/steenrotsman"><img src="https://avatars.githubusercontent.com/u/78110080?s=400&v=4?s=100" width="100px;" alt="Stijn J. Rotman"/><br /><sub><b>Stijn J. Rotman</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SveaMeyer13"><img src="https://avatars.githubusercontent.com/u/46671894?v=4?s=100" width="100px;" alt="Svea Marie Meyer"/><br /><sub><b>Svea Marie Meyer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SveaMeyer13" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=SveaMeyer13" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/TNTran92"><img src="https://avatars.githubusercontent.com/u/55965636?v=4?s=100" width="100px;" alt="TNTran92"/><br /><sub><b>TNTran92</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=TNTran92" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Taise228"><img src="https://avatars.githubusercontent.com/u/95762401?s=400&v=4?s=100" width="100px;" alt="Taisei Yamamoto"/><br /><sub><b>Taisei Yamamoto</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Taise228" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://thayeylolu.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/13348874?v=4?s=100" width="100px;" alt="Taiwo Owoseni"/><br /><sub><b>Taiwo Owoseni</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=thayeylolu" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lnthach"><img src="https://avatars0.githubusercontent.com/u/7788363?v=4?s=100" width="100px;" alt="Thach Le Nguyen"/><br /><sub><b>Thach Le Nguyen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Tests">⚠️</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mathco-wf"><img src="https://avatars.githubusercontent.com/mathco-wf?s=100" width="100px;" alt="TheMathcompay Widget Factory Team"/><br /><sub><b>TheMathcompay Widget Factory Team</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mathco-wf" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tombh"><img src="https://avatars.githubusercontent.com/u/160835?s=80&v=4?s=100" width="100px;" alt="Thomas Buckley-Houston"/><br /><sub><b>Thomas Buckley-Houston</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atombh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xxl4tomxu98"><img src="https://avatars.githubusercontent.com/u/62292177?s=40&v=4?s=100" width="100px;" alt="Tom Xu"/><br /><sub><b>Tom Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tpvasconcelos"><img src="https://avatars.githubusercontent.com/u/17701527?v=4?s=100" width="100px;" alt="Tomas P. de Vasconcelos"/><br /><sub><b>Tomas P. de Vasconcelos</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atpvasconcelos" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=tpvasconcelos" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tch"><img src="https://avatars3.githubusercontent.com/u/184076?v=4?s=100" width="100px;" alt="Tomasz Chodakowski"/><br /><sub><b>Tomasz Chodakowski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tch" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=tch" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Atch" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars1.githubusercontent.com/u/9594042?v=4?s=100" width="100px;" alt="Tony Bagnall"/><br /><sub><b>Tony Bagnall</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=TonyBagnall" title="Code">💻</a> <a href="#business-TonyBagnall" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=TonyBagnall" title="Documentation">📖</a> <a href="#design-TonyBagnall" title="Design">🎨</a> <a href="#eventOrganizing-TonyBagnall" title="Event Organizing">📋</a> <a href="#fundingFinding-TonyBagnall" title="Funding Finding">🔍</a> <a href="#ideas-TonyBagnall" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-TonyBagnall" title="Project Management">📆</a> <a href="#question-TonyBagnall" title="Answering Questions">💬</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3ATonyBagnall" title="Reviewed Pull Requests">👀</a> <a href="#talk-TonyBagnall" title="Talks">📢</a> <a href="#data-TonyBagnall" title="Data">🔣</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/onyekaugochukwu"><img src="https://avatars.githubusercontent.com/u/92909501?v=4?s=100" width="100px;" alt="Ugochukwu Onyeka"/><br /><sub><b>Ugochukwu Onyeka</b></sub></a><br /><a href="#business-onyekaugochukwu" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=onyekaugochukwu" title="Documentation">📖</a> <a href="#ideas-onyekaugochukwu" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-onyekaugochukwu" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-onyekaugochukwu" title="Project Management">📆</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/utsavcoding"><img src="https://avatars3.githubusercontent.com/u/55446385?v=4?s=100" width="100px;" alt="Utsav Kumar Tiwari"/><br /><sub><b>Utsav Kumar Tiwari</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vandit98"><img src="https://avatars.githubusercontent.com/u/91458535?v=4?s=100" width="100px;" alt="Vandit Tyagi"/><br /><sub><b>Vandit Tyagi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vandit98" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Vasudeva-bit"><img src="https://avatars.githubusercontent.com/u/70791259?v=4?s=100" width="100px;" alt="Vasudeva Kilaru"/><br /><sub><b>Vasudeva Kilaru</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedantag17"><img src="https://avatars.githubusercontent.com/u/118207011?v=4?s=100" width="100px;" alt="Vedant Agrawal"/><br /><sub><b>Vedant Agrawal</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedantag17" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/victordremov"><img src="https://avatars.githubusercontent.com/u/32140716?s=100" width="100px;" alt="Viktor Dremov"/><br /><sub><b>Viktor Dremov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=victordremov" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ViktorKaz"><img src="https://avatars0.githubusercontent.com/u/33499138?v=4?s=100" width="100px;" alt="ViktorKaz"/><br /><sub><b>ViktorKaz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ViktorKaz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ViktorKaz" title="Documentation">📖</a> <a href="#design-ViktorKaz" title="Design">🎨</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vnicholson1"><img src="?s=100" width="100px;" alt="Vincent Nicholson"/><br /><sub><b>Vincent Nicholson</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vnicholson1" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/VyomkeshVyas"><img src="?s=100" width="100px;" alt="Vyomkesh Vyas"/><br /><sub><b>Vyomkesh Vyas</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Documentation">📖</a> <a href="#example-VyomkeshVyas" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wayneadams"><img src="https://avatars.githubusercontent.com/u/15034841?s=400&u=d717e9945910bcc844c5e64cd56d570c6cc4e8e6&v=4?s=100" width="100px;" alt="Wayne Adams"/><br /><sub><b>Wayne Adams</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wayneadams" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/fr1ll"><img src="https://avatars.githubusercontent.com/u/29168593?v=4?s=100" width="100px;" alt="Will Sanger"/><br /><sub><b>Will Sanger</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/templierw/"><img src="https://github.com/templierw.png?s=100" width="100px;" alt="William Templier"/><br /><sub><b>William Templier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=templierw" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/magittan"><img src="https://avatars0.githubusercontent.com/u/14024202?v=4?s=100" width="100px;" alt="William Zheng"/><br /><sub><b>William Zheng</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=magittan" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=magittan" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wirrywoo"><img src="https://avatars.githubusercontent.com/u/148647848?v=4?s=100?s=100" width="100px;" alt="Wilson Cheung"/><br /><sub><b>Wilson Cheung</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wpdonders"><img src="https://avatars.githubusercontent.com/u/1868824?v=4?s=100?s=100" width="100px;" alt="Wouter Donders"/><br /><sub><b>Wouter Donders</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wpdonders" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=wpdonders" title="Tests">⚠️</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/XinyuWuu"><img src="https://avatars.githubusercontent.com/u/57612792?v=4?s=100" width="100px;" alt="Xinyu Wu"/><br /><sub><b>Xinyu Wu</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AXinyuWuu" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=XinyuWuu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=XinyuWuu" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yairbeer"><img src="https://avatars.githubusercontent.com/yairbeer?s=100" width="100px;" alt="Yair Beer"/><br /><sub><b>Yair Beer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yairbeer" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/yann-hallouard/"><img src="https://avatars.githubusercontent.com/YHallouard?s=100" width="100px;" alt="Yann Hallouard"/><br /><sub><b>Yann Hallouard</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MEMEO-PRO"><img src="https://avatars.githubusercontent.com/memeo-pro?s=100" width="100px;" alt="Yash Edake"/><br /><sub><b>Yash Edake</b></sub></a><br /><a href="#maintenance-memeo-pro" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amemeo-pro" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/YashKhare20"><img src="https://avatars.githubusercontent.com/u/92680366?s=400?s=100" width="100px;" alt="Yash Khare"/><br /><sub><b>Yash Khare</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yashlamba"><img src="https://avatars.githubusercontent.com/u/44164398?v=4?s=100" width="100px;" alt="Yash Lamba"/><br /><sub><b>Yash Lamba</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yashlamba" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=100" width="100px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sz85512678"><img src="https://avatars.githubusercontent.com/sz85512678?s=100" width="100px;" alt="Zhen Shao"/><br /><sub><b>Zhen Shao</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sz85512678" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ZiyaoWei"><img src="https://avatars.githubusercontent.com/u/940823?v=4?s=100" width="100px;" alt="Ziyao Wei"/><br /><sub><b>Ziyao Wei</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ZiyaoWei" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/aa25desh"><img src="https://avatars1.githubusercontent.com/u/29518290?v=4?s=100" width="100px;" alt="aa25desh"/><br /><sub><b>aa25desh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=aa25desh" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Aaa25desh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/abandus"><img src="https://avatars2.githubusercontent.com/u/46486474?v=4?s=100" width="100px;" alt="abandus"/><br /><sub><b>abandus</b></sub></a><br /><a href="#ideas-abandus" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=abandus" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/adoherty21"><img src="https://avatars.githubusercontent.com/u/52799751?s=400&v=4?s=100" width="100px;" alt="adoherty21"/><br /><sub><b>adoherty21</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aadoherty21" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bethrice44"><img src="https://avatars.githubusercontent.com/u/11226988?v=4?s=100" width="100px;" alt="bethrice44"/><br /><sub><b>bethrice44</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Abethrice44" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abethrice44" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/big-o"><img src="https://avatars1.githubusercontent.com/u/1134151?v=4?s=100" width="100px;" alt="big-o"/><br /><sub><b>big-o</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=big-o" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=big-o" title="Tests">⚠️</a> <a href="#design-big-o" title="Design">🎨</a> <a href="#ideas-big-o" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abig-o" title="Reviewed Pull Requests">👀</a> <a href="#tutorial-big-o" title="Tutorials">✅</a> <a href="#mentoring-big-o" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bobbys-dev"><img src="https://avatars.githubusercontent.com/bobbys-dev?s=100" width="100px;" alt="bobbys"/><br /><sub><b>bobbys</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bobbys-dev" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/brettkoonce"><img src="https://avatars2.githubusercontent.com/u/11281814?v=4?s=100" width="100px;" alt="brett koonce"/><br /><sub><b>brett koonce</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=brettkoonce" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/btrtts"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="btrtts"/><br /><sub><b>btrtts</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=btrtts" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chizzi25"><img src="https://avatars3.githubusercontent.com/u/67911243?v=4?s=100" width="100px;" alt="chizzi25"/><br /><sub><b>chizzi25</b></sub></a><br /><a href="#blog-chizzi25" title="Blogposts">📝</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chrisholder"><img src="https://avatars.githubusercontent.com/u/4674372?v=4?s=100" width="100px;" alt="chrisholder"/><br /><sub><b>chrisholder</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Documentation">📖</a> <a href="#design-chrisholder" title="Design">🎨</a> <a href="#example-chrisholder" title="Examples">💡</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/morestart"><img src="https://avatars.githubusercontent.com/u/35556811?s=100" width="100px;" alt="ctl"/><br /><sub><b>ctl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Amorestart" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/danbartl"><img src="https://avatars.githubusercontent.com/u/19947407?v=4?s=100" width="100px;" alt="danbartl"/><br /><sub><b>danbartl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Adanbartl" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Adanbartl" title="Reviewed Pull Requests">👀</a> <a href="#talk-danbartl" title="Talks">📢</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Tests">⚠️</a> <a href="#tutorial-danbartl" title="Tutorials">✅</a> <a href="#video-danbartl" title="Videos">📹</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/hamzahiqb"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hamzahiqb"/><br /><sub><b>hamzahiqb</b></sub></a><br /><a href="#infra-hamzahiqb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/hiqbal2"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hiqbal2"/><br /><sub><b>hiqbal2</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=hiqbal2" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jesellier"><img src="https://avatars0.githubusercontent.com/u/51952076?v=4?s=100" width="100px;" alt="jesellier"/><br /><sub><b>jesellier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jesellier" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jschemm"><img src="https://avatars.githubusercontent.com/u/81151346?v=4?s=100" width="100px;" alt="jschemm"/><br /><sub><b>jschemm</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jschemm" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kkoziara"><img src="https://avatars1.githubusercontent.com/u/4346849?v=4?s=100" width="100px;" alt="kkoziara"/><br /><sub><b>kkoziara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kkoziara" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akkoziara" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/matteogales"><img src="https://avatars0.githubusercontent.com/u/9269326?v=4?s=100" width="100px;" alt="matteogales"/><br /><sub><b>matteogales</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=matteogales" title="Code">💻</a> <a href="#design-matteogales" title="Design">🎨</a> <a href="#ideas-matteogales" title="Ideas, Planning, & Feedback">🤔</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/oleskiewicz"><img src="https://avatars1.githubusercontent.com/u/5682158?v=4?s=100" width="100px;" alt="oleskiewicz"/><br /><sub><b>oleskiewicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pabworks"><img src="https://avatars.githubusercontent.com/u/32725127?v=4?s=100" width="100px;" alt="pabworks"/><br /><sub><b>pabworks</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xloem"><img src="?s=100" width="100px;" alt="patiently pending world peace"/><br /><sub><b>patiently pending world peace</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xloem" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/raishubham1"><img src="https://avatars3.githubusercontent.com/u/29356417?v=4?s=100" width="100px;" alt="raishubham1"/><br /><sub><b>raishubham1</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=raishubham1" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/simone-pignotti"><img src="https://avatars1.githubusercontent.com/u/44410066?v=4?s=100" width="100px;" alt="simone-pignotti"/><br /><sub><b>simone-pignotti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=simone-pignotti" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Asimone-pignotti" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sophijka"><img src="https://avatars2.githubusercontent.com/u/47450591?v=4?s=100" width="100px;" alt="sophijka"/><br /><sub><b>sophijka</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sophijka" title="Documentation">📖</a> <a href="#maintenance-sophijka" title="Maintenance">🚧</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sri1419"><img src="https://avatars2.githubusercontent.com/u/65078278?v=4?s=100" width="100px;" alt="sri1419"/><br /><sub><b>sri1419</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sri1419" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tensorflow-as-tf"><img src="https://avatars.githubusercontent.com/u/51345718?v=4?s=100" width="100px;" alt="tensorflow-as-tf"/><br /><sub><b>tensorflow-as-tf</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tensorflow-as-tf" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedazeren"><img src="https://avatars3.githubusercontent.com/u/63582874?v=4?s=100" width="100px;" alt="vedazeren"/><br /><sub><b>vedazeren</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Tests">⚠️</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vincent-nich12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="vincent-nich12"/><br /><sub><b>vincent-nich12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vincent-nich12" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vollmersj"><img src="https://avatars2.githubusercontent.com/u/12613127?v=4?s=100" width="100px;" alt="vollmersj"/><br /><sub><b>vollmersj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vollmersj" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xiaobenbenecho"><img src="https://avatars.githubusercontent.com/u/17461849?v=4?s=100" width="100px;" alt="xiaobenbenecho"/><br /><sub><b>xiaobenbenecho</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xiaobenbenecho" title="Code">💻</a></td>
diff --git a/README.md b/README.md
index 480fa793f..5405d5974 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,7 @@
-<a href="https://www.sktime.net"><img src="https://github.com/sktime/sktime/blob/main/docs/source/images/sktime-logo.svg" width="175" align="right" /></a>
 
-# Welcome to sktime
+## Welcome to sktime
+
+<a href="https://www.sktime.net"><img src="https://github.com/sktime/sktime/blob/main/docs/source/images/sktime-logo.svg" width="175" align="right" /></a>
 
 > A unified interface for machine learning with time series
 
diff --git a/docs/source/api_reference.rst b/docs/source/api_reference.rst
index ca950aa60..1a6a10fb1 100644
--- a/docs/source/api_reference.rst
+++ b/docs/source/api_reference.rst
@@ -18,7 +18,7 @@ For a list of object and estimator tags, see :ref:`tags_ref`.
 .. toctree::
     :maxdepth: 1
 
-    api_reference/base
+    api_reference/data_format
     api_reference/forecasting
     api_reference/transformations
     api_reference/classification
@@ -31,9 +31,9 @@ For a list of object and estimator tags, see :ref:`tags_ref`.
     api_reference/alignment
     api_reference/detection
     api_reference/datasets
-    api_reference/data_format
     api_reference/deployment
     api_reference/utils
+    api_reference/base
     api_reference/exceptions
     api_reference/tags
     api_reference/pipeline
diff --git a/docs/source/api_reference/clustering.rst b/docs/source/api_reference/clustering.rst
index 013499ec4..df71ad238 100644
--- a/docs/source/api_reference/clustering.rst
+++ b/docs/source/api_reference/clustering.rst
@@ -15,8 +15,8 @@ A full table with tag based search is also available on the
 (select "clustering" in the "Estimator type" dropdown).
 
 
-Clustering models
------------------
+Partitioning based
+------------------
 
 .. currentmodule:: sktime.clustering.k_means
 
@@ -43,6 +43,9 @@ Clustering models
 
     TimeSeriesKShapes
 
+Spectral and kernel clustering
+------------------------------
+
 .. currentmodule:: sktime.clustering.kernel_k_means
 
 .. autosummary::
@@ -51,6 +54,17 @@ Clustering models
 
     TimeSeriesKernelKMeans
 
+Density-based
+-------------
+
+.. currentmodule:: sktime.clustering.dbscan
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    TimeSeriesDBSCAN
+
 Base
 ----
 
diff --git a/docs/source/api_reference/data_format.rst b/docs/source/api_reference/data_format.rst
index 078398ef6..4f2329996 100644
--- a/docs/source/api_reference/data_format.rst
+++ b/docs/source/api_reference/data_format.rst
@@ -1,10 +1,159 @@
 .. _data_format:
 
-File Format Specifications
+Data Format Specifications
 ==========================
 
-The File Format Specifications provides a technical manual for understanding and writing
-different file formats found in ``sktime``.
+This section provides specifications for:
+
+* python in-memory data containers used in ``sktime`` (e.g., time series, panel data, etc.)
+* serialized file formats used by ``sktime`` (e.g., ts)
+
+For utilities to check and convert data formats, see the API reference on :ref:`utils_ref`.
+
+
+In-memory Data Specifications
+-----------------------------
+
+``sktime`` uses a variety of in-memory data containers to represent time series data.
+
+The in-memory specifications are listed by abstract data type, also referred to
+as data :term:`scitype` (scientific type) throughout the documentation.
+
+The core scitypes in ``sktime`` are:
+
+- ``Series``: a single time series
+- ``Panel``: a flat collection of time series, also called panel of time series, or panel data
+- ``Hierarchical``: a hierarchical collection of time series
+- ``Table``: a data frame table, as implemented for instance by ``pandas.DataFrame``
+
+Each scitype is sub-typed with property fields such as ``is_univariate``
+(the time series is univariate yes/no),
+``n_instances`` (number of instances in a panel or hierarchical collection), etc.
+
+Concerete data types in ``sktime`` are implementations of these abstract data types,
+also referred to as data :term:`mtype` (machine type) throughout the documentation.
+
+Full specifications of the abstract data types,
+with their subtypes, can be accessed below:
+
+.. currentmodule:: sktime.datatypes._series._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeSeries
+
+.. currentmodule:: sktime.datatypes._panel._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypePanel
+
+.. currentmodule:: sktime.datatypes._hierarchical._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeHierarchical
+
+.. currentmodule:: sktime.datatypes._table._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeTable
+
+
+``Series`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Series`` mtype represents a single time series.
+
+.. currentmodule:: sktime.datatypes._series._check
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    SeriesPdDataFrame
+    SeriesPdSeries
+    SeriesNp2D
+    SeriesXArray
+    SeriesDask
+    SeriesPolarsEager
+    SeriesGluontsList
+    SeriesGluontsPandas
+
+
+``Panel`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Panel`` mtype represents a flat collection of time series.
+
+.. currentmodule:: sktime.datatypes._panel._check
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    PanelPdMultiIndex
+    PanelNp3D
+    PanelDfList
+    PanelDask
+    PanelPolarsEager
+    PanelGluontsList
+    PanelGluontsPandas
+
+
+``Hierarchical`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Hierarchical`` mtype represents a hierarchical collection of time series.
+
+.. currentmodule:: sktime.datatypes._hierarchical._check
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    HierarchicalPdMultiIndex
+    HierarchicalDask
+    HierarchicalPolarsEager
+
+
+``Table`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Table`` mtype represents a (non-temporal) data frame table.
+
+.. currentmodule:: sktime.datatypes._table._check
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    TablePdDataFrame
+    TablePdSeries
+    TableNp1D
+    TableNp2D
+    TableListOfDict
+    TablePolarsEager
+    TableGluontsList
+    TableGluontsPandas
+
+
+Serialized File Format Specifications
+-------------------------------------
+
+``sktime`` supports a variety of file formats for serialized data,
+specific to storing time series data.
+
+Specifications for file formats specific to ``sktime`` are provided below:
 
 .. toctree::
     :maxdepth: 1
diff --git a/docs/source/api_reference/detection.rst b/docs/source/api_reference/detection.rst
index 4558d4022..4fe40aac1 100644
--- a/docs/source/api_reference/detection.rst
+++ b/docs/source/api_reference/detection.rst
@@ -97,6 +97,14 @@ Time Series Segmentation
 
     ClusterSegmenter
 
+.. currentmodule:: sktime.annotation.bs.BinarySegmentation
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    BinarySegmentation
+
 Time Series Anomaly Detection
 -----------------------------
 
diff --git a/docs/source/api_reference/forecasting.rst b/docs/source/api_reference/forecasting.rst
index d951367bb..05af3689c 100644
--- a/docs/source/api_reference/forecasting.rst
+++ b/docs/source/api_reference/forecasting.rst
@@ -122,7 +122,7 @@ Direct and recursive - ``sktime`` native 2nd generation
     :template: class.rst
 
     DirectReductionForecaster
-
+    RecursiveReductionForecaster
 
 Direct and recursive - 3rd party
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -211,6 +211,18 @@ Wrappers that add prediction intervals to any forecaster.
     EnbPIForecaster
 
 
+Calibration and bias adjustment
+-------------------------------
+
+.. currentmodule:: sktime.forecasting.boxcox_bias_adjusted_forecaster
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    BoxCoxBiasAdjustedForecaster
+
+
 Trend forecasters
 -----------------
 
@@ -337,6 +349,14 @@ All "ARIMA" and "Auto-ARIMA" models below include SARIMAX capability.
 
     VARMAX
 
+.. currentmodule:: sktime.forecasting.vecm
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    VECM
+
 Auto-ARIMA models
 ~~~~~~~~~~~~~~~~~
 
diff --git a/docs/source/api_reference/transformations.rst b/docs/source/api_reference/transformations.rst
index b9e8bc21d..07d7473ce 100644
--- a/docs/source/api_reference/transformations.rst
+++ b/docs/source/api_reference/transformations.rst
@@ -241,6 +241,14 @@ Auto-correlation-based features
 Moment-based features
 ~~~~~~~~~~~~~~~~~~~~~
 
+.. currentmodule:: sktime.transformations.series.signature
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    SignatureMoments
+
 .. currentmodule:: sktime.transformations.panel.signature_based
 
 .. autosummary::
diff --git a/docs/source/developer_guide/git_workflow.rst b/docs/source/developer_guide/git_workflow.rst
index e3519d8c0..82bd7118e 100644
--- a/docs/source/developer_guide/git_workflow.rst
+++ b/docs/source/developer_guide/git_workflow.rst
@@ -10,15 +10,16 @@ GitHub, clone, and develop on a new branch.
 
 The workflow consists of two main parts:
 
-* **Creating a fork**: This sets up your own copy of the ``sktime`` repository on GitHub.
-  This needs to be done only once, when you start contributing to ``sktime``.
+* **Creating a fork and cloning the repository**: This section will help you set up your own forked copy of the ``sktime``
+repository on GitHub and a local copy of the forked repository on your machine. This needs to be done only once, when you
+start contributing to ``sktime``.
 * **Developing a feature**: This is the process of developing a new feature, e.g.,
   a bugfix or new estimator.
   This is done every time you want to contribute a new feature.
 
 
-Creating a fork - Initial one time setup
-----------------------------------------
+Creating a fork and cloning the repository - initial one time setup
+-------------------------------------------------------------------
 
 1.  Fork the `project
     repository <https://github.com/sktime/sktime>`__ by
@@ -57,8 +58,8 @@ Creating a fork - Initial one time setup
        > upstream  https://github.com/sktime/sktime.git (push)
 
 
-Contributing a feature - for every new feature
-----------------------------------------------
+Developing a feature - repeat for every new feature
+---------------------------------------------------
 
 1.  `Sync <https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork>`_
     the ``main`` branch of your fork with the upstream repository:
diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
index 500a440b3..4614913d3 100644
--- a/docs/source/glossary.rst
+++ b/docs/source/glossary.rst
@@ -26,7 +26,8 @@ sktime.
         ``Panel`` scitype. Data containers can be checked for compliance with
         a given mtype using the :func:`sktime.datatypes.check_is_mtype` function;
         all mtypes can be listed in ``sktime.datatypes.MTYPE_REGISTER``.
-        For more details on the general concept, see
+        For more details on the general concept, and precise specifications, see the
+        :ref:`data_format` and
         `the datatypes and datasets user guide :doc:</examples/AA_datatypes_and_datasets>`.
 
     scitype
@@ -48,6 +49,7 @@ sktime.
         the ``sktime.datatypes.check_is_scitype`` utility; for estimators, compliance
         is checked using ``sktime.utils.check_estimator``.
         For more details on data scitpyes, see :term:`mtype`.
+        For exact specifications of scitypes, see the :ref:`data_format`.
         For more details on estimator scitypes, see the user guides on individual
         learning tasks.
 
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
index 09983e154..44c5af048 100644
--- a/docs/source/installation.rst
+++ b/docs/source/installation.rst
@@ -13,18 +13,23 @@ See here for a `full list of precompiled wheels available on PyPI <https://pypi.
 .. contents::
    :local:
 
-For frequent issues with installation, consult the `Release versions - troubleshooting`_ section.
+For frequent issues with installation, consult the `Troubleshooting`_ section.
 
-There are three different installation types:
+There are three different installation types, depending on your use case:
 
-* Installing sktime releases
-* Installing the latest sktime development version
-* For developers of sktime and 3rd party extensions: Developer setup
+* Installing stable ``sktime`` releases - for most users, for production environments
+* Installing the latest unstable ``sktime`` development version - for pre-release tests
+* For developers of ``sktime`` and 3rd party extensions: Developer setup for extensions and contributions
 
 Each of these three setups are explained below.
 
-Release versions
-----------------
+Installing release versions
+---------------------------
+
+For:
+
+* Most users
+* Use in production environments
 
 Installing sktime from PyPI
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -83,16 +88,23 @@ Note: not all soft dependencies of ``sktime`` are also available on ``conda-forg
 The other soft dependencies can be installed via ``pip``, after ``conda install pip``.
 
 
-Development version install
----------------------------
+Installing latest unstable development version
+----------------------------------------------
+
+For:
 
-Development versions of ``sktime`` are installs from static snapshots of the ``sktime`` repository.
+* pre-release tests, e.g., early testing of new features
+* not for reliable production use
+* not for contributors or extenders
 
-Installing development versions is useful for testing, but not recommended
-for development and contribution. For development and contribution, see the next section
-on full developer setup.
+This type of ``sktime`` installation obtains a latest static snapshot of the repository.
+It is intended for developers that wish to build or test code using a version of the library
+that contains the all of the latest and current updates.
 
-To install the latest development version of ``sktime``,
+.. note::
+    For an full editible developer setup, please read the section "Full developer setup for contributors and extension developers" below.
+
+To install the latest version of ``sktime`` directly from the repository,
 you can use the ``pip`` package manager to install directly from the GitHub repository:
 
 .. code-block:: bash
@@ -106,9 +118,11 @@ To install from a specific branch, use the following command:
 
     pip install git+https://github.com/sktime/sktime.git@<branch_name>
 
-Alternatively, a developer install can be obtained from a local clone of the repository.
+Alternatively, a latest version install can be obtained from a local clone of the repository.
+
+For steps on how to obtain a local clone of the repository, please follow the steps described here:
+:ref:`Creating a fork and cloning the repository <Creating a fork and cloning the repository - initial one time setup>`
 
-For this, follow Step 1 of the `full developer setup`_ below, and then install the package with:
 
 .. code-block:: bash
 
@@ -120,6 +134,12 @@ Alternatively, the ``.`` may be replaced with a full or relative path to the roo
 Full developer setup for contributors and extension developers
 --------------------------------------------------------------
 
+For whom:
+
+* contributors to the ``sktime`` project
+* developers of extensions in closed code bases
+* developers of 3rd party extensions released as open source
+
 To develop ``sktime`` locally, or to contribute to the project, you need to set up:
 
 * a local clone of the ``sktime`` repository.
@@ -127,16 +147,16 @@ To develop ``sktime`` locally, or to contribute to the project, you need to set
 
 The following steps guide you through the process:
 
-1. Follow the Git workflow: Fork and clone the repository as described in [Git and GitHub workflow](https://www.sktime.net/en/stable/developer_guide/git_workflow.html)
+1. Follow the Git workflow: :ref:`Creating a fork and cloning the repository <Creating a fork and cloning the repository - initial one time setup>`
 
-2. Set up a new virtual environment. Our instructions will go through the commands to set up a ``conda`` environment which is recommended for sktime development.
+2. Set up a new virtual environment. Our instructions will go through the commands to set up a ``conda`` environment, which tends to be beginner friendly.
 The process will be similar for ``venv`` or other virtual environment managers.
 
-  .. warning::
-       Using ``conda`` via one of the commercial distributions such as Anaconda
-       is in general not free for commercial use and may incur significant costs or liabilities.
-       Consider using free distributions and channels for package management,
-       and be aware of applicable terms and conditions.
+.. warning::
+    Using ``conda`` via one of the commercial distributions such as Anaconda
+    is in general not free for commercial use and may incur significant costs or liabilities.
+    Consider using free distributions and channels for package management,
+    and be aware of applicable terms and conditions.
 
 In the ``conda`` terminal:
 
diff --git a/examples/02_classification.ipynb b/examples/02_classification.ipynb
index 00b2e0df0..0a5f05201 100644
--- a/examples/02_classification.ipynb
+++ b/examples/02_classification.ipynb
@@ -32,7 +32,7 @@
     "\n",
     "- Example: Daily energy consumption profile over time - Predict season, e.g., winter/summer, or type of consumer\n",
     "\n",
-    "Regression = try to assign one *category* per time series, after training on time series/category examples\n",
+    "Regression = try to assign one continuous *numerical value* per time series, after training on time series/category examples\n",
     "\n",
     "- Example: Temperature/pressure/time profile of chemical reactor - Predict total purity (fraction of 1)\n",
     "\n",
diff --git a/extension_templates/detection.py b/extension_templates/detection.py
index 47106fcdd..b056e55e6 100644
--- a/extension_templates/detection.py
+++ b/extension_templates/detection.py
@@ -18,11 +18,11 @@ How to use this implementation template to implement a new estimator:
   https://www.sktime.net/en/stable/developer_guide/add_estimators.html
 
 Mandatory implements:
-    fitting         - _fit(self, X, Y=None)
+    fitting         - _fit(self, X, y=None)
     annotating     - _predict(self, X)
 
 Optional implements:
-    updating        - _update(self, X, Y=None)
+    updating        - _update(self, X, y=None)
 
 Testing - required for sktime test framework and check_estimator usage:
     get default parameters for test instance(s) - get_test_params()
@@ -30,13 +30,13 @@ Testing - required for sktime test framework and check_estimator usage:
 copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 # todo: add any necessary imports here
 
 
-class MySeriesAnnotator(BaseSeriesAnnotator):
-    """Custom series annotator.
+class MyDetector(BaseDetector):
+    """Custom time series detector for anomalies, change points, or segments.
 
     todo: write docstring, describing your custom forecaster
 
@@ -106,7 +106,7 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         #   self.clone_tags(est2, ["enforce_index_type", "handles-missing-data"])
 
     # todo: implement this, mandatory
-    def _fit(self, X, Y=None):
+    def _fit(self, X, y=None):
         """Fit to training data.
 
         core logic
@@ -114,13 +114,14 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            training data to fit model to, time series
-        Y : pd.Series, optional
-            ground truth annotations for training if annotator is supervised
+            Training data to fit model to time series.
+        y : pd.Series, optional
+            Ground truth labels for training, if detector is supervised.
 
         Returns
         -------
-        self : returns a reference to self
+        self :
+            Reference to self.
 
         State change
         ------------
@@ -138,12 +139,18 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
-        Y : pd.Series - annotations for sequence X
-            exact format depends on annotation type
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
         """
 
         # implement here
@@ -151,8 +158,8 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
 
     # todo: consider implementing this, optional
     # if not implementing, delete the _update method
-    def _update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
+    def _update(self, X, y=None):
+        """Update model with new data and optional ground truth labels.
 
         core logic
 
@@ -160,8 +167,8 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         ----------
         X : pd.DataFrame
             training data to update model with, time series
-        Y : pd.Series, optional
-            ground truth annotations for training if annotator is supervised
+        y : pd.Series, optional
+            ground truth detection labels for training, if detector is supervised
 
         Returns
         -------
diff --git a/pyproject.toml b/pyproject.toml
index 91cce55d2..d2e95bfa5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -93,7 +93,7 @@ all_extras = [
   'matplotlib!=3.9.1,>=3.3.2; python_version < "3.13"',
   'mne; python_version < "3.13"',
   'numba<0.61,>=0.53; python_version < "3.13"',
-  'optuna<4.1; python_version < "3.13"',
+  'optuna<4.2',
   'pmdarima!=1.8.1,<3.0.0,>=1.8; python_version < "3.12"',
   'polars[pandas]>=0.20,<2.0; python_version < "3.13"',
   'prophet>=1.1; python_version < "3.12"',
@@ -124,7 +124,7 @@ all_extras_pandas2 = [
   'autots<0.7,>=0.6.1; python_version < "3.13"',
   'cloudpickle; python_version < "3.13"',
   'dash!=2.9.0; python_version < "3.13"',
-  "dask<2024.10.1; extra == 'dataframe'",
+  "dask<2024.11.3; extra == 'dataframe'",
   'dtaidistance<2.4; python_version < "3.13"',
   'dtw-python; python_version < "3.13"',
   'esig==0.9.7; python_version < "3.10"',
@@ -137,7 +137,7 @@ all_extras_pandas2 = [
   'matplotlib!=3.9.1,>=3.3.2; python_version < "3.13"',
   'mne; python_version < "3.13"',
   'numba<0.61,>=0.53; python_version < "3.13"',
-  'optuna<4.1; python_version < "3.13"',
+  'optuna<4.2',
   'pmdarima!=1.8.1,<3.0.0,>=1.8; python_version < "3.12"',
   'polars[pandas]>=0.20,<2.0; python_version < "3.13"',
   'prophet>=1.1; python_version < "3.12"',
@@ -262,7 +262,7 @@ docs = [
 ]
 tests = [
   "pytest>=7.4,<8.4",
-  "pytest-randomly<3.16,>=3.15",
+  "pytest-randomly>=3.15,<3.17",
   "pytest-timeout>=2.1,<2.4",
   "pytest-xdist>=3.3,<3.7",
 ]
diff --git a/sktime/alignment/utils/utils_align.py b/sktime/alignment/utils/utils_align.py
index a0db08d78..cef8d68a4 100644
--- a/sktime/alignment/utils/utils_align.py
+++ b/sktime/alignment/utils/utils_align.py
@@ -25,8 +25,8 @@ def reindex_iloc(df, inds, copy=True):
         out of bound indices will result in np.nan values
         entries are references to original DataFrame if copy=False
 
-    Example
-    -------
+    Examples
+    --------
     >>> X = pd.DataFrame({'a' : [1,2,3,4]}, index=[-4,7,11,14])
     >>> reindex_iloc(X, [1, 2, 6])
          a
@@ -56,8 +56,8 @@ def convert_align_to_align_loc(align, X, align_name="align", df_name="X", copy=T
     pd.DataFrame in alignment format, with columns 'ind'+str(i) for integer i
         cols contain loc index of X[i] mapped to alignment coordinate for alignment
 
-    Example
-    -------
+    Examples
+    --------
     align_df = pd.DataFrame({'ind0' : [1,2,3], 'ind1' : [0,2,4]})
     X = [pd.DataFrame({'a' : [1,2,3,4]}, index=[-4,7,11,14]),
             pd.DataFrame({'a' : [1,2,3,5,6]}, index=[4,8,12,16,20])
diff --git a/sktime/annotation/adapters/_pyod.py b/sktime/annotation/adapters/_pyod.py
index 68d749ea2..f59fb5e0a 100644
--- a/sktime/annotation/adapters/_pyod.py
+++ b/sktime/annotation/adapters/_pyod.py
@@ -5,7 +5,7 @@
 import numpy as np
 from sklearn.base import clone
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 from sktime.utils.dependencies import _check_soft_dependencies
 
 __author__ = ["mloning", "satya-pattnaik", "fkiraly"]
@@ -13,7 +13,7 @@ __author__ = ["mloning", "satya-pattnaik", "fkiraly"]
 import pandas as pd
 
 
-class PyODAnnotator(BaseSeriesAnnotator):
+class PyODAnnotator(BaseDetector):
     """Transformer that applies outlier detector from pyOD.
 
     Parameters
@@ -82,7 +82,8 @@ class PyODAnnotator(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/base/__init__.py b/sktime/annotation/base/__init__.py
index 2c6052ee4..3e1f6ec31 100644
--- a/sktime/annotation/base/__init__.py
+++ b/sktime/annotation/base/__init__.py
@@ -4,4 +4,4 @@
 
 __all__ = ["BaseSeriesAnnotator"]
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base._base import BaseSeriesAnnotator
diff --git a/sktime/annotation/base/_base.py b/sktime/annotation/base/_base.py
deleted file mode 100644
index fdb02dea6..000000000
--- a/sktime/annotation/base/_base.py
+++ /dev/null
@@ -1,733 +0,0 @@
-#!/usr/bin/env python3 -u
-# copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
-"""Base class template for annotator base type for time series stream.
-
-    class name: BaseSeriesAnnotator
-
-Scitype defining methods:
-    fitting              - fit(self, X, Y=None)
-    annotating           - predict(self, X)
-    updating (temporal)  - update(self, X, Y=None)
-    update&annotate      - update_predict(self, X)
-
-Inspection methods:
-    hyper-parameter inspection  - get_params()
-    fitted parameter inspection - get_fitted_params()
-
-State:
-    fitted model/strategy   - by convention, any attributes ending in "_"
-    fitted state flag       - check_is_fitted()
-"""
-
-__author__ = ["satya-pattnaik ", "fkiraly"]
-__all__ = ["BaseSeriesAnnotator"]
-
-import numpy as np
-import pandas as pd
-
-from sktime.base import BaseEstimator
-from sktime.utils.validation.series import check_series
-
-
-class BaseSeriesAnnotator(BaseEstimator):
-    """Base series annotator.
-
-    Developers should set the task and learning_type tags in the derived class.
-
-    task : str {"segmentation", "change_point_detection", "anomaly_detection"}
-        The main annotation task:
-        * If ``segmentation``, the annotator divides timeseries into discrete chunks
-        based on certain criteria. The same label can be applied at multiple
-        disconnected regions of the timeseries.
-        * If ``change_point_detection``, the annotator finds points where the
-        statistical properties of the timeseries change significantly.
-        * If ``anomaly_detection``, the annotator finds points that differ significantly
-        from the normal statistical properties of the timeseries.
-
-    learning_type : str {"supervised", "unsupervised"}
-        Annotation learning type:
-        * If ``supervised``, the annotator learns from labelled data.
-        * If ``unsupervised``, the annotator learns from unlabelled data.
-
-    Notes
-    -----
-    Assumes "predict" data is temporal future of "fit"
-    Single time series in both, no meta-data.
-
-    The base series annotator specifies the methods and method
-    signatures that all annotators have to implement.
-
-    Specific implementations of these methods is deferred to concrete
-    annotators.
-    """
-
-    _tags = {
-        "object_type": "series-annotator",  # type of object
-        "learning_type": "None",  # Tag to determine test in test_all_annotators
-        "task": "None",  # Tag to determine test in test_all_annotators
-        #
-        # todo: distribution_type? we may have to refactor this, seems very soecufuc
-        "distribution_type": "None",  # Tag to determine test in test_all_annotators
-    }  # for unit test cases
-
-    def __init__(self):
-        self._is_fitted = False
-
-        self._X = None
-        self._Y = None
-
-        task = self.get_tag("task")
-        learning_type = self.get_tag("learning_type")
-
-        super().__init__()
-
-        self.set_tags(**{"task": task, "learning_type": learning_type})
-
-    def __rmul__(self, other):
-        """Magic * method, return (left) concatenated AnnotatorPipeline.
-
-        Implemented for ``other`` being a transformer, otherwise returns
-        ``NotImplemented``.
-
-        Parameters
-        ----------
-        other: ``sktime`` transformer, must inherit from BaseTransformer
-            otherwise, ``NotImplemented`` is returned
-
-        Returns
-        -------
-        AnnotatorPipeline object,
-            concatenation of ``other`` (first) with ``self`` (last).
-            not nested, contains only non-AnnotatorPipeline ``sktime`` steps
-        """
-        from sktime.annotation.compose import AnnotatorPipeline
-        from sktime.transformations.base import BaseTransformer
-        from sktime.transformations.series.adapt import TabularToSeriesAdaptor
-        from sktime.utils.sklearn import is_sklearn_transformer
-
-        # we wrap self in a pipeline, and concatenate with the other
-        #   the TransformedTargetForecaster does the rest, e.g., dispatch on other
-        if isinstance(other, BaseTransformer):
-            self_as_pipeline = AnnotatorPipeline(steps=[self])
-            return other * self_as_pipeline
-        elif is_sklearn_transformer(other):
-            return TabularToSeriesAdaptor(other) * self
-        else:
-            return NotImplemented
-
-    def fit(self, X, Y=None):
-        """Fit to training data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to fit model to (time series).
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Creates fitted model that updates attributes ending in "_". Sets
-        _is_fitted flag to True.
-        """
-        X = check_series(X)
-
-        if Y is not None:
-            Y = check_series(Y)
-
-        self._X = X
-        self._Y = Y
-
-        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
-
-        self._fit(X=X, Y=Y)
-
-        # this should happen last
-        self._is_fitted = True
-
-        return self
-
-    def predict(self, X):
-        """Create annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        self.check_is_fitted()
-
-        X = check_series(X)
-
-        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
-
-        Y = self._predict(X=X)
-
-        return Y
-
-    def transform(self, X):
-        """Create annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X. The returned annotations will be in the dense
-            format.
-        """
-        Y = self.predict(X)
-        return self.sparse_to_dense(Y, X.index)
-
-    def predict_scores(self, X):
-        """Return scores for predicted annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Scores for sequence X exact format depends on annotation type.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-        return self._predict_scores(X)
-
-    def update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with (time series).
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        self.check_is_fitted()
-
-        X = check_series(X)
-
-        if Y is not None:
-            Y = check_series(Y)
-
-        self._X = X.combine_first(self._X)
-
-        if Y is not None:
-            self._Y = Y.combine_first(self._Y)
-
-        self._update(X=X, Y=Y)
-
-        return self
-
-    def update_predict(self, X):
-        """Update model with new data and create annotations for it.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        X = check_series(X)
-
-        self.update(X=X)
-        Y = self.predict(X=X)
-
-        return Y
-
-    def fit_predict(self, X, Y=None):
-        """Fit to data, then predict it.
-
-        Fits model to X and Y with given annotation parameters
-        and returns the annotations made by the model.
-
-        Parameters
-        ----------
-        X : pd.DataFrame, pd.Series or np.ndarray
-            Data to be transformed
-        Y : pd.Series or np.ndarray, optional (default=None)
-            Target values of data to be predicted.
-
-        Returns
-        -------
-        self : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        # Non-optimized default implementation; override when a better
-        # method is possible for a given algorithm.
-        return self.fit(X, Y).predict(X)
-
-    def fit_transform(self, X, Y=None):
-        """Fit to data, then transform it.
-
-        Fits model to X and Y with given annotation parameters
-        and returns the annotations made by the model.
-
-        Parameters
-        ----------
-        X : pd.DataFrame, pd.Series or np.ndarray
-            Data to be transformed
-        Y : pd.Series or np.ndarray, optional (default=None)
-            Target values of data to be predicted.
-
-        Returns
-        -------
-        self : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        Y = self.fit_predict(X)
-        return self.sparse_to_dense(Y, index=X.index)
-
-    def _fit(self, X, Y=None):
-        """Fit to training data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to fit model to time series.
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        raise NotImplementedError("abstract method")
-
-    def _predict(self, X):
-        """Create annotations on test/deployment data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        raise NotImplementedError("abstract method")
-
-    def _predict_scores(self, X):
-        """Return scores for predicted annotations on test/deployment data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        raise NotImplementedError("abstract method")
-
-    def _update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with time series
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        # default/fallback: re-fit to all data
-        self._fit(self._X, self._Y)
-
-        return self
-
-    def predict_segments(self, X):
-        """Predict segments on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series with an index of intervals. Each interval is the range of a
-            segment and the corresponding value is the label of the segment.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-
-        task = self.get_tag("task")
-        if task in ["anomaly_detection", "change_point_detection"]:
-            return self.change_points_to_segments(
-                self.predict_points(X), start=X.index.min(), end=X.index.max()
-            )
-        elif task == "segmentation":
-            return self._predict_segments(X)
-
-    def predict_points(self, X):
-        """Predict changepoints/anomalies on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series whose values are the changepoints/anomalies in X.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-
-        task = self.get_tag("task")
-        if task in ["anomaly_detection", "change_point_detection"]:
-            return self._predict_points(X)
-        elif task == "segmentation":
-            return self.segments_to_change_points(self.predict_segments(X))
-
-    def _predict_segments(self, X):
-        """Predict segments on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series with an index of intervals. Each interval is the range of a
-            segment and the corresponding value is the label of the segment.
-        """
-        return self._predict(X)
-
-    def _predict_points(self, X):
-        """Predict changepoints/anomalies on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series whose values are the changepoints/anomalies in X.
-        """
-        return self._predict(X)
-
-    @staticmethod
-    def sparse_to_dense(y_sparse, index):
-        """Convert the sparse output from an annotator to a dense format.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            * If ``y_sparse`` is a series with an index of intervals, it should
-              represent segments where each value of the series is label of a segment.
-              Unclassified intervals should be labelled -1. Segments must never have
-              the label 0.
-            * If the index of ``y_sparse`` is not a set of intervals, the values of the
-              series should represent the indexes of changepoints/anomalies.
-        index : array-like
-            Indices that are to be annotated according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with an index of ``index`` is returned.
-            * If ``y_sparse`` is a series of changepoints/anomalies then the returned
-              series is labelled 0 and 1 dependendy on whether the index is associated
-              with an anomaly/changepoint. Where 1 means anomaly/changepoint.
-            * If ``y_sparse`` is a series of segments then the returned series is
-              labelled depending on the segment its indexes fall into. Indexes that
-              fall into no segments are labelled -1.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> y_sparse = pd.Series([2, 5, 7])  # Indices of changepoints/anomalies
-        >>> index = range(0, 8)
-        >>> BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
-        0    0
-        1    0
-        2    1
-        3    0
-        4    0
-        5    1
-        6    0
-        7    1
-        dtype: int64
-        >>> y_sparse = pd.Series(
-        ...     [1, 2, 1],
-        ...     index=pd.IntervalIndex.from_arrays(
-        ...         [0, 4, 6], [4, 6, 10], closed="left"
-        ...     )
-        ... )
-        >>> index = range(10)
-        >>> BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
-        0    1
-        1    1
-        2    1
-        3    1
-        4    2
-        5    2
-        6    1
-        7    1
-        8    1
-        9    1
-        dtype: int64
-        """
-        if isinstance(y_sparse.index.dtype, pd.IntervalDtype):
-            # Segmentation case
-            y_dense = BaseSeriesAnnotator._sparse_segments_to_dense(y_sparse, index)
-            return y_dense
-        else:
-            # Anomaly/changepoint detection case
-            y_dense = BaseSeriesAnnotator._sparse_points_to_dense(y_sparse, index)
-            return y_dense
-
-    @staticmethod
-    def _sparse_points_to_dense(y_sparse, index):
-        """Label the indexes in ``index`` if they are in ``y_sparse``.
-
-        Parameters
-        ----------
-        y_sparse: pd.Series
-            The values of the series must be the indexes of changepoints/anomalies.
-        index: array-like
-            Array of indexes that are to be labelled according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with an index of ``index``. Its values are 1 if the index is in
-            y_sparse and 0 otherwise.
-        """
-        y_dense = pd.Series(np.zeros(len(index)), index=index, dtype="int64")
-        y_dense[y_sparse.values] = 1
-        return y_dense
-
-    @staticmethod
-    def _sparse_segments_to_dense(y_sparse, index):
-        """Find the label for each index in ``index`` from sparse segments.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            A sparse representation of segments. The index must be the pandas interval
-            datatype and the values must be the integer labels of the segments.
-        index : array-like
-            List of indexes that are to be labelled according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with the same index as ``index`` where each index is labelled
-            according to ``y_sparse``. Indexes that do not fall within any index are
-            labelled -1.
-        """
-        if y_sparse.index.is_overlapping:
-            raise NotImplementedError(
-                "Cannot convert overlapping segments to a dense format yet."
-            )
-
-        interval_indexes = y_sparse.index.get_indexer(index)
-
-        # Negative indexes do not fall within any interval so they are ignored
-        interval_labels = y_sparse.iloc[
-            interval_indexes[interval_indexes >= 0]
-        ].to_numpy()
-
-        # -1 is used to represent points do not fall within a segment
-        labels_dense = interval_indexes.copy()
-        labels_dense[labels_dense >= 0] = interval_labels
-
-        y_dense = pd.Series(labels_dense, index=index)
-        return y_dense
-
-    @staticmethod
-    def dense_to_sparse(y_dense):
-        """Convert the dense output from an annotator to a sparse format.
-
-        Parameters
-        ----------
-        y_dense : pd.Series
-            * If ``y_sparse`` contains only 1's and 0's, the 1's represent change
-              points or anomalies.
-            * If ``y_sparse`` contains only contains integers greater than 0, it is an
-              an array of segments.
-
-        Returns
-        -------
-        pd.Series
-            * If ``y_sparse`` is a series of changepoints/anomalies, a pandas series
-              will be returned containing the indexes of the changepoints/anomalies
-            * If ``y_sparse`` is a series of segments, a series with an interval
-              datatype index will be returned. The values of the series will be the
-              labels of segments.
-        """
-        if 0 in y_dense.values:
-            # y_dense is a series of change points
-            change_points = np.where(y_dense.values != 0)[0]
-            return pd.Series(change_points)
-        else:
-            segment_start_indexes = np.where(y_dense.diff() != 0)[0]
-            segment_end_indexes = np.roll(segment_start_indexes, -1)
-
-            # The final index is always the end of a segment
-            segment_end_indexes[-1] = y_dense.index[-1]
-
-            segment_labels = y_dense.iloc[segment_start_indexes].to_numpy()
-            interval_index = pd.IntervalIndex.from_arrays(
-                segment_start_indexes, segment_end_indexes, closed="left"
-            )
-            y_sparse = pd.Series(segment_labels, index=interval_index)
-
-            # -1 represents unclassified regions so we remove them
-            y_sparse = y_sparse.loc[y_sparse != -1]
-            return y_sparse
-
-    @staticmethod
-    def change_points_to_segments(y_sparse, start=None, end=None):
-        """Convert an series of change point indexes to segments.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            A series containing the indexes of change points.
-        start : optional
-            Starting point of the first segment.
-        end : optional
-            Ending point of the last segment
-
-        Returns
-        -------
-        pd.Series
-            A series with an interval index indicating the start and end points of the
-            segments. The values of the series are the labels of the segments.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> change_points = pd.Series([1, 2, 5])
-        >>> BaseSeriesAnnotator.change_points_to_segments(change_points, 0, 7)
-        [0, 1)   -1
-        [1, 2)    1
-        [2, 5)    2
-        [5, 7)    3
-        dtype: int64
-        """
-        breaks = y_sparse.values
-
-        if start > breaks.min():
-            raise ValueError(
-                "The starting index must be before the first change point."
-            )
-        first_change_point = breaks.min()
-
-        if start is not None:
-            breaks = np.insert(breaks, 0, start)
-        if end is not None:
-            breaks = np.append(breaks, end)
-
-        index = pd.IntervalIndex.from_breaks(breaks, copy=True, closed="left")
-        segments = pd.Series(0, index=index)
-
-        in_range = index.left >= first_change_point
-
-        number_of_segments = in_range.sum()
-        segments.loc[in_range] = range(1, number_of_segments + 1)
-        segments.loc[~in_range] = -1
-
-        return segments
-
-    @staticmethod
-    def segments_to_change_points(y_sparse):
-        """Convert segments to change points.
-
-        Parameters
-        ----------
-        y_sparse : pd.DataFrame
-            A series of segments. The index must be the interval data type and the
-            values should be the integer labels of the segments.
-
-        Returns
-        -------
-        pd.Series
-            A series containing the indexes of the start of each segment.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> segments = pd.Series(
-        ...     [3, -1, 2],
-        ...     index=pd.IntervalIndex.from_breaks([2, 5, 7, 9], closed="left")
-        ... )
-        >>> BaseSeriesAnnotator.segments_to_change_points(segments)
-        0    2
-        1    5
-        2    7
-        dtype: int64
-        """
-        change_points = pd.Series(y_sparse.index.left)
-        return change_points
diff --git a/sktime/annotation/bs.py b/sktime/annotation/bs.py
index ec9b339b8..0812021a9 100644
--- a/sktime/annotation/bs.py
+++ b/sktime/annotation/bs.py
@@ -5,12 +5,12 @@ from collections import deque
 import numpy as np
 import pandas as pd
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["Alex-JG3"]
 
 
-class BinarySegmentation(BaseSeriesAnnotator):
+class BinarySegmentation(BaseDetector):
     """Binary segmentation change point detector.
 
     This method finds change points by fitting piecewise constant functions to a
diff --git a/sktime/annotation/clasp.py b/sktime/annotation/clasp.py
index cc1bb4c61..738edc329 100644
--- a/sktime/annotation/clasp.py
+++ b/sktime/annotation/clasp.py
@@ -11,7 +11,7 @@ As described in
 }
 """
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["ermshaua", "patrickzib"]
 __all__ = ["ClaSPSegmentation", "find_dominant_window_sizes"]
@@ -175,7 +175,7 @@ def _segmentation(X, clasp, n_change_points=None, exclusion_radius=0.05):
     return np.array(change_points), np.array(profiles, dtype=object), np.array(scores)
 
 
-class ClaSPSegmentation(BaseSeriesAnnotator):
+class ClaSPSegmentation(BaseDetector):
     """ClaSP (Classification Score Profile) Segmentation.
 
     Using ClaSP for the CPD problem is straightforward: We first compute the profile
@@ -253,7 +253,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -273,7 +273,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -289,7 +289,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/clust.py b/sktime/annotation/clust.py
index 76b4b7abd..abd1bbe6c 100644
--- a/sktime/annotation/clust.py
+++ b/sktime/annotation/clust.py
@@ -8,13 +8,13 @@ import pandas as pd
 from sklearn.base import clone
 from sklearn.cluster import KMeans
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["Ankit-1204"]
 __all__ = ["ClusterSegmenter"]
 
 
-class ClusterSegmenter(BaseSeriesAnnotator):
+class ClusterSegmenter(BaseDetector):
     """Cluster-based Time Series Segmentation.
 
     time series segmentation using clustering is simple task. This annotator
@@ -88,7 +88,8 @@ class ClusterSegmenter(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/compose/_as_transform.py b/sktime/annotation/compose/_as_transform.py
index 1d107ca31..1fac78c13 100644
--- a/sktime/annotation/compose/_as_transform.py
+++ b/sktime/annotation/compose/_as_transform.py
@@ -22,11 +22,11 @@ class AnnotatorAsTransformer(BaseTransformer):
     into its cluster assignment.
 
     The adapter dispatches ``BaseTransformer.transform`` to
-    ``BaseSeriesAnnotator.transform``.
+    ``BaseDetector.transform``.
 
     Parameters
     ----------
-    estimator : sktime annotator, i.e., estimator inheriting from BaseSeriesAnnotator
+    estimator : sktime annotator, i.e., estimator inheriting from BaseDetector
         this is a "blueprint" clusterer, state does not change when ``fit`` is called
 
     Attributes
diff --git a/sktime/annotation/compose/_pipeline.py b/sktime/annotation/compose/_pipeline.py
index 0fa3c43f9..78097f613 100644
--- a/sktime/annotation/compose/_pipeline.py
+++ b/sktime/annotation/compose/_pipeline.py
@@ -1,11 +1,11 @@
 """Pipeline for time series annotators."""
 
-from sktime.annotation.base import BaseSeriesAnnotator
 from sktime.base import _HeterogenousMetaEstimator
+from sktime.detection.base import BaseDetector
 from sktime.registry import scitype
 
 
-class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
+class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseDetector):
     """Pipeline for time series anomaly, changepoint detection, segmentation.
 
     Parameters
@@ -302,7 +302,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -319,7 +319,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -336,7 +336,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/ggs.py b/sktime/annotation/ggs.py
index 3a1212526..679910444 100644
--- a/sktime/annotation/ggs.py
+++ b/sktime/annotation/ggs.py
@@ -41,7 +41,7 @@ import numpy.typing as npt
 import pandas as pd
 from sklearn.utils.validation import check_random_state
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 from sktime.utils.dependencies import _check_estimator_deps
 
 logger = logging.getLogger(__name__)
@@ -367,7 +367,7 @@ class GGS:
         return change_points
 
 
-class GreedyGaussianSegmentation(BaseSeriesAnnotator):
+class GreedyGaussianSegmentation(BaseDetector):
     """Greedy Gaussian Segmentation Estimator.
 
     The method approximates solutions for the problem of breaking a
diff --git a/sktime/annotation/hmm.py b/sktime/annotation/hmm.py
index 082e78e7a..a53c5a3d2 100644
--- a/sktime/annotation/hmm.py
+++ b/sktime/annotation/hmm.py
@@ -10,13 +10,13 @@ import warnings
 import numpy as np
 from scipy.stats import norm
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["miraep8"]
 __all__ = ["HMM"]
 
 
-class HMM(BaseSeriesAnnotator):
+class HMM(BaseDetector):
     """Implements a simple HMM fitted with Viterbi algorithm.
 
     The HMM annotation estimator uses the
diff --git a/sktime/annotation/hmm_learn/base.py b/sktime/annotation/hmm_learn/base.py
index 15dae8e89..29c537ce2 100644
--- a/sktime/annotation/hmm_learn/base.py
+++ b/sktime/annotation/hmm_learn/base.py
@@ -10,13 +10,13 @@ Please see the original library
 import numpy as np
 import pandas as pd
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["miraep8"]
 __all__ = ["BaseHMMLearn"]
 
 
-class BaseHMMLearn(BaseSeriesAnnotator):
+class BaseHMMLearn(BaseDetector):
     """Base class for all HMM wrappers, handles required overlap between packages."""
 
     _tags = {
diff --git a/sktime/annotation/igts.py b/sktime/annotation/igts.py
index c64ebd9b6..9f0df5add 100644
--- a/sktime/annotation/igts.py
+++ b/sktime/annotation/igts.py
@@ -152,8 +152,8 @@ class IGTS:
     activities.", Pervasive and Mobile Computing, 38, 92-109, (2017).
     https://www.sciencedirect.com/science/article/abs/pii/S1574119217300081
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.annotation.datagen import piecewise_normal_multivariate
     >>> from sklearn.preprocessing import MinMaxScaler
     >>> X = piecewise_normal_multivariate(lengths=[10, 10, 10, 10],
diff --git a/sktime/annotation/lof.py b/sktime/annotation/lof.py
index 909b5b76f..3b3acef56 100644
--- a/sktime/annotation/lof.py
+++ b/sktime/annotation/lof.py
@@ -8,10 +8,10 @@ import math
 import pandas as pd
 from sklearn.neighbors import LocalOutlierFactor
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 
-class SubLOF(BaseSeriesAnnotator):
+class SubLOF(BaseDetector):
     """Timeseries version of local outlier factor.
 
     The LOF models are fit to windows timeseries data.
@@ -210,7 +210,7 @@ class SubLOF(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/base/_meta.py b/sktime/base/_meta.py
index d6f6abc4e..f6ad21185 100644
--- a/sktime/base/_meta.py
+++ b/sktime/base/_meta.py
@@ -726,8 +726,8 @@ def flatten(obj):
     list or tuple, tuple if obj was tuple, list otherwise
         flat iterable, containing non-list/tuple elements in obj in same order as in obj
 
-    Example
-    -------
+    Examples
+    --------
     >>> flatten([1, 2, [3, (4, 5)], 6])
     [1, 2, 3, 4, 5, 6]
     """
@@ -752,8 +752,8 @@ def unflatten(obj, template):
         has element bracketing exactly as `template`
             and elements in sequence exactly as `obj`
 
-    Example
-    -------
+    Examples
+    --------
     >>> unflatten([1, 2, 3, 4, 5, 6], [6, 3, [5, (2, 4)], 1])
     [1, 2, [3, (4, 5)], 6]
     """
diff --git a/sktime/classification/kernel_based/_arsenal.py b/sktime/classification/kernel_based/_arsenal.py
index 2021b6645..1ed36200a 100644
--- a/sktime/classification/kernel_based/_arsenal.py
+++ b/sktime/classification/kernel_based/_arsenal.py
@@ -462,12 +462,20 @@ class Arsenal(BaseClassifier):
             ``create_test_instance`` uses the first (or only) dictionary in ``params``.
         """
         if parameter_set == "results_comparison":
-            params = {"num_kernels": 20, "n_estimators": 5}
-        else:
-            params = {
-                "num_kernels": 10,
-                "n_estimators": 2,
-                "save_transformed_data": True,
-            }
-
-        return params
+            return {"num_kernels": 20, "n_estimators": 5}
+
+        params0 = {
+            "num_kernels": 10,
+            "n_estimators": 2,
+            "save_transformed_data": True,
+        }
+        params1 = {
+            "num_kernels": 23,
+            "n_estimators": 20,
+            "rocket_transform": "minirocket",
+            "max_dilations_per_kernel": 28,
+            "n_features_per_kernel": 2,
+            "contract_max_n_estimators": 113,
+            "save_transformed_data": True,
+        }
+        return [params0, params1]
diff --git a/sktime/datasets/_single_problem_loaders.py b/sktime/datasets/_single_problem_loaders.py
index 907b8f3c6..35741c506 100644
--- a/sktime/datasets/_single_problem_loaders.py
+++ b/sktime/datasets/_single_problem_loaders.py
@@ -1543,8 +1543,8 @@ def load_m5(
     - dept_id
     - date
 
-    Example
-    -------
+    Examples
+    --------
     >>> data = load_m5()
     >>> data.head()
     """
diff --git a/sktime/datatypes/_adapter/gluonts.py b/sktime/datatypes/_adapter/gluonts.py
index e89b95619..d01e2e996 100644
--- a/sktime/datatypes/_adapter/gluonts.py
+++ b/sktime/datatypes/_adapter/gluonts.py
@@ -14,7 +14,7 @@ def convert_pandas_to_listDataset(pd_dataframe: pd.DataFrame):
     gluonts.dataset.common.ListDataset
         A gluonTS ListDataset formed from `pd_dataframe`
 
-    Example
+    Examples
     --------
     >>> import pandas as pd
     >>> cols = ["instances", "timepoints"] + [f"var_{i}" for i in range(2)]
diff --git a/sktime/datatypes/_hierarchical/_check.py b/sktime/datatypes/_hierarchical/_check.py
index 32f9e7ea0..6305baa13 100644
--- a/sktime/datatypes/_hierarchical/_check.py
+++ b/sktime/datatypes/_hierarchical/_check.py
@@ -65,6 +65,45 @@ def _list_all_equal(obj):
 class HierarchicalPdMultiIndex(ScitypeHierarchical):
     """Data type: pandas.DataFrame based specification of hierarchical series.
 
+    Name: ``"pd_multiindex_hier"``
+
+    Short description:
+    a ``pandas.DataFrame``, with row multi-index,
+    last level interpreted as time, others as hierarchy, cols = variables
+
+    Long description:
+
+    The ``"pd_multiindex_hier"`` :term:`mtype` is a concrete specification
+    that implements the ``Hierarchical`` :term:`scitype`, i.e., the abstract
+    type of a hierarchically indexed collection of time series.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be a 3 or more level multi-index of type
+      ``(Index, ..., Index, t)``, where ``t`` is one of ``Int64Index``, ``RangeIndex``,
+      ``DatetimeIndex``, ``PeriodIndex`` and monotonic.
+      We call the last index the "time-like" index.
+    * hierarchy level: rows with the same non-time-like index values correspond to the
+      same hierarchy unit; rows with different non-time-like index combination
+      correspond to different hierarchy unit.
+    * hierarchy: the non-time-like indices in ``obj.index`` are interpreted as a
+      hierarchy identifying index.
+    * time index: the last element of tuples in ``obj.index`` is interpreted
+      as a time index.
+    * time points: rows of ``obj`` with the same ``"timepoints"`` index correspond
+      to the same time point; rows of ``obj`` with different ``"timepoints"`` index
+      correspond to the different time points.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+
+    Capabilities:
+
+    * can represent multivariate hierarchical series
+    * can represent unequally spaced hierarchical series
+    * can represent unequally supported hierarchical series
+    * cannot represent hierarchical series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_panel/_base.py b/sktime/datatypes/_panel/_base.py
index 58284aa90..db0d1642d 100644
--- a/sktime/datatypes/_panel/_base.py
+++ b/sktime/datatypes/_panel/_base.py
@@ -7,7 +7,39 @@ from sktime.datatypes._base import BaseDatatype
 
 
 class ScitypePanel(BaseDatatype):
-    """Panel data type. Represents a panel (flat collection) of time series.
+    r"""Panel data type. Represents a panel (flat collection) of time series.
+
+    The ``Panel`` data type is an abstract data type (= :term:`scitype`).
+
+    It represents an indexed collection of many single monotonously indexed sequences,
+    that is, an indexed collection of objects that follow the ``Series`` data type.
+
+    This including the sub-case of a panel of "time series" if the index is interpreted
+    as time.
+
+    Formally, an abstract ``Panel`` object that contains :math:`N` time series has:
+
+    * an index :math:`s_1, \dots, s_N`, with :math:`s_i` being an integer or
+      a categorical type, representing the series identifier, also called
+      "instance index" or "case index"
+    * individual time series :math:`S_i` for :math:`i = 1, \dots, N`, each being an
+      object of abstract ``Series`` type
+
+    The object :math:`S_i` is interpreted as the time series (or sequence) at
+    the instance index :math:`s_i`.
+
+    The indices :math:`s_i` are assumed distinct, but not necessarily ordered.
+
+    Concrete types implementing the ``Panel`` data type must specify:
+
+    * instances: how the different instances are represented
+    * instance names: optional, names of the instance dimensions
+    * variables: how the dimensions of the individual time series are represented
+    * variable names: optional, names of the variable dimensions
+    * time points: how time points are represented in the individual time series
+    * time index: how the time index is represented
+
+    Concrete implementations may implement only sub-cases of the full abstract type.
 
     Parameters
     ----------
diff --git a/sktime/datatypes/_panel/_check.py b/sktime/datatypes/_panel/_check.py
index b91912aa1..16cbb10a9 100644
--- a/sktime/datatypes/_panel/_check.py
+++ b/sktime/datatypes/_panel/_check.py
@@ -84,6 +84,45 @@ def _list_all_equal(obj):
 class PanelDfList(ScitypePanel):
     """Data type: list-of-pandas.DataFrame based specification of panel of time series.
 
+    Name: ``"df-list"``
+
+    Short description:
+
+    a ``list`` of ``pandas.DataFrame``,
+    with list index = instances, data frame rows = time points,
+    data frame cols = variables
+
+    Long description:
+
+    The ``"df-list"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: list`` follows the specification iff:
+
+    * structure convention: ``obj`` must be a list of ``pandas.DataFrames``.
+      Individual list elements of `obj` must follow the ``"pd.DataFrame"``
+      mtype convention for the ``"Series"`` scitype.
+    * instances: instances correspond to different list elements of ``obj``.
+    * instance index: the instance index of an instance is the list index at which
+      it is located in ``obj``. That is, the data at ``obj[i]``
+      correspond to observations of the instance with index ``i``.
+    * time points: rows of ``obj[i]`` correspond to different, distinct time points,
+      at which instance ``i`` is observed.
+    * time index: ``obj[i].index`` is interpreted as the time index for instance ``i``.
+    * variables: columns of ``obj[i]`` correspond to different variables available
+      for instance ``i``.
+    * variable names: column names ``obj[i].columns`` are the names of variables
+      available for instance ``i``.
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * can represent unequally spaced series
+    * can represent panels of unequally supported series
+    * can represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -210,6 +249,41 @@ def _check_dflist_panel(obj, return_metadata=False, var_name="obj"):
 class PanelNp3D(ScitypePanel):
     """Data type: 3D np.ndarray based specification of panel of time series.
 
+    Name: ``"numpy3D"``
+
+    Short description:
+
+    a 3D ``numpy.ndarray``,
+    with axis 0 = instances, axis 1 = variables, axis 2 = time points
+
+    Long description:
+
+    The ``"numpy3D"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: numpy.ndarray`` follows the specification iff:
+
+    * structure convention: ``obj`` must be 3D, i.e., ``obj.shape`` must have length 3.
+    * instances: instances correspond to axis 0 elements of ``obj``.
+    * instance index: the instance index is implicit and by-convention.
+      The ``i``-th element of axis 0 (for an integer ``i``) is interpreted as indicative
+      of observing instance `i`.
+    * variables: variables correspond to axis 1 elements of ``obj``.
+    * variable names: the ``"numpy3D"`` mtype cannot represent variable names.
+    * time points: time points correspond to axis 2 elements of ``obj``.
+    * time index: the time index is implicit and by-convention.
+      The ``i``-th element of axis 2 (for an integer ``i``) is interpreted
+      as an observation at the time point ``i``.
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * cannot represent unequally spaced series
+    * cannot represent panels of unequally supported series
+    * cannot represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -326,6 +400,45 @@ def _check_numpy3d_panel(obj, return_metadata=False, var_name="obj"):
 class PanelPdMultiIndex(ScitypePanel):
     """Data type: MultiIndex-ed pd.DataFrame specification of panel of time series.
 
+    Name: ``"pd-multiindex"``
+
+    Short description:
+
+    a ``pandas.DataFrame``, with row multi-index (instances, time), cols = variables
+
+    Long description:
+
+    The ``"pd-multiindex"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: pd.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be a pair multi-index of
+      type ``(Index, t)``, where ``t`` is one of ``Int64Index``, ``RangeIndex``,
+      ``DatetimeIndex``, ``PeriodIndex`` and monotonic.
+      ``obj.index`` must have two levels (can be named or not).
+    * instance index: the first element of pairs in ``obj.index`` (0-th level value)
+      is interpreted as an instance index, we call it "instance index" below.
+    * instances: rows with the same "instance index" index value correspond to the same
+      instance; rows with different "instance index" values correspond
+      to different instances.
+    * time index: the second element of pairs in ``obj.index`` (1-st level value)
+      is interpreted as a time index, we call it "time index" below.
+    * time points: rows of ``obj`` with the same "time index" value correspond
+      correspond to the same time point; rows of `obj` with different "time index"
+      index correspond correspond to the different time points.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * can represent unequally spaced series
+    * can represent panels of unequally supported series
+    * cannot represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_series/_base.py b/sktime/datatypes/_series/_base.py
index dd5aca899..4469a6e3d 100644
--- a/sktime/datatypes/_series/_base.py
+++ b/sktime/datatypes/_series/_base.py
@@ -7,7 +7,35 @@ from sktime.datatypes._base import BaseDatatype
 
 
 class ScitypeSeries(BaseDatatype):
-    """Series data type. Represents a single time series.
+    r"""Series data type. Represents a single time series.
+
+    The ``Series`` data type is an abstract data type (= :term:`scitype`).
+
+    It represents a single monotonously indexed sequence, including the sub-case of
+    "time series" if the index is interpreted as time.
+
+    Formally, an abstract ``Series`` object has:
+
+    * an index :math:`t_1, \dots, t_T`, with :math:`t_i` being an integer or
+      an orderable datetime-like type, representing the time point (or index)
+    * values :math:`y_1, \dots, y_T`, with :math:`y_i`, taking values in
+      an abstract typed data frame row domain :math:`\mathcal{Y}`,
+      i.e., vectors with entries being numbers
+      (float, integer) or categorical, always the same type at the same entry
+
+    The value :math:`y_i` is interpreted to be "observed at time point" :math:`t_i`.
+
+    The indices are assumed distinct and ordered, i.e., `:math:t_{i-1} < t_i`
+    for all :math:`i`.
+
+    Concrete types implementing the ``Series`` data type must specify:
+
+    * variables: how the dimensions of :math:`\mathcal{Y}` are represented
+    * variable names: optional, names of the variable dimensions
+    * time points: how the value "observed at" a given time point is represented
+    * time index: how the time index is represented
+
+    Concrete implementations may implement only sub-cases of the full abstract type.
 
     Parameters
     ----------
diff --git a/sktime/datatypes/_series/_check.py b/sktime/datatypes/_series/_check.py
index 2bc13c312..101129a21 100644
--- a/sktime/datatypes/_series/_check.py
+++ b/sktime/datatypes/_series/_check.py
@@ -57,6 +57,34 @@ FREQ_SET_CHECK = False
 class SeriesPdDataFrame(ScitypeSeries):
     """Data type: pandas.DataFrame based specification of single time series.
 
+    Name: ``"pd.DataFrame"``
+
+    Short description:
+
+    a uni- or multivariate ``pandas.DataFrame``,
+    with rows = time points, cols = variables
+
+    Long description:
+
+    The ``"pd.DataFrame"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be monotonic,
+      and one of ``Int64Index``, ``RangeIndex``, ``DatetimeIndex``, ``PeriodIndex``.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+    * time points: rows of ``obj`` correspond to different, distinct time points
+    * time index: ``obj.index`` is interpreted as the time index.
+
+    Capabilities:
+
+    * cannot represent multivariate series
+    * can represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -186,6 +214,36 @@ def _check_pddataframe_series(obj, return_metadata=False, var_name="obj"):
 class SeriesPdSeries(ScitypeSeries):
     """Data type: pandas.Series based specification of single time series.
 
+    Name: ``"pd.Series"``
+
+    Short description:
+
+    a (univariate) ``pandas.Series``,
+    with entries corresponding to different time points
+
+    Long description:
+
+    The ``"pd.Series"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: pandas.Series`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be monotonic,
+      and one of ``Int64Index``, ``RangeIndex``, ``DatetimeIndex``, ``PeriodIndex``.
+    * variables: there is a single variable, corresponding to the values of ``obj``.
+      Only univariate series can be represented.
+    * variable names: by default, there is no column name.
+      If needed, a variable name can be provided as ``obj.name``.
+    * time points: entries of ``obj`` correspond to different, distinct time points
+    * time index: ``obj.index`` is interpreted as a time index.
+
+    Capabilities:
+
+    * cannot represent multivariate series
+    * can represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -300,6 +358,36 @@ class SeriesPdSeries(ScitypeSeries):
 class SeriesNp2D(ScitypeSeries):
     """Data type: 2D np.ndarray based specification of single time series.
 
+    Name: ``"np.ndarray"``
+
+    Short description:
+
+    a 2D ``numpy.ndarray``, with rows = time points, cols = variables
+
+    Long description:
+
+    The ``"np.ndarray"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: numpy.ndarray`` follows the specification iff:
+
+    * structure convention: ``obj`` must be 2D, i.e., ``obj.shape`` must have length 2.
+      This is also true for univariate time series.
+    * variables: variables correspond to columns of ``obj``.
+    * variable names: the ``"np.ndarray"`` mtype cannot represent variable names.
+    * time points: the rows of ``obj`` correspond to different, distinct time points.
+    * time index: The time index is implicit and by-convention.
+      The ``i``-th row (for an integer ``i``) is interpreted as an observation
+      at the time point ``i``. That is, the index is always interpreted as zero-indexed
+      integer.
+
+    Capabilities:
+
+    * can represent multivariate series
+    * cannot represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_table/_base.py b/sktime/datatypes/_table/_base.py
index 0c12cfa7c..4742704e1 100644
--- a/sktime/datatypes/_table/_base.py
+++ b/sktime/datatypes/_table/_base.py
@@ -6,8 +6,8 @@ __author__ = ["fkiraly"]
 from sktime.datatypes._base import BaseDatatype
 
 
-class BaseTable(BaseDatatype):
-    """Base class for Table data types.
+class ScitypeTable(BaseDatatype):
+    """Data Frame or Table data type.
 
     Parameters
     ----------
diff --git a/sktime/datatypes/_table/_check.py b/sktime/datatypes/_table/_check.py
index a6e7c7872..4517e7338 100644
--- a/sktime/datatypes/_table/_check.py
+++ b/sktime/datatypes/_table/_check.py
@@ -39,12 +39,12 @@ import pandas as pd
 
 from sktime.datatypes._base._common import _req, _ret
 from sktime.datatypes._dtypekind import _get_feature_kind, _get_table_dtypekind
-from sktime.datatypes._table._base import BaseTable
+from sktime.datatypes._table._base import ScitypeTable
 
 PRIMITIVE_TYPES = (float, int, str)
 
 
-class TablePdDataFrame(BaseTable):
+class TablePdDataFrame(ScitypeTable):
     """Data type: pandas.DataFrame based specification of data frame table.
 
     Parameters are inferred by check.
@@ -138,7 +138,7 @@ def _check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-class TablePdSeries(BaseTable):
+class TablePdSeries(ScitypeTable):
     """Data type: pandas.Series based specification of data frame table.
 
     Parameters are inferred by check.
@@ -237,7 +237,7 @@ def _check_pdseries_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-class TableNp1D(BaseTable):
+class TableNp1D(ScitypeTable):
     """Data type: 1D np.ndarray based specification of data frame table.
 
     Parameters are inferred by check.
@@ -336,7 +336,7 @@ def _check_numpy1d_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-class TableNp2D(BaseTable):
+class TableNp2D(ScitypeTable):
     """Data type: 2D np.ndarray based specification of data frame table.
 
     Parameters are inferred by check.
@@ -434,7 +434,7 @@ def _check_numpy2d_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-class TableListOfDict(BaseTable):
+class TableListOfDict(ScitypeTable):
     """Data type: list of dict based specification of data frame table.
 
     Parameters are inferred by check.
@@ -555,7 +555,7 @@ def _check_list_of_dict_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-class TablePolarsEager(BaseTable):
+class TablePolarsEager(ScitypeTable):
     """Data type: eager polars DataFrame based specification of data frame table.
 
     Parameters are inferred by check.
@@ -620,7 +620,7 @@ class TablePolarsEager(BaseTable):
         return check_polars_frame(obj, return_metadata, var_name, lazy=False)
 
 
-class TablePolarsLazy(BaseTable):
+class TablePolarsLazy(ScitypeTable):
     """Data type: lazy polars DataFrame based specification of data frame table.
 
     Parameters are inferred by check.
diff --git a/sktime/detection/base/__init__.py b/sktime/detection/base/__init__.py
index 220fa717e..f38ab92b3 100644
--- a/sktime/detection/base/__init__.py
+++ b/sktime/detection/base/__init__.py
@@ -2,6 +2,6 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """Implements base classes for detection tasks in sktime."""
 
-__all__ = ["BaseSeriesAnnotator"]
+__all__ = ["BaseDetector", "BaseSeriesAnnotator"]
 
-from sktime.detection.base._base import BaseSeriesAnnotator
+from sktime.detection.base._base import BaseDetector, BaseSeriesAnnotator
diff --git a/sktime/detection/base/_base.py b/sktime/detection/base/_base.py
index c063e1e52..c18f1d3f2 100644
--- a/sktime/detection/base/_base.py
+++ b/sktime/detection/base/_base.py
@@ -1,6 +1,907 @@
 #!/usr/bin/env python3 -u
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
+"""Base class template for detector base type for time series streams.
 
-__all__ = ["BaseSeriesAnnotator"]
+    class name: BaseDetector
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+Scitype defining methods:
+    fitting              - fit(self, X, y=None)
+    annotating           - predict(self, X)
+    updating (temporal)  - update(self, X, y=None)
+    update&annotate      - update_predict(self, X, y=None)
+
+Inspection methods:
+    hyper-parameter inspection  - get_params()
+    fitted parameter inspection - get_fitted_params()
+
+State:
+    fitted model/strategy   - by convention, any attributes ending in "_"
+    fitted state flag       - check_is_fitted()
+"""
+
+# todo 0.37.0: remove BaseSeriesAnnotator
+__author__ = ["fkiraly", "tveten", "alex-jg3", "satya-pattnaik"]
+__all__ = ["BaseDetector", "BaseSeriesAnnotator"]
+
+import numpy as np
+import pandas as pd
+
+from sktime.base import BaseEstimator
+from sktime.utils.validation.series import check_series
+from sktime.utils.warnings import warn
+
+
+class BaseDetector(BaseEstimator):
+    """Base class for time series detectors.
+
+    Developers should set the task and learning_type tags in the derived class.
+
+    task : str {"segmentation", "change_point_detection", "anomaly_detection"}
+        The main detection task:
+
+        * If ``segmentation``, the detector divides timeseries into discrete chunks
+        based on certain criteria. The same label can be applied at multiple
+        disconnected regions of the timeseries.
+        * If ``change_point_detection``, the detector finds points where the
+        statistical properties of the timeseries change significantly.
+        * If ``anomaly_detection``, the detector finds points that differ significantly
+        from the normal statistical properties of the timeseries.
+
+    learning_type : str {"supervised", "unsupervised"}
+        Detection learning type:
+
+        * If ``supervised``, the detector learns from labelled data.
+        * If ``unsupervised``, the detector learns from unlabelled data.
+
+    Notes
+    -----
+    Assumes "predict" data is temporal future of "fit"
+    Single time series in both, no meta-data.
+
+    The base series detector specifies the methods and method
+    signatures that all detectors have to implement.
+
+    Specific implementations of these methods is deferred to concrete detectors.
+    """
+
+    _tags = {
+        # todo 0.37.0 switch order of series-annotator and detector
+        # todo 1.0.0 - remove series-annotator
+        "object_type": ["series-annotator", "detector"],  # type of object
+        "learning_type": "None",  # Tag to determine test in test_all_annotators
+        "task": "None",  # Tag to determine test in test_all_annotators
+        #
+        # todo: distribution_type? we may have to refactor this, seems very soecufuc
+        "distribution_type": "None",  # Tag to determine test in test_all_annotators
+        "X_inner_mtype": "pd.DataFrame",  # Tag to determine test in test_all_annotators
+    }
+
+    def __init__(self):
+        self._is_fitted = False
+
+        self._X = None
+        self._Y = None
+
+        task = self.get_tag("task")
+        learning_type = self.get_tag("learning_type")
+
+        super().__init__()
+
+        self.set_tags(**{"task": task, "learning_type": learning_type})
+
+    def __rmul__(self, other):
+        """Magic * method, return (left) concatenated AnnotatorPipeline.
+
+        Implemented for ``other`` being a transformer, otherwise returns
+        ``NotImplemented``.
+
+        Parameters
+        ----------
+        other: ``sktime`` transformer, must inherit from BaseTransformer
+            otherwise, ``NotImplemented`` is returned
+
+        Returns
+        -------
+        AnnotatorPipeline object,
+            concatenation of ``other`` (first) with ``self`` (last).
+            not nested, contains only non-AnnotatorPipeline ``sktime`` steps
+        """
+        from sktime.annotation.compose import AnnotatorPipeline
+        from sktime.transformations.base import BaseTransformer
+        from sktime.transformations.series.adapt import TabularToSeriesAdaptor
+        from sktime.utils.sklearn import is_sklearn_transformer
+
+        # we wrap self in a pipeline, and concatenate with the other
+        #   the TransformedTargetForecaster does the rest, e.g., dispatch on other
+        if isinstance(other, BaseTransformer):
+            self_as_pipeline = AnnotatorPipeline(steps=[self])
+            return other * self_as_pipeline
+        elif is_sklearn_transformer(other):
+            return TabularToSeriesAdaptor(other) * self
+        else:
+            return NotImplemented
+
+    # todo 0.37.0: remove the Y parameter and related handling
+    def fit(self, X, y=None, Y=None):
+        """Fit to training data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to fit model to (time series).
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Creates fitted model that updates attributes ending in "_". Sets
+        _is_fitted flag to True.
+        """
+        X_inner = self._check_X(X)
+
+        if Y is not None:
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                "Until the 0.37.0 release, the Y parameter will be used if "
+                "no y parameter is provided, ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+
+        if Y is not None and y is None:
+            y = Y
+
+        self._X = X
+        self._y = y
+
+        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
+
+        if _method_has_arg(self._fit, "y"):
+            self._fit(X=X, y=y)
+        elif _method_has_arg(self._fit, "Y"):
+            self._fit(X=X, Y=y)
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                f"The class {self.__class__.__name__} uses the Y parameter "
+                "internally in _fit, this should be replaced with y by a maintainer. "
+                f"Until the 0.37.0 release, this will raise no exceptions, "
+                "ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+        else:
+            self._fit(X=X_inner)
+
+        # this should happen last
+        self._is_fitted = True
+
+        return self
+
+    def predict(self, X):
+        """Create labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
+
+        y = self._predict(X=X_inner)
+
+        return y
+
+    def transform(self, X):
+        """Create labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.DataFrame with same index as X
+            Labels for sequence ``X``.
+
+            * If ``task`` is ``"anomaly_detection"``, the values are integer labels.
+              A value of 0 indicatesthat ``X``, at the same time index, has no anomaly.
+              Other values indicate an anomaly.
+              Most detectors will return 0 or 1, but some may return more values,
+              if they can detect different types of anomalies.
+              indicating whether ``X``, at the same
+              index, is an anomaly, 0 for no, 1 for yes.
+            * If ``task`` is ``"changepoint_detection"``, the values are integer labels,
+              indicating labels for segments between changepoints.
+              Possible labels are integers starting from 0.
+            * If ``task`` is "segmentation", the values are integer labels of the
+              segments. Possible labels are integers starting from 0.
+        """
+        y = self.predict(X)
+        return self.sparse_to_dense(y, X.index)
+
+    def transform_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to label (time series).
+
+        Returns
+        -------
+        scores : pd.DataFrame with same index as X
+            Scores for sequence ``X``.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        return self._transform_scores(X_inner)
+
+    def predict_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to label (time series).
+
+        Returns
+        -------
+        scores : pd.DataFrame with same index as return of predict
+            Scores for prediction of sequence ``X``.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        return self._predict_scores(X_inner)
+
+    def update(self, X, y=None, Y=None):
+        """Update model with new data and optional ground truth labels.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to update model with (time series).
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        if Y is not None:
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                "Until the 0.37.0 release, the Y parameter will be used if "
+                "no y parameter is provided, ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+
+        if y is None and Y is not None:
+            y = Y
+
+        self._X = X_inner.combine_first(self._X)
+
+        if y is not None:
+            self._y = y.combine_first(self._y)
+
+        if _method_has_arg(self._update, "y"):
+            self._update(X=X_inner, y=y)
+        elif _method_has_arg(self._update, "Y"):
+            self._update(X=X_inner, Y=y)
+        else:
+            self._update(X=X_inner)
+
+        return self
+
+    def update_predict(self, X, y=None):
+        """Update model with new data and create labels for it.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to update model with, time series.
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        X_inner = self._check_X(X)
+
+        self.update(X=X, y=y)
+        y = self.predict(X=X_inner)
+
+        return y
+
+    # todo 0.37.0: remove Y argument
+    def fit_predict(self, X, y=None, Y=None):
+        """Fit to data, then predict it.
+
+        Fits model to X and Y with given detection parameters
+        and returns the detection labels produced by the model.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+        y : pd.Series or np.ndarray, optional (default=None)
+            Target values of data to be predicted.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
+        """
+        # Non-optimized default implementation; override when a better
+        # method is possible for a given algorithm.
+        return self.fit(X, y=y, Y=Y).predict(X)
+
+    # todo 0.37.0: remove Y argument
+    def fit_transform(self, X, y=None, Y=None):
+        """Fit to data, then transform it.
+
+        Fits model to X and Y with given detection parameters
+        and returns the detection labels made by the model.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+        Y : pd.Series or np.ndarray, optional (default=None)
+            Target values of data to be predicted.
+
+        Returns
+        -------
+        y : pd.DataFrame with same index as X
+            Labels for sequence ``X``.
+
+            * If ``task`` is ``"anomaly_detection"``, the values are integer labels.
+              A value of 0 indicatesthat ``X``, at the same time index, has no anomaly.
+              Other values indicate an anomaly.
+              Most detectors will return 0 or 1, but some may return more values,
+              if they can detect different types of anomalies.
+              indicating whether ``X``, at the same
+              index, is an anomaly, 0 for no, 1 for yes.
+            * If ``task`` is ``"changepoint_detection"``, the values are integer labels,
+              indicating labels for segments between changepoints.
+              Possible labels are integers starting from 0.
+            * If ``task`` is "segmentation", the values are integer labels of the
+              segments. Possible labels are integers starting from 0.
+        """
+        y = self.fit_predict(X, y=y, Y=Y)
+        return self.sparse_to_dense(y, index=X.index)
+
+    def _check_X(self, X):
+        """Check input data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+
+        Returns
+        -------
+        X : X_inner_mtype
+            Data to be transformed
+        """
+        return X
+        # this causes errors, we need to investigate
+        # X_inner_mtype = self.get_tag("X_inner_mtype")
+        # X_inner = convert_to(X, X_inner_mtype)
+        # return X_inner
+
+    def _fit(self, X, y=None):
+        """Fit to training data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Training data to fit model to time series.
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        raise NotImplementedError("abstract method")
+
+    def _predict(self, X):
+        """Create labels on test/deployment data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+        """
+        raise NotImplementedError("abstract method")
+
+    def _predict_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+        """
+        raise NotImplementedError("abstract method")
+
+    def _update(self, X, y=None):
+        """Update model with new data and optional ground truth labels.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Training data to update model with time series
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        # default/fallback: re-fit to all data
+        self._fit(self._X, self._y)
+
+        return self
+
+    def predict_segments(self, X):
+        """Predict segments on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with IntervalIndex
+            A series with an index of intervals. Each interval is the range of a
+            segment and the corresponding value is the label of the segment.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the intervals are intervals between changepoints/anomalies, and
+              the labels are consecutive integers starting from 0.
+            * If ``task`` is "segmentation", the values are segmentation labels.
+        """
+        self.check_is_fitted()
+        X = check_series(X)
+
+        task = self.get_tag("task")
+        if task in ["anomaly_detection", "change_point_detection"]:
+            return self.change_points_to_segments(
+                self.predict_points(X), start=X.index.min(), end=X.index.max()
+            )
+        elif task == "segmentation":
+            return self._predict_segments(X)
+
+    def predict_points(self, X):
+        """Predict changepoints/anomalies on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are consecutive
+              segment boundaries.
+        """
+        self.check_is_fitted()
+        X = check_series(X)
+
+        task = self.get_tag("task")
+        if task in ["anomaly_detection", "change_point_detection"]:
+            return self._predict_points(X)
+        elif task == "segmentation":
+            return self.segments_to_change_points(self.predict_segments(X))
+
+    def _predict_segments(self, X):
+        """Predict segments on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            A series with an index of intervals. Each interval is the range of a
+            segment and the corresponding value is the label of the segment.
+        """
+        return self._predict(X)
+
+    def _predict_points(self, X):
+        """Predict changepoints/anomalies on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            A series whose values are the changepoints/anomalies in X.
+        """
+        return self._predict(X)
+
+    @staticmethod
+    def sparse_to_dense(y_sparse, index):
+        """Convert the sparse output from an detector to a dense format.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            * If ``y_sparse`` is a series with an index of intervals, it should
+              represent segments where each value of the series is label of a segment.
+              Unclassified intervals should be labelled -1. Segments must never have
+              the label 0.
+            * If the index of ``y_sparse`` is not a set of intervals, the values of the
+              series should represent the indexes of changepoints/anomalies.
+        index : array-like
+            Indices that are to be annotated according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with an index of ``index`` is returned.
+            * If ``y_sparse`` is a series of changepoints/anomalies then the returned
+              series is labelled 0 and 1 dependendy on whether the index is associated
+              with an anomaly/changepoint. Where 1 means anomaly/changepoint.
+            * If ``y_sparse`` is a series of segments then the returned series is
+              labelled depending on the segment its indexes fall into. Indexes that
+              fall into no segments are labelled -1.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> y_sparse = pd.Series([2, 5, 7])  # Indices of changepoints/anomalies
+        >>> index = range(0, 8)
+        >>> BaseDetector.sparse_to_dense(y_sparse, index=index)
+        0    0
+        1    0
+        2    1
+        3    0
+        4    0
+        5    1
+        6    0
+        7    1
+        dtype: int64
+        >>> y_sparse = pd.Series(
+        ...     [1, 2, 1],
+        ...     index=pd.IntervalIndex.from_arrays(
+        ...         [0, 4, 6], [4, 6, 10], closed="left"
+        ...     )
+        ... )
+        >>> index = range(10)
+        >>> BaseDetector.sparse_to_dense(y_sparse, index=index)
+        0    1
+        1    1
+        2    1
+        3    1
+        4    2
+        5    2
+        6    1
+        7    1
+        8    1
+        9    1
+        dtype: int64
+        """
+        if isinstance(y_sparse.index.dtype, pd.IntervalDtype):
+            # Segmentation case
+            y_dense = BaseDetector._sparse_segments_to_dense(y_sparse, index)
+            return y_dense
+        else:
+            # Anomaly/changepoint detection case
+            y_dense = BaseDetector._sparse_points_to_dense(y_sparse, index)
+            return y_dense
+
+    @staticmethod
+    def _sparse_points_to_dense(y_sparse, index):
+        """Label the indexes in ``index`` if they are in ``y_sparse``.
+
+        Parameters
+        ----------
+        y_sparse: pd.Series
+            The values of the series must be the indexes of changepoints/anomalies.
+        index: array-like
+            Array of indexes that are to be labelled according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with an index of ``index``. Its values are 1 if the index is in
+            y_sparse and 0 otherwise.
+        """
+        y_dense = pd.Series(np.zeros(len(index)), index=index, dtype="int64")
+        y_dense[y_sparse.values] = 1
+        return y_dense
+
+    @staticmethod
+    def _sparse_segments_to_dense(y_sparse, index):
+        """Find the label for each index in ``index`` from sparse segments.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            A sparse representation of segments. The index must be the pandas interval
+            datatype and the values must be the integer labels of the segments.
+        index : array-like
+            List of indexes that are to be labelled according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with the same index as ``index`` where each index is labelled
+            according to ``y_sparse``. Indexes that do not fall within any index are
+            labelled -1.
+        """
+        if y_sparse.index.is_overlapping:
+            raise NotImplementedError(
+                "Cannot convert overlapping segments to a dense format yet."
+            )
+
+        interval_indexes = y_sparse.index.get_indexer(index)
+
+        # Negative indexes do not fall within any interval so they are ignored
+        interval_labels = y_sparse.iloc[
+            interval_indexes[interval_indexes >= 0]
+        ].to_numpy()
+
+        # -1 is used to represent points do not fall within a segment
+        labels_dense = interval_indexes.copy()
+        labels_dense[labels_dense >= 0] = interval_labels
+
+        y_dense = pd.Series(labels_dense, index=index)
+        return y_dense
+
+    @staticmethod
+    def dense_to_sparse(y_dense):
+        """Convert the dense output from an detector to a sparse format.
+
+        Parameters
+        ----------
+        y_dense : pd.Series
+            * If ``y_sparse`` contains only 1's and 0's, the 1's represent change
+              points or anomalies.
+            * If ``y_sparse`` contains only contains integers greater than 0, it is an
+              an array of segments.
+
+        Returns
+        -------
+        pd.Series
+            * If ``y_sparse`` is a series of changepoints/anomalies, a pandas series
+              will be returned containing the indexes of the changepoints/anomalies
+            * If ``y_sparse`` is a series of segments, a series with an interval
+              datatype index will be returned. The values of the series will be the
+              labels of segments.
+        """
+        if 0 in y_dense.values:
+            # y_dense is a series of change points
+            change_points = np.where(y_dense.values != 0)[0]
+            return pd.Series(change_points)
+        else:
+            segment_start_indexes = np.where(y_dense.diff() != 0)[0]
+            segment_end_indexes = np.roll(segment_start_indexes, -1)
+
+            # The final index is always the end of a segment
+            segment_end_indexes[-1] = y_dense.index[-1]
+
+            segment_labels = y_dense.iloc[segment_start_indexes].to_numpy()
+            interval_index = pd.IntervalIndex.from_arrays(
+                segment_start_indexes, segment_end_indexes, closed="left"
+            )
+            y_sparse = pd.Series(segment_labels, index=interval_index)
+
+            # -1 represents unclassified regions so we remove them
+            y_sparse = y_sparse.loc[y_sparse != -1]
+            return y_sparse
+
+    @staticmethod
+    def change_points_to_segments(y_sparse, start=None, end=None):
+        """Convert an series of change point indexes to segments.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            A series containing the indexes of change points.
+        start : optional
+            Starting point of the first segment.
+        end : optional
+            Ending point of the last segment
+
+        Returns
+        -------
+        pd.Series
+            A series with an interval index indicating the start and end points of the
+            segments. The values of the series are the labels of the segments.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> change_points = pd.Series([1, 2, 5])
+        >>> BaseDetector.change_points_to_segments(change_points, 0, 7)
+        [0, 1)   -1
+        [1, 2)    1
+        [2, 5)    2
+        [5, 7)    3
+        dtype: int64
+        """
+        breaks = y_sparse.values
+
+        if start > breaks.min():
+            raise ValueError(
+                "The starting index must be before the first change point."
+            )
+        first_change_point = breaks.min()
+
+        if start is not None:
+            breaks = np.insert(breaks, 0, start)
+        if end is not None:
+            breaks = np.append(breaks, end)
+
+        index = pd.IntervalIndex.from_breaks(breaks, copy=True, closed="left")
+        segments = pd.Series(0, index=index)
+
+        in_range = index.left >= first_change_point
+
+        number_of_segments = in_range.sum()
+        segments.loc[in_range] = range(1, number_of_segments + 1)
+        segments.loc[~in_range] = -1
+
+        return segments
+
+    @staticmethod
+    def segments_to_change_points(y_sparse):
+        """Convert segments to change points.
+
+        Parameters
+        ----------
+        y_sparse : pd.DataFrame
+            A series of segments. The index must be the interval data type and the
+            values should be the integer labels of the segments.
+
+        Returns
+        -------
+        pd.Series
+            A series containing the indexes of the start of each segment.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> segments = pd.Series(
+        ...     [3, -1, 2],
+        ...     index=pd.IntervalIndex.from_breaks([2, 5, 7, 9], closed="left")
+        ... )
+        >>> BaseDetector.segments_to_change_points(segments)
+        0    2
+        1    5
+        2    7
+        dtype: int64
+        """
+        change_points = pd.Series(y_sparse.index.left)
+        return change_points
+
+
+class BaseSeriesAnnotator(BaseDetector):
+    """Base class for time series detectors - DEPRECATED - use BaseDetector instead."""
+
+    def __init__(self):
+        super().__init__()
+        warn(
+            "Warning: BaseSeriesAnnotator is deprecated. "
+            "Extension developers should use BaseDetector instead, "
+            "from sktime.detection.base, this is a replacement with "
+            "equivalent functionality. "
+            "The BaseSeriesAnnotator will be removed in the 0.37.0 release.",
+            stacklevel=2,
+        )
+
+
+# todo 0.37.0: remove this
+def _method_has_arg(method, arg="y"):
+    """Return if transformer.method has a parameter, and whether it has a default.
+
+    Parameters
+    ----------
+    method : callable
+        method to check
+    arg : str, optional, default="y"
+        parameter name to check
+
+    Returns
+    -------
+    has_param : bool
+        whether the method ``method`` has a parameter with name ``arg``
+    """
+    from inspect import signature
+
+    method_params = list(signature(method).parameters.keys())
+    return arg in method_params
diff --git a/sktime/forecasting/boxcox_bias_adjusted_forecaster.py b/sktime/forecasting/boxcox_bias_adjusted_forecaster.py
new file mode 100644
index 000000000..1efd30565
--- /dev/null
+++ b/sktime/forecasting/boxcox_bias_adjusted_forecaster.py
@@ -0,0 +1,223 @@
+# copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
+
+"""BoxCoxBiasAdjustedForecaster implementation."""
+
+__author__ = ["sanskarmodi8"]
+
+import pandas as pd
+from scipy.special import inv_boxcox
+
+from sktime.forecasting.base import BaseForecaster
+from sktime.forecasting.base._delegate import _DelegatedForecaster
+from sktime.transformations.series.boxcox import BoxCoxTransformer
+
+
+class BoxCoxBiasAdjustedForecaster(BaseForecaster):
+    r"""Box-Cox Bias-Adjusted Forecaster.
+
+    This module implements a forecaster that applies Box-Cox transformation
+    and bias adjustment to the predictions of a wrapped forecaster.
+
+    The bias adjustment is applied to both point predictions and prediction
+    intervals using the bias correction formula for inverse Box-Cox transforms:
+
+    .. math::
+
+        y_t = \text{inv\_boxcox}(w_t, \lambda) \cdot [1 + \sigma_t^2(1-\lambda)/
+        (2(\lambda w_t + 1)^2)]
+
+    where:
+    - :math:`y_t` is the back-transformed forecast at time t
+    - :math:`w_t` is the transformed data at time t
+    - :math:`\lambda` is the Box-Cox parameter
+    - :math:`\sigma_t^2` is the forecast variance on the transformed scale at time t
+
+    Parameters
+    ----------
+    forecaster : BaseForecaster
+        The wrapped forecaster to which Box-Cox transformation and
+        bias adjustment will be applied.
+    lambda_fixed : float, optional (default=None)
+        The Box-Cox transformation parameter. If None, it will be estimated.
+
+    Notes
+    -----
+    This forecaster applies only to univariate, non-hierarchical inner forecasters.
+
+    References
+    ----------
+    .. [1] Hyndman, R.J., & Athanasopoulos, G. (2018) "Forecasting:
+           principles and practice", 2nd edition, Section 2.7 - Box-Cox Transformations,
+           OTexts: Melbourne, Australia. OTexts.com/fpp2
+    """
+
+    _tags = {
+        "capability:pred_int": True,
+        "capability:pred_var": True,
+    }
+
+    def __init__(self, forecaster, lambda_fixed=None):
+        self.forecaster = forecaster
+        self.lambda_fixed = lambda_fixed
+        self.boxcox_transformer_ = None
+        _DelegatedForecaster._set_delegated_tags(self, forecaster)
+        super().__init__()
+
+    def _get_delegate(self):
+        """Return the delegate forecaster."""
+        return self.forecaster
+
+    def _fit(self, y, X=None, fh=None):
+        """Fit the forecaster to the training data.
+
+        Parameters
+        ----------
+        y : pd.Series
+            Target time series to which to fit the forecaster.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous variables.
+        fh : ForecastingHorizon
+            The forecasting horizon with the steps ahead to predict.
+
+        Returns
+        -------
+        self : returns an instance of self.
+        """
+        self.boxcox_transformer_ = BoxCoxTransformer(lambda_fixed=self.lambda_fixed)
+        y_transformed = self.boxcox_transformer_.fit_transform(y)
+
+        self.forecaster_ = self.forecaster.clone()
+        self.forecaster_.fit(y=y_transformed, X=X, fh=fh)
+
+        if not self.forecaster_.get_tag("capability:pred_int"):
+            raise ValueError(
+                "The wrapped forecaster must support prediction intervals "
+                "(capability:pred_int) to enable bias adjustment."
+            )
+
+        return self
+
+    def _predict(self, fh, X=None):
+        """Forecast time series at future horizon.
+
+        Parameters
+        ----------
+        fh : ForecastingHorizon
+            The forecasting horizon with the steps ahead to predict.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous variables.
+
+        Returns
+        -------
+        y_pred : pd.Series
+            Bias-adjusted point predictions.
+        """
+        y_pred_transformed = self.forecaster_.predict(fh, X)
+        variance = self.forecaster_.predict_var(fh, X)
+
+        y_pred = self._apply_bias_adjustment(y_pred_transformed, variance)
+
+        return y_pred
+
+    def _predict_interval(self, fh, X=None, coverage=None):
+        """Compute prediction intervals for the forecasts.
+
+        Parameters
+        ----------
+        fh : ForecastingHorizon
+            The forecasting horizon with the steps ahead to predict.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous variables.
+        coverage : list of float, optional (default=None)
+            Confidence levels for prediction intervals.
+
+        Returns
+        -------
+        pred_int : pd.DataFrame
+            Prediction intervals.
+        """
+        pred_int_transformed = self.forecaster_.predict_interval(fh, X, coverage)
+        columns = pred_int_transformed.columns
+        variance = self.forecaster_.predict_var(fh, X).squeeze()
+
+        result = pd.DataFrame(0, index=pred_int_transformed.index, columns=columns)
+
+        coverage_idx = 0
+        var_type_idx = 1
+        coverage_levels = columns.levels[coverage_idx].unique()
+
+        for coverage_level in coverage_levels:
+            level_mask = columns.get_level_values(coverage_idx) == coverage_level
+
+            lower_mask = level_mask & (
+                columns.get_level_values(var_type_idx) == "lower"
+            )
+            if any(lower_mask):
+                lower = pred_int_transformed.loc[:, lower_mask]
+                lower_adjusted = self._apply_bias_adjustment(lower, variance)
+                result.loc[:, lower_mask] = lower_adjusted
+
+            upper_mask = level_mask & (
+                columns.get_level_values(var_type_idx) == "upper"
+            )
+            if any(upper_mask):
+                upper = pred_int_transformed.loc[:, upper_mask]
+                upper_adjusted = self._apply_bias_adjustment(upper, variance)
+                result.loc[:, upper_mask] = upper_adjusted
+
+        result = result.sort_index(axis=1)
+
+        return result
+
+    def _apply_bias_adjustment(self, y, variance):
+        """Apply bias adjustment for BoxCox Transformations.
+
+        Parameters
+        ----------
+        y : pd.Series
+            Transformed predictions or prediction intervals.
+        variance : pd.Series
+            Variance of the predictions.
+
+        Returns
+        -------
+        y_adjusted : pd.Series
+            Bias-adjusted predictions or prediction intervals.
+        """
+        y_values = y.values.reshape(-1, 1)
+        variance_values = variance.values.reshape(-1, 1)
+        lmbda = self.boxcox_transformer_.lambda_
+
+        denominator = 2 * (lmbda * y_values + 1) ** 2
+        adjustment = 1 + (variance_values * (1 - lmbda)) / denominator
+        adjusted_values = inv_boxcox(y_values, lmbda) * adjustment
+
+        result = pd.Series(adjusted_values.ravel(), index=y.index, name=y.name)
+        return result
+
+    @classmethod
+    def get_test_params(cls, parameter_set="default"):
+        """Return testing parameter settings for the estimator.
+
+        Parameters
+        ----------
+        parameter_set : str, default="default"
+            Name of the set of test parameters to return.
+
+        Returns
+        -------
+        params : dict or list of dict
+            Parameters to create testing instances of the class.
+        """
+        from sktime.forecasting.naive import NaiveForecaster
+
+        params = [
+            {
+                "forecaster": NaiveForecaster(strategy="mean"),
+            },
+            {
+                "forecaster": NaiveForecaster(strategy="mean"),
+                "lambda_fixed": 0.5,
+            },
+        ]
+        return params
diff --git a/sktime/forecasting/compose/__init__.py b/sktime/forecasting/compose/__init__.py
index 22319429d..b34a2a1b6 100644
--- a/sktime/forecasting/compose/__init__.py
+++ b/sktime/forecasting/compose/__init__.py
@@ -22,6 +22,7 @@ __all__ = [
     "DirRecTabularRegressionForecaster",
     "DirRecTimeSeriesRegressionForecaster",
     "DirectReductionForecaster",
+    "RecursiveReductionForecaster",
     "StackingForecaster",
     "MultiplexForecaster",
     "make_reduction",
@@ -63,6 +64,7 @@ from sktime.forecasting.compose._reduce import (
     DirRecTimeSeriesRegressionForecaster,
     MultioutputTabularRegressionForecaster,
     MultioutputTimeSeriesRegressionForecaster,
+    RecursiveReductionForecaster,
     RecursiveTabularRegressionForecaster,
     RecursiveTimeSeriesRegressionForecaster,
     YfromX,
diff --git a/sktime/forecasting/compose/_reduce.py b/sktime/forecasting/compose/_reduce.py
index 40491edc7..3505ab2a2 100644
--- a/sktime/forecasting/compose/_reduce.py
+++ b/sktime/forecasting/compose/_reduce.py
@@ -24,6 +24,7 @@ __all__ = [
     "DirRecTabularRegressionForecaster",
     "DirRecTimeSeriesRegressionForecaster",
     "DirectReductionForecaster",
+    "RecursiveReductionForecaster",
     "YfromX",
 ]
 
@@ -2587,8 +2588,13 @@ class RecursiveReductionForecaster(BaseForecaster, _ReducerMixin):
             "window_length": 3,
             "pooling": "global",  # all internal mtypes are tested across scenarios
         }
+        params2 = {
+            "estimator": est,
+            "window_length": 4,
+            "pooling": "local",
+        }
 
-        return params1
+        return [params1, params2]
 
 
 class YfromX(BaseForecaster, _ReducerMixin):
@@ -2634,8 +2640,8 @@ class YfromX(BaseForecaster, _ReducerMixin):
         if there are 2 or less levels, "global" and "panel" result in the same
         if there is only 1 level (single time series), all three settings agree
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.datasets import load_longley
     >>> from sktime.split import temporal_train_test_split
     >>> from sktime.forecasting.compose import YfromX
diff --git a/sktime/forecasting/vecm.py b/sktime/forecasting/vecm.py
index 12487758b..f5cfa65ea 100644
--- a/sktime/forecasting/vecm.py
+++ b/sktime/forecasting/vecm.py
@@ -62,8 +62,8 @@ class VECM(_StatsModelsAdapter):
         2D ndarray/pd.DataFrame of size (any, neqs)
         Forecasted value of exog_coint
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.forecasting.vecm import VECM
     >>> from sktime.split import temporal_train_test_split
     >>> from sktime.forecasting.base import ForecastingHorizon
diff --git a/sktime/libs/README.md b/sktime/libs/README.md
index 294dc6ad6..f8cf70ab2 100644
--- a/sktime/libs/README.md
+++ b/sktime/libs/README.md
@@ -14,10 +14,15 @@ This folder contains libraries directly distributed with, and maintained by, `sk
   Unofficial fork of abandoned package from June 2024 onwards,
   see [pykalman issue 109](https://github.com/pykalman/pykalman/issues/109).
 
+* `timesfm` - a package implementing TimesFM, adapted from [google-research/timesfm](https://github.com/google-research/timesfm). This is an unofficial fork created to address the lack of recent updates of `timesfm` package on [pypi](https://pypi.org/project/timesfm/) and the instability caused by significant interface changes in recent versions without prior deprecation warnings. The fork has minimal dependencies and focuses on the core features required for compatibility with the `sktime` forecaster.
+
+* `uni2ts` - a package implementing the MOIRAIForecaster. Unofficial fork of
+ the package with minimal dependencies and code specific to the forecaster.
+ Official package available at [pypi](https://pypi.org/project/uni2ts/).
+
 * `vmdpy` - a package implementing Variational Mode Decomposition.
   Official fork, `vmdpy` is maintained in `sktime` since August 2023.
 
-
 # Snippets from other libraries:
 
 This folder contains also some private snippets from other libraries,
diff --git a/sktime/performance_metrics/forecasting/_classes.py b/sktime/performance_metrics/forecasting/_classes.py
index d739d8057..5265e54bd 100644
--- a/sktime/performance_metrics/forecasting/_classes.py
+++ b/sktime/performance_metrics/forecasting/_classes.py
@@ -44,9 +44,12 @@ from sktime.performance_metrics.forecasting._functions import (
     median_squared_scaled_error,
     relative_loss,
 )
+from sktime.performance_metrics.forecasting.sample_weight._types import (
+    check_sample_weight_generator,
+)
 from sktime.utils.warnings import warn
 
-__author__ = ["mloning", "tch", "RNKuhns", "fkiraly"]
+__author__ = ["mloning", "tch", "RNKuhns", "fkiraly", "markussagen"]
 __all__ = [
     "make_forecasting_scorer",
     "MeanAbsoluteScaledError",
@@ -133,7 +136,11 @@ class BaseForecastingErrorMetric(BaseMetric):
         "reserved_params": ["multioutput", "multilevel"],
     }
 
-    def __init__(self, multioutput="uniform_average", multilevel="uniform_average"):
+    def __init__(
+        self,
+        multioutput="uniform_average",
+        multilevel="uniform_average",
+    ):
         self.multioutput = multioutput
         self.multilevel = multilevel
 
@@ -187,7 +194,7 @@ class BaseForecastingErrorMetric(BaseMetric):
             Must be of same format as ``y_true``, same columns if indexed,
             but not necessarily same indices.
 
-        sample_weight : optional, 1D array-like, default=None
+        sample_weight : optional, 1D array-like, or callable, default=None
             Sample weights for each time point.
 
             * If ``None``, the time indices are considered equally weighted.
@@ -198,6 +205,10 @@ class BaseForecastingErrorMetric(BaseMetric):
               individual time
               series must be the same, and equal to the length of ``sample_weight``,
               for all instances of time series passed.
+            * If a callable, it must follow ``SampleWeightGenerator`` interface,
+              or have one of the following signatures:
+              ``y_true: pd.DataFrame -> 1D array-like``,
+              or ``y_true: pd.DataFrame x y_pred: pd.DataFrame -> 1D array-like``.
 
         Returns
         -------
@@ -219,6 +230,18 @@ class BaseForecastingErrorMetric(BaseMetric):
         """  # noqa: E501
         return self.evaluate(y_true, y_pred, **kwargs)
 
+    def _apply_sample_weight_to_kwargs(self, y_true, y_pred, **kwargs):
+        """Apply sample weight to kwargs.
+
+        Sample weight is updated to kwargs if it is a callable and follows the
+        SampleWeightGenerator interface.
+        """
+        sample_weight = kwargs.get("sample_weight", None)
+        if callable(sample_weight) and check_sample_weight_generator(sample_weight):
+            kwargs["sample_weight"] = sample_weight(y_true, y_pred, **kwargs)
+
+        return kwargs
+
     def evaluate(self, y_true, y_pred, **kwargs):
         """Evaluate the desired metric on given inputs.
 
@@ -264,8 +287,8 @@ class BaseForecastingErrorMetric(BaseMetric):
             Must be of same format as ``y_true``, same columns if indexed,
             but not necessarily same indices.
 
-        sample_weight : optional, 1D array-like, default=None
-            Sample weights for each time point.
+        sample_weight : optional, 1D array-like, or callable, default=None
+            Sample weights or callable for each time point.
 
             * If ``None``, the time indices are considered equally weighted.
             * If an array, must be 1D.
@@ -275,6 +298,10 @@ class BaseForecastingErrorMetric(BaseMetric):
               individual time
               series must be the same, and equal to the length of ``sample_weight``,
               for all instances of time series passed.
+            * If a callable, it must follow ``SampleWeightGenerator`` interface,
+              or have one of the following signatures:
+              ``y_true: pd.DataFrame -> 1D array-like``,
+              or ``y_true: pd.DataFrame x y_pred: pd.DataFrame -> 1D array-like``.
 
         Returns
         -------
@@ -296,11 +323,16 @@ class BaseForecastingErrorMetric(BaseMetric):
         """  # noqa: E501
         multioutput = self.multioutput
         multilevel = self.multilevel
+
         # Input checks and conversions
         y_true_inner, y_pred_inner, multioutput, multilevel, kwargs = self._check_ys(
             y_true, y_pred, multioutput, multilevel, **kwargs
         )
 
+        kwargs = self._apply_sample_weight_to_kwargs(
+            y_true=y_true_inner, y_pred=y_pred_inner, **kwargs
+        )
+
         requires_vectorization = isinstance(y_true_inner, VectorizedDF)
         if not requires_vectorization:
             # pass to inner function
@@ -467,8 +499,8 @@ class BaseForecastingErrorMetric(BaseMetric):
             Must be of same format as ``y_true``, same columns if indexed,
             but not necessarily same indices.
 
-        sample_weight : optional, 1D array-like, default=None
-            Sample weights for each time point.
+        sample_weight : optional, 1D array-like, or callable, default=None
+            Sample weights or callable for each time point.
 
             * If ``None``, the time indices are considered equally weighted.
             * If an array, must be 1D.
@@ -478,6 +510,10 @@ class BaseForecastingErrorMetric(BaseMetric):
               individual time
               series must be the same, and equal to the length of ``sample_weight``,
               for all instances of time series passed.
+            * If a callable, it must follow ``SampleWeightGenerator`` interface,
+              or have one of the following signatures:
+              ``y_true: pd.DataFrame -> 1D array-like``,
+              or ``y_true: pd.DataFrame x y_pred: pd.DataFrame -> 1D array-like``.
 
         Returns
         -------
@@ -494,10 +530,16 @@ class BaseForecastingErrorMetric(BaseMetric):
         """  # noqa: E501
         multioutput = self.multioutput
         multilevel = self.multilevel
+
         # Input checks and conversions
         y_true_inner, y_pred_inner, multioutput, multilevel, kwargs = self._check_ys(
             y_true, y_pred, multioutput, multilevel, **kwargs
         )
+
+        kwargs = self._apply_sample_weight_to_kwargs(
+            y_true=y_true_inner, y_pred=y_pred_inner, **kwargs
+        )
+
         requires_vectorization = isinstance(y_true_inner, VectorizedDF)
         if not requires_vectorization:
             # pass to inner function
@@ -695,7 +737,7 @@ class BaseForecastingErrorMetric(BaseMetric):
 
         return y_true, y_pred, multioutput, multilevel, kwargs
 
-    def _get_sample_weight(self, **kwargs):
+    def _set_sample_weight_on_kwargs(self, **kwargs):
         """Get sample weights from kwargs.
 
         Assumes that either ``sample_weight`` is passed, or not.
@@ -736,7 +778,7 @@ class BaseForecastingErrorMetric(BaseMetric):
         df : pd.DataFrame
             Weighted DataFrame.
         """
-        sample_weight = self._get_sample_weight(**kwargs)
+        sample_weight = self._set_sample_weight_on_kwargs(**kwargs)
         if sample_weight is not None:
             df = df.mul(sample_weight, axis=0)
         return df
@@ -846,7 +888,6 @@ class _DynamicForecastingErrorMetric(BaseForecastingErrorMetricFunc):
         self.func = func
         self.name = name
         self.lower_is_better = lower_is_better
-
         super().__init__(multioutput=multioutput, multilevel=multilevel)
 
         self.set_tags(**{"lower_is_better": lower_is_better})
@@ -1581,13 +1622,6 @@ class MedianAbsoluteError(BaseForecastingErrorMetricFunc):
 
     func = median_absolute_error
 
-    def __init__(
-        self,
-        multioutput="uniform_average",
-        multilevel="uniform_average",
-    ):
-        super().__init__(multioutput=multioutput, multilevel=multilevel)
-
     def _evaluate_by_index(self, y_true, y_pred, **kwargs):
         """Return the metric evaluated at each time point.
 
diff --git a/sktime/performance_metrics/forecasting/probabilistic/_classes.py b/sktime/performance_metrics/forecasting/probabilistic/_classes.py
index 961a3b274..7aff5d314 100644
--- a/sktime/performance_metrics/forecasting/probabilistic/_classes.py
+++ b/sktime/performance_metrics/forecasting/probabilistic/_classes.py
@@ -55,7 +55,7 @@ class _BaseProbaForecastingErrorMetric(BaseForecastingErrorMetric):
                 (fh, n_outputs) where fh is the forecasting horizon
             Ground truth (correct) target values.
 
-        y_pred : return object of probabilistic predictition method scitype:y_pred
+        y_pred : return object of probabilistic prediction method scitype:y_pred
             must be at fh and for variables equal to those in y_true.
 
         Returns
@@ -82,7 +82,7 @@ class _BaseProbaForecastingErrorMetric(BaseForecastingErrorMetric):
                 (fh, n_outputs) where fh is the forecasting horizon
             Ground truth (correct) target values.
 
-        y_pred : return object of probabilistic predictition method scitype:y_pred
+        y_pred : return object of probabilistic prediction method scitype:y_pred
             must be at fh and for variables equal to those in y_true
 
         multioutput : string "uniform_average" or "raw_values" determines how\
@@ -176,7 +176,7 @@ class _BaseProbaForecastingErrorMetric(BaseForecastingErrorMetric):
                 (fh, n_outputs) where fh is the forecasting horizon
             Ground truth (correct) target values.
 
-        y_pred : return object of probabilistic predictition method scitype:y_pred
+        y_pred : return object of probabilistic prediction method scitype:y_pred
             must be at fh and for variables equal to those in y_true
 
         multioutput : string "uniform_average" or "raw_values" determines how\
@@ -855,7 +855,7 @@ class _BaseDistrForecastingMetric(_BaseProbaForecastingErrorMetric):
                 (fh, n_outputs) where fh is the forecasting horizon
             Ground truth (correct) target values.
 
-        y_pred : return object of probabilistic predictition method scitype:y_pred
+        y_pred : return object of probabilistic prediction method scitype:y_pred
             must be at fh and for variables equal to those in y_true
 
         multioutput : {'raw_values', 'uniform_average'} or array-like of shape \
diff --git a/sktime/performance_metrics/forecasting/sample_weight/__init__.py b/sktime/performance_metrics/forecasting/sample_weight/__init__.py
new file mode 100644
index 000000000..e7f69d293
--- /dev/null
+++ b/sktime/performance_metrics/forecasting/sample_weight/__init__.py
@@ -0,0 +1,16 @@
+"""Sample weight generators for sktime performance metrics."""
+
+__author__ = ["markussagen"]
+__all__ = [
+    "BaseSampleWeightGenerator",
+    "check_sample_weight_generator",
+    "SampleWeightGenerator",
+]
+
+from sktime.performance_metrics.forecasting.sample_weight._base import (
+    BaseSampleWeightGenerator,
+)
+from sktime.performance_metrics.forecasting.sample_weight._types import (
+    SampleWeightGenerator,
+    check_sample_weight_generator,
+)
diff --git a/sktime/performance_metrics/forecasting/sample_weight/_base.py b/sktime/performance_metrics/forecasting/sample_weight/_base.py
new file mode 100644
index 000000000..a2530baf0
--- /dev/null
+++ b/sktime/performance_metrics/forecasting/sample_weight/_base.py
@@ -0,0 +1,77 @@
+"""Implements base class for customer sample weights of performance metric in sktime."""
+
+__author__ = ["markussagen"]
+__all__ = ["BaseSampleWeightGenerator", "check_sample_weight_generator"]
+
+from sktime.base import BaseObject
+from sktime.performance_metrics.forecasting.sample_weight._types import (
+    check_sample_weight_generator,
+)
+
+
+class BaseSampleWeightGenerator(BaseObject):
+    """Base class for defining sample weight generators in sktime.
+
+    Extends sktime BaseObject.
+    """
+
+    _tags = {
+        "object_type": "sample_weight",
+        "authors": "markussagen",
+        "maintainers": "markussagen",
+    }
+
+    def __init__(self):
+        super().__init__()
+
+    def __call__(self, y_true, y_pred=None, **kwargs):
+        """Generate sample weights for a given set of true and predicted values.
+
+        Parameters
+        ----------
+        y_true : time series in sktime compatible data container format
+            Ground truth (correct) target values.
+
+        y_pred : time series in sktime compatible data container format, optional
+            Predicted values to evaluate against ground truth.
+            Must be of same format as y_true, same indices and columns if indexed.
+            If None, only y_true is used for weight generation.
+
+        **kwargs : dict
+            Additional keyword arguments specific to the weight generation method.
+
+        Returns
+        -------
+        sample_weight : 1D np.ndarray or None
+            Sample weights for each time point.
+
+            * If an array, must be 1D.
+              If y_true and y_pred are a single time series,
+              sample_weight must be of the same length as y_true.
+              If the time series are panel or hierarchical, the length of all
+              individual time series must be the same, and equal to the length
+              of sample_weight, for all instances of time series passed.
+            * If None, the time indices are considered equally weighted.
+        """
+        raise NotImplementedError("abstract method")
+
+    @classmethod
+    def get_test_params(cls, parameter_set="default"):
+        """Return testing parameter settings for the estimator.
+
+        Parameters
+        ----------
+        parameter_set : str, default="default"
+            Name of the set of test parameters to return, for use in tests. If no
+            special parameters are defined for a value, will return ``"default"`` set.
+
+        Returns
+        -------
+        params : dict or list of dict, default = {}
+            Parameters to create testing instances of the class
+            Each dict are parameters to construct an "interesting" test instance, i.e.,
+            ``MyClass(**params)`` or ``MyClass(**params[i])`` creates a valid test
+            instance.
+            ``create_test_instance`` uses the first (or only) dictionary in ``params``
+        """
+        return [{}]
diff --git a/sktime/performance_metrics/forecasting/sample_weight/_types.py b/sktime/performance_metrics/forecasting/sample_weight/_types.py
new file mode 100644
index 000000000..9e5aeb93a
--- /dev/null
+++ b/sktime/performance_metrics/forecasting/sample_weight/_types.py
@@ -0,0 +1,113 @@
+"""Implements base class for customer sample weights of performance metric in sktime."""
+
+__author__ = ["markussagen"]
+__all__ = ["SampleWeightGenerator", "check_sample_weight_generator"]
+
+from inspect import signature
+from typing import Protocol, runtime_checkable
+
+
+@runtime_checkable
+class SampleWeightGenerator(Protocol):
+    """Protocol for sample weight generators.
+
+    This protocol defines the interface for sample weight generator functions used in
+    performance metrics calculations. Sample weight generators are used to assign
+    weights to individual time points in time series data.
+
+    The generator must have at least one parameter (y_true) and accept **kwargs.
+    It must return a 1D numpy array of sample weights.
+
+    Parameters
+    ----------
+    y_true : array-like of shape (n_samples,) or (n_samples, n_outputs)
+        Ground truth (correct) target values.
+    y_pred : array-like of shape (n_samples,) or (n_samples, n_outputs), optional
+        Estimated target values.
+    **kwargs : dict
+        Additional keyword arguments that may be used in weight calculation.
+
+    Returns
+    -------
+    sample_weights : np.ndarray of shape (n_samples,)
+        1D array of sample weights.
+
+    Raises
+    ------
+    ValueError
+        If the sample weight generator does not have at least one parameter (y_true).
+        If the first parameter is not y_true.
+        If the sample weight generator does not accept **kwargs.
+
+    Notes
+    -----
+    Implementations of this protocol should ensure that the returned weights are
+    non-negative and sum to a value greater than zero.
+
+    Examples
+    --------
+    >>> import numpy as np
+    >>> class ExampleWeightGenerator:
+    ...     def __call__(self, y_true, y_pred=None, **kwargs):
+    ...         return np.ones_like(y_true)
+    >>> weight_gen = ExampleWeightGenerator()
+    >>> y_true = np.array([1, 2, 3, 4, 5])
+    >>> weights = weight_gen(y_true)
+    >>> print(weights)
+    [1. 1. 1. 1. 1.]
+    """
+
+    def __call__(self, y_true, y_pred=None, **kwargs):
+        """Generate sample weights for time series data.
+
+        This method should be implemented by concrete sample weight generators.
+
+        Parameters
+        ----------
+        y_true : array-like of shape (n_samples,) or (n_samples, n_outputs)
+            Ground truth (correct) target values.
+        y_pred : array-like of shape (n_samples,) or (n_samples, n_outputs), optional
+            Estimated target values. Default is None.
+        **kwargs : dict
+            Additional keyword arguments that may be used in weight calculation.
+
+        Returns
+        -------
+        sample_weights : np.ndarray of shape (n_samples,)
+            1D array of sample weights.
+
+        Notes
+        -----
+        - The method should always return a 1D numpy array of weights.
+        - The length of the returned array should match the number of samples in y_true.
+        - If y_pred is not used in the weight calculation, it should be ignored.
+        """
+        ...
+
+
+def check_sample_weight_generator(obj):
+    """Check if obj is a valid SampleWeightGenerator."""
+    if obj is None or not callable(obj):
+        return False
+
+    sig = signature(obj)
+    params = sig.parameters
+
+    # Check if the function has at least one parameter (y_true)
+    if len(params) < 1:
+        msg = "Sample weight generator must have at least one parameter (y_true)"
+        raise ValueError(msg)
+
+    param_names = list(params.keys())
+
+    # Check if the first parameter is y_true
+    if param_names[0] != "y_true":
+        raise ValueError("First parameter of sample weight generator must be 'y_true'")
+
+    # Check if the function accepts **kwargs
+    if not any(param.kind == param.VAR_KEYWORD for param in params.values()):
+        raise ValueError("Sample weight generator must accept **kwargs")
+
+    # NOTE: this does not check the return type!
+
+    return True
diff --git a/sktime/proba/_empirical.py b/sktime/proba/_empirical.py
index 8c25bee0c..c54b64944 100644
--- a/sktime/proba/_empirical.py
+++ b/sktime/proba/_empirical.py
@@ -25,8 +25,8 @@ class Empirical(BaseDistribution):
     index : pd.Index, optional, default = RangeIndex
     columns : pd.Index, optional, default = RangeIndex
 
-    Example
-    -------
+    Examples
+    --------
     >>> import pandas as pd
     >>> from sktime.proba.empirical import Empirical
 
diff --git a/sktime/proba/_laplace.py b/sktime/proba/_laplace.py
index 3da08916f..e756d823d 100644
--- a/sktime/proba/_laplace.py
+++ b/sktime/proba/_laplace.py
@@ -21,8 +21,8 @@ class Laplace(BaseDistribution):
     index : pd.Index, optional, default = RangeIndex
     columns : pd.Index, optional, default = RangeIndex
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.proba.laplace import Laplace
 
     >>> n = Laplace(mu=[[0, 1], [2, 3], [4, 5]], scale=1)
diff --git a/sktime/proba/_mixture.py b/sktime/proba/_mixture.py
index 1a8c75ea8..1ac7a6707 100644
--- a/sktime/proba/_mixture.py
+++ b/sktime/proba/_mixture.py
@@ -23,8 +23,8 @@ class Mixture(_HeterogenousMetaEstimator, BaseDistribution):
     index : pd.Index, optional, default = inferred from component distributions
     columns : pd.Index, optional, default = inferred from component distributions
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.proba.mixture import Mixture
     >>> from sktime.proba.normal import Normal
     >>>
diff --git a/sktime/proba/_normal.py b/sktime/proba/_normal.py
index 8edbc5ac0..46708f0b9 100644
--- a/sktime/proba/_normal.py
+++ b/sktime/proba/_normal.py
@@ -22,8 +22,8 @@ class Normal(BaseDistribution):
     index : pd.Index, optional, default = RangeIndex
     columns : pd.Index, optional, default = RangeIndex
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.proba.normal import Normal
 
     >>> n = Normal(mu=[[0, 1], [2, 3], [4, 5]], sigma=1)
diff --git a/sktime/proba/_t.py b/sktime/proba/_t.py
index 2e985a26d..c0f114d80 100644
--- a/sktime/proba/_t.py
+++ b/sktime/proba/_t.py
@@ -24,8 +24,8 @@ class TDistribution(BaseDistribution):
     index : pd.Index, optional, default = RangeIndex
     columns : pd.Index, optional, default = RangeIndex
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.proba.t import TDistribution
 
     >>> n = TDistribution(mu=[[0, 1], [2, 3], [4, 5]], sigma=1, df=10)
diff --git a/sktime/proba/tfp.py b/sktime/proba/tfp.py
index 6a9488946..9996afb10 100644
--- a/sktime/proba/tfp.py
+++ b/sktime/proba/tfp.py
@@ -22,8 +22,8 @@ class TFNormal(_BaseTFDistribution):
     index : pd.Index, optional, default = RangeIndex
     columns : pd.Index, optional, default = RangeIndex
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.proba.tfp import TFNormal  # doctest: +SKIP
 
     >>> n = TFNormal(mu=[[0, 1], [2, 3], [4, 5]], sigma=1)  # doctest: +SKIP
diff --git a/sktime/registry/_base_classes.py b/sktime/registry/_base_classes.py
index 05f72c9b2..c7819d8bc 100644
--- a/sktime/registry/_base_classes.py
+++ b/sktime/registry/_base_classes.py
@@ -261,20 +261,20 @@ class regressor(_BaseScitypeOfObject):
         return BaseRegressor
 
 
-class series_annotator(_BaseScitypeOfObject):
-    """Time series annotator."""
+class detector(_BaseScitypeOfObject):
+    """Detector of anomalies, outliers, or change points."""
 
     _tags = {
-        "scitype_name": "series-annotator",
-        "short_descr": "time series annotator",
+        "scitype_name": "detector",
+        "short_descr": "detector - anomalies, outliers, change points",
         "parent_scitype": "estimator",
     }
 
     @classmethod
     def get_base_class(cls):
-        from sktime.annotation.base import BaseSeriesAnnotator
+        from sktime.detection.base import BaseDetector
 
-        return BaseSeriesAnnotator
+        return BaseDetector
 
 
 class splitter(_BaseScitypeOfObject):
@@ -399,6 +399,30 @@ def _construct_base_class_register(mixin=False):
     return register
 
 
+def get_base_class_for_str(scitype_str):
+    """Return base class for a given scitype string.
+
+    Parameters
+    ----------
+    scitype_str : str, or list of str
+        scitype shorthand, as in scitype_name field of scitype classes
+
+    Returns
+    -------
+    base_cls : class or list of class
+        base class corresponding to the scitype string,
+        or list of base classes if input was a list
+    """
+    if isinstance(scitype_str, list):
+        return [get_base_class_for_str(s) for s in scitype_str]
+
+    base_classes = _get_base_classes()
+    base_classes += _get_base_classes(mixin=True)
+    base_class_lookup = {cl.get_class_tags()["scitype_name"]: cl for cl in base_classes}
+    base_cls = base_class_lookup[scitype_str].get_base_class()
+    return base_cls
+
+
 def get_base_class_register(mixin=False, include_baseobjs=True):
     """Return register of object scitypes and base classes in sktime.
 
@@ -519,6 +543,26 @@ def get_base_class_lookup(mixin=False, include_baseobjs=True):
     return base_class_lookup
 
 
+# LEGACY types - remove in 1.0.0
+# ------------------------------
+
+
+class series_annotator(_BaseScitypeOfObject):
+    """Time series annotator."""
+
+    _tags = {
+        "scitype_name": "series-annotator",
+        "short_descr": "detector - anomalies, outliers, change points",
+        "parent_scitype": "estimator",
+    }
+
+    @classmethod
+    def get_base_class(cls):
+        from sktime.detection.base import BaseDetector
+
+        return BaseDetector
+
+
 class transformer_series_to_primitives(_BaseScitypeOfObject):
     """LEGACY - time series to primitives transformer."""
 
diff --git a/sktime/registry/_lookup.py b/sktime/registry/_lookup.py
index 93894f7e3..b72b7b1c1 100644
--- a/sktime/registry/_lookup.py
+++ b/sktime/registry/_lookup.py
@@ -21,7 +21,10 @@ from pathlib import Path
 import pandas as pd
 from skbase.lookup import all_objects
 
-from sktime.registry._base_classes import get_base_class_lookup, get_obj_scitype_list
+from sktime.registry._base_classes import (
+    get_base_class_for_str,
+    get_obj_scitype_list,
+)
 from sktime.registry._tags import ESTIMATOR_TAG_REGISTER
 
 
@@ -362,7 +365,17 @@ def all_tags(
 
 
 def _check_estimator_types(estimator_types):
-    """Return list of classes corresponding to type strings."""
+    """Return list of classes corresponding to type strings.
+
+    Parameters
+    ----------
+    estimator_types: str, or list of str
+
+    Returns
+    -------
+    estimator_types: list of classes
+        base classes corresponding to scitype strings in estimator_types
+    """
     estimator_types = deepcopy(estimator_types)
 
     if not isinstance(estimator_types, list):
@@ -370,14 +383,12 @@ def _check_estimator_types(estimator_types):
 
     def _get_err_msg(estimator_type):
         return (
-            f"Parameter `estimator_type` must be None, a string or a list of "
+            f"Parameter `estimator_type` must be a string or a list of "
             f"strings. Valid string values are: "
             f"{get_obj_scitype_list()}, but found: "
             f"{repr(estimator_type)}"
         )
 
-    BASE_CLASS_LOOKUP = get_base_class_lookup()
-
     for i, estimator_type in enumerate(estimator_types):
         if not isinstance(estimator_type, (type, str)):
             raise ValueError(
@@ -386,8 +397,7 @@ def _check_estimator_types(estimator_types):
         if isinstance(estimator_type, str):
             if estimator_type not in get_obj_scitype_list():
                 raise ValueError(_get_err_msg(estimator_type))
-            estimator_type = BASE_CLASS_LOOKUP[estimator_type]
-            estimator_types[i] = estimator_type
+            estimator_types[i] = get_base_class_for_str(estimator_type)
         elif isinstance(estimator_type, type):
             pass
         else:
diff --git a/sktime/registry/_scitype_coercion.py b/sktime/registry/_scitype_coercion.py
index dfbf2fa71..2374661e3 100644
--- a/sktime/registry/_scitype_coercion.py
+++ b/sktime/registry/_scitype_coercion.py
@@ -22,11 +22,15 @@ def _coerce_series_annotator_to_transformer(obj):
     return AnnotatorAsTransformer(obj)
 
 
+# todo 1.0.0 - remove series-annotator
 _coerce_register[("series-annotator", "transformer")] = (
     _coerce_series_annotator_to_transformer
 )
 
 
+_coerce_register[("detector", "transformer")] = _coerce_series_annotator_to_transformer
+
+
 def _coerce_clusterer_to_transformer(obj):
     from sktime.clustering.compose import ClustererAsTransformer
 
diff --git a/sktime/registry/_tags.py b/sktime/registry/_tags.py
index 1eddff7b0..2ba57f918 100644
--- a/sktime/registry/_tags.py
+++ b/sktime/registry/_tags.py
@@ -1830,13 +1830,13 @@ ESTIMATOR_TAG_REGISTER = [
     ),
     (
         "task",
-        "series-annotator",
+        "detector",
         "str",
         "subtype of series annotator, e.g., 'anomaly_detection', 'segmentation'",
     ),
     (
         "learning_type",
-        "series-annotator",
+        "detector",
         "str",
         "type of learning, e.g., 'supervised', 'unsupervised'",
     ),
diff --git a/sktime/transformations/panel/dwt.py b/sktime/transformations/panel/dwt.py
index c84424354..95ee37745 100644
--- a/sktime/transformations/panel/dwt.py
+++ b/sktime/transformations/panel/dwt.py
@@ -21,8 +21,8 @@ class DWTTransformer(BaseTransformer):
     num_levels : int, number of levels to perform the Haar wavelet
         transformation.
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.transformations.panel.dwt import DWTTransformer
     >>> from sktime.datasets import load_airline
     >>> from sktime.datatypes import convert
diff --git a/sktime/transformations/panel/hog1d.py b/sktime/transformations/panel/hog1d.py
index 785b87da7..455c32272 100644
--- a/sktime/transformations/panel/hog1d.py
+++ b/sktime/transformations/panel/hog1d.py
@@ -42,8 +42,8 @@ class HOG1DTransformer(BaseTransformer):
     scaling_factor : float, default=0.1
         a constant that is multiplied to modify the distribution.
 
-    Example
-    ----------
+    Examples
+    --------
     >>> from sktime.transformations.panel.hog1d import HOG1DTransformer
     >>> from sktime.datasets import load_arrow_head
     >>>
diff --git a/sktime/transformations/panel/padder.py b/sktime/transformations/panel/padder.py
index 2bfb779c5..80b8251fc 100644
--- a/sktime/transformations/panel/padder.py
+++ b/sktime/transformations/panel/padder.py
@@ -23,8 +23,8 @@ class PaddingTransformer(BaseTransformer):
     pad_length : int, optional (default=None) length to pad the series too.
         if None, will find the longest sequence and use instead.
 
-    Example
-    -------
+    Examples
+    --------
     >>> import pandas as pd
     >>> from sktime.transformations.panel.padder import PaddingTransformer
     >>>
diff --git a/sktime/transformations/panel/rocket/_multirocket_multivariate.py b/sktime/transformations/panel/rocket/_multirocket_multivariate.py
index 8532d6e74..14c0ffc42 100644
--- a/sktime/transformations/panel/rocket/_multirocket_multivariate.py
+++ b/sktime/transformations/panel/rocket/_multirocket_multivariate.py
@@ -274,3 +274,19 @@ class MultiRocketMultivariate(BaseTransformer):
             num_features_per_dilation,
             biases,
         )
+
+    @classmethod
+    def get_test_params(cls):
+        """Return testing parameter sets for the estimator."""
+        return [
+            {
+                "num_kernels": 10,
+                "max_dilations_per_kernel": 32,
+                "random_state": 42,
+            },  # First parameter set
+            {
+                "num_kernels": 20,
+                "max_dilations_per_kernel": 16,
+                "random_state": 0,
+            },  # Second parameter set
+        ]
diff --git a/sktime/transformations/series/binning.py b/sktime/transformations/series/binning.py
index 301e45e29..37de70f16 100644
--- a/sktime/transformations/series/binning.py
+++ b/sktime/transformations/series/binning.py
@@ -44,8 +44,8 @@ class TimeBinAggregate(BaseTransformer):
         "bin_mid" = transformed pd.DataFrame will be indexed by bin midpoints
         "bin" = transformed pd.DataFrame will have ``bins`` as ``IntervalIndex``
 
-    Example
-    -------
+    Examples
+    --------
     from sktime.datatypes import get_examples
     from sktime.transformations.series.binning import TimeBinAggregate
 
diff --git a/sktime/transformations/series/dilation_mapping.py b/sktime/transformations/series/dilation_mapping.py
index 63afda3ff..4ba62c894 100644
--- a/sktime/transformations/series/dilation_mapping.py
+++ b/sktime/transformations/series/dilation_mapping.py
@@ -47,8 +47,8 @@ class DilationMappingTransformer(BaseTransformer):
        Accurate and Memory Constrained Time Series Classification", 2023,
        arXiv preprint arXiv:2301.10194.
 
-    Example
-    ----------
+    Examples
+    --------
     >>> from sktime.transformations.series.dilation_mapping import \
     ...     DilationMappingTransformer
     >>> from sktime.datasets import load_airline
diff --git a/sktime/transformations/series/dropna.py b/sktime/transformations/series/dropna.py
index b1655195e..e1be5c5a3 100644
--- a/sktime/transformations/series/dropna.py
+++ b/sktime/transformations/series/dropna.py
@@ -40,6 +40,19 @@ class DropNA(BaseTransformer):
         If True, drops the same rows/columns in transform as in fit. If false,
         drops rows/columns according to the NAs seen in transform (equivalent
         to PandasTransformAdaptor(method="dropna")).
+
+    Examples
+    --------
+    >>> from sktime.transformations.series.dropna import DropNA
+    >>> import pandas as pd
+    >>> import numpy as np
+    >>> X = pd.DataFrame({'a': [1, 2, np.nan, 4], 'b': [5, np.nan, 7, 8]})
+    >>> transformer = DropNA(axis=0, how='any')
+    >>> X_transformed = transformer.fit_transform(X)
+    >>> print(X_transformed)
+       a    b
+    0  1.0  5.0
+    3  4.0  8.0
     """
 
     _tags = {
diff --git a/sktime/transformations/series/filter.py b/sktime/transformations/series/filter.py
index 8752b634e..c98a07f37 100644
--- a/sktime/transformations/series/filter.py
+++ b/sktime/transformations/series/filter.py
@@ -32,8 +32,8 @@ class Filter(BaseTransformer):
         See ``mne.filter.filter_data``
         documentation for a detailed description of all options.
 
-    Example
-    -------
+    Examples
+    --------
     >>> from sktime.transformations.series.filter import Filter
     >>> from sktime.datasets import load_arrow_head
     >>> X, y = load_arrow_head(return_X_y=True, return_type="pd-multiindex")
diff --git a/sktime/transformations/series/kinematic.py b/sktime/transformations/series/kinematic.py
index e38743790..e26a4271a 100644
--- a/sktime/transformations/series/kinematic.py
+++ b/sktime/transformations/series/kinematic.py
@@ -49,8 +49,8 @@ class KinematicFeatures(BaseTransformer):
         * "a_abs" - absolute acceleration
         * "curv" - curvature
 
-    Example
-    -------
+    Examples
+    --------
     >>> import numpy as np
     >>> import pandas as pd
     >>> from sktime.transformations.series.kinematic import KinematicFeatures
diff --git a/sktime/transformations/series/signature.py b/sktime/transformations/series/signature.py
new file mode 100644
index 000000000..6493c3b65
--- /dev/null
+++ b/sktime/transformations/series/signature.py
@@ -0,0 +1,175 @@
+"""Signature moment transformer."""
+
+import numpy as np
+import pandas as pd
+
+from sktime.transformations.base import BaseTransformer
+
+
+class SignatureMoments(BaseTransformer):
+    """Signature Moments Transformer for multivariate time series.
+
+    Computes time ordered signature moments for uni- and multivariate time series.
+
+    Pipelining ``Differencer() * SignatureMoments()`` can be used to
+    obtain the discrete path signature.
+
+    For a degree ``d``, the columns of the ``transform`` output are
+    strings corresponding to strings of length ``d`` over the alphabet
+    ``{[0], ..., [str(n_channels - 1)]}``,
+    where ``n_channels`` is the number of
+    variables in the time series, and the character ``i`` represents the
+    ``i``-th variable.
+
+    If ``use_index=True``, the time index is included as an additional
+    dimension, and is represented by the character ``[n_channels]``.
+
+    For a time series :math:`X` with ``n_channels`` variables, the signature moment
+    for a string :math:`s = i_1 i_2 ... i_d` is the arithmetic mean of the products
+
+    .. math:: X_{i_1}(t_1) X_{i_2}(t_2) ... X_{i_d}(t_d)
+
+    where :math:`t_1 < t_2 < ... < t_d` are the time indices.
+
+    If ``normalize_prod=True``, the signature moment is computed as the arithmetic
+    mean of the geometric means instead, i.e., of
+
+    .. math:: (X_{i_1}(t_1) X_{i_2}(t_2) ... X_{i_d}(t_d))^{1/d}
+
+    This ensures that all signature moments are of the same unit as the input data.
+
+    Parameters
+    ----------
+    degree: int, default=2
+        The maximum length of the string-based signature elements to include.
+        Degree can be upto 3.
+
+    use_index: bool, default=True
+        Whether to include the time index as an additional dimension.
+
+    normalize_prod: bool, default=False
+        If True, uses geometric mean instead of product for the signature moment,
+        see above for formula.
+        If False, uses product.
+
+    Examples
+    --------
+    >>> from sktime.transformations.series.signature import SignatureMoments
+    >>> from sktime.datasets import load_airline
+    >>> y = load_airline()
+    >>> transformer = SignatureMoments(degree=2, use_index=True)
+    >>> Xt = transformer.fit_transform(y)
+    """
+
+    _tags = {
+        "authors": ["VectorNd", "fkiraly"],
+        "maintainers": "VectorNd",
+        "scitype:transform-input": "Series",
+        "scitype:transform-output": "Primitives",
+        "scitype:instancewise": True,
+        "X_inner_mtype": "np.ndarray",
+        "y_inner_mtype": "None",
+        "fit_is_empty": True,
+    }
+
+    def __init__(self, degree=2, use_index=True, normalize_prod=False):
+        self.degree = degree
+        self.use_index = use_index
+        self.normalize_prod = normalize_prod
+        super().__init__()
+
+    def _transform(self, X, y=None):
+        """Compute the signature features for the input time series."""
+        n_timepoints, n_channels = X.shape
+
+        if self.use_index:
+            index = np.arange(n_timepoints).reshape(-1, 1)
+            X = np.concatenate((X, index), axis=1)
+            n_channels += 1
+
+        signature_matrix = []
+        instance_data = X.T
+        signature_row, feature_names = self._compute_signature(instance_data)
+        signature_matrix.append(signature_row)
+
+        if self.normalize_prod:
+            signature_matrix = np.power(signature_matrix, 1 / self.degree)
+
+        return pd.DataFrame(signature_matrix, columns=feature_names)
+
+    def _compute_signature(self, data):
+        """Compute signature features for a single instance."""
+        n_channels, _ = data.shape
+
+        feature_names = []
+        signature_row = []
+        for length in range(1, self.degree + 1):
+            for indices in np.ndindex((n_channels,) * length):
+                element_mean = self._compute_mean_product(data, indices)
+                signature_row.append(element_mean)
+
+                feature_name = "".join(f"[{i}]" for i in indices)
+                feature_names.append(feature_name)
+
+        return signature_row, feature_names
+
+    def _compute_mean_product(self, data, indices):
+        """Compute mean product of the specified data dimensions."""
+        length = len(indices)
+        ix = indices
+
+        if length == 1:
+            return np.mean(data[ix[0], :])
+        elif length == 2:
+            correlation_data = data[ix[0], :, np.newaxis] * data[ix[1], np.newaxis, :]
+            triu_indices = np.triu_indices(correlation_data.shape[1])
+            return np.mean(correlation_data[triu_indices])
+        elif length == 3:
+            correlation_data = (
+                data[ix[0], :, np.newaxis, np.newaxis]
+                * data[ix[1], np.newaxis, :, np.newaxis]
+                * data[ix[2], np.newaxis, np.newaxis, :]
+            )
+            depth = correlation_data.shape[0]
+
+            total_sum, total_len = 0, 0
+
+            for i in range(depth):
+                filtered_matrix = correlation_data[i][i:]
+
+                triu_indices = np.triu_indices(filtered_matrix.shape[0])
+
+                upper_triangular = filtered_matrix[triu_indices]
+
+                total_len += len(upper_triangular)
+                total_sum += np.sum(upper_triangular)
+
+            data_mean = total_sum / total_len
+
+            return data_mean
+        else:
+            raise NotImplementedError("Degree higher than 3 is not implemented.")
+
+    @classmethod
+    def get_test_params(cls, parameter_set="default"):
+        """Return testing parameter settings for the estimator.
+
+        Parameters
+        ----------
+        parameter_set : str, default="default"
+            Name of the set of test parameters to return, for use in tests. If no
+            special parameters are defined for a value, will return ``"default"`` set.
+
+        Returns
+        -------
+        params : dict or list of dict, default = {}
+            Parameters to create testing instances of the class
+            Each dict are parameters to construct an "interesting" test instance, i.e.,
+            ``MyClass(**params)`` or ``MyClass(**params[i])`` creates a valid test
+            instance.
+            ``create_test_instance`` uses the first (or only) dictionary in ``params``
+        """
+        params0 = {"degree": 1, "use_index": True}
+        params1 = {"degree": 3, "use_index": False}
+        params2 = {"degree": 2, "use_index": True, "normalize_prod": True}
+        return [params0, params1, params2]


Test patch:
diff --git a/sktime/annotation/tests/test_all_annotators.py b/sktime/annotation/tests/test_all_annotators.py
index 9c5acc093..a4d9a212a 100644
--- a/sktime/annotation/tests/test_all_annotators.py
+++ b/sktime/annotation/tests/test_all_annotators.py
@@ -29,7 +29,7 @@ class AnnotatorsFixtureGenerator(BaseFixtureGenerator):
     #   additional fixtures, parameters, etc should be added here
     #   TestAllAnnotators should contain the tests only
 
-    estimator_type_filter = "series-annotator"
+    estimator_type_filter = "detector"
 
 
 class TestAllAnnotators(AnnotatorsFixtureGenerator, QuickTester):
diff --git a/sktime/annotation/tests/test_base.py b/sktime/annotation/tests/test_base.py
index 53adb6ede..06d79e80f 100644
--- a/sktime/annotation/tests/test_base.py
+++ b/sktime/annotation/tests/test_base.py
@@ -1,4 +1,4 @@
-"""Tests for the BaseSeriesAnnotator class."""
+"""Tests for the BaseDetector class."""
 
 __author__ = ["Alex-JG3"]
 __all__ = []
@@ -7,7 +7,7 @@ import pandas as pd
 import pytest
 from pandas import testing
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 
 @pytest.mark.parametrize(
@@ -43,7 +43,7 @@ from sktime.annotation.base._base import BaseSeriesAnnotator
 )
 def test_sparse_to_dense(y_sparse, y_dense_expected, index):
     """Test converting from sparse to dense."""
-    y_dense_actual = BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
+    y_dense_actual = BaseDetector.sparse_to_dense(y_sparse, index=index)
     testing.assert_series_equal(y_dense_actual, y_dense_expected)
 
 
@@ -63,7 +63,7 @@ def test_sparse_to_dense(y_sparse, y_dense_expected, index):
 )
 def test_dense_to_sparse(y_dense, y_sparse_expected):
     """Test converting from dense to sparse."""
-    y_sparse_actual = BaseSeriesAnnotator.dense_to_sparse(y_dense)
+    y_sparse_actual = BaseDetector.dense_to_sparse(y_dense)
     testing.assert_series_equal(y_sparse_actual, y_sparse_expected)
 
 
@@ -83,9 +83,7 @@ def test_dense_to_sparse(y_dense, y_sparse_expected):
 )
 def test_change_points_to_segments(change_points, expected_segments, start, end):
     """Test converting change points to segments."""
-    actual_segments = BaseSeriesAnnotator.change_points_to_segments(
-        change_points, start, end
-    )
+    actual_segments = BaseDetector.change_points_to_segments(change_points, start, end)
     testing.assert_series_equal(actual_segments, expected_segments)
 
 
@@ -103,7 +101,7 @@ def test_change_points_to_segments(change_points, expected_segments, start, end)
 )
 def test_segments_to_change_points(segments, expected_change_points):
     """Test converting change points to segments."""
-    actual_change_points = BaseSeriesAnnotator.segments_to_change_points(segments)
+    actual_change_points = BaseDetector.segments_to_change_points(segments)
     testing.assert_series_equal(
         actual_change_points, expected_change_points, check_dtype=False
     )
@@ -123,7 +121,7 @@ def test_segments_to_change_points(segments, expected_change_points):
     ],
 )
 def test_sparse_segments_to_dense(y_sparse, index, y_dense_expected):
-    y_dense_actual = BaseSeriesAnnotator._sparse_segments_to_dense(y_sparse, index)
+    y_dense_actual = BaseDetector._sparse_segments_to_dense(y_sparse, index)
     testing.assert_series_equal(y_dense_expected, y_dense_actual)
 
 
@@ -132,5 +130,5 @@ def test_sparse_segments_to_dense(y_sparse, index, y_dense_expected):
     [(pd.Series([2, 4]), [0, 1, 2, 3, 4, 5, 6], pd.Series([0, 0, 1, 0, 1, 0, 0]))],
 )
 def test_sparse_points_to_dense(y_sparse, index, y_dense_expected):
-    y_dense_actual = BaseSeriesAnnotator._sparse_points_to_dense(y_sparse, index)
+    y_dense_actual = BaseDetector._sparse_points_to_dense(y_sparse, index)
     testing.assert_series_equal(y_dense_actual, y_dense_expected)
diff --git a/sktime/performance_metrics/forecasting/sample_weight/tests/__init__.py b/sktime/performance_metrics/forecasting/sample_weight/tests/__init__.py
new file mode 100644
index 000000000..1af936133
--- /dev/null
+++ b/sktime/performance_metrics/forecasting/sample_weight/tests/__init__.py
@@ -0,0 +1,1 @@
+"""Tests for sktime sample weight generators."""
diff --git a/sktime/performance_metrics/forecasting/sample_weight/tests/test_sample_weight_generator.py b/sktime/performance_metrics/forecasting/sample_weight/tests/test_sample_weight_generator.py
new file mode 100644
index 000000000..4cd7e1ca0
--- /dev/null
+++ b/sktime/performance_metrics/forecasting/sample_weight/tests/test_sample_weight_generator.py
@@ -0,0 +1,260 @@
+"""Tests for sample weight generators."""
+
+import numpy as np
+import pandas as pd
+import pytest
+
+from sktime.performance_metrics.forecasting.sample_weight._base import (
+    BaseSampleWeightGenerator,
+)
+from sktime.performance_metrics.forecasting.sample_weight._types import (
+    check_sample_weight_generator,
+)
+from sktime.tests.test_switch import run_test_module_changed
+
+
+class DummyWeightGenerator(BaseSampleWeightGenerator):
+    def __call__(self, y_true, y_pred=None, **kwargs) -> None:
+        return None
+
+
+class UniformWeightGenerator(BaseSampleWeightGenerator):
+    def __call__(self, y_true, y_pred=None, **kwargs) -> np.ndarray:
+        return np.ones_like(y_true)
+
+
+class RecencyWeightGenerator(BaseSampleWeightGenerator):
+    def __init__(self, decay_rate=0.1):
+        self.decay_rate = decay_rate
+
+    def __call__(self, y_true, y_pred=None, **kwargs):
+        weights = np.exp(-self.decay_rate * np.arange(len(y_true))[::-1])
+        return weights / np.sum(weights)
+
+
+class DateRangeWeightGenerator(BaseSampleWeightGenerator):
+    def __init__(self, date_ranges, default_weight=1.0):
+        self.date_ranges = date_ranges
+        self.default_weight = default_weight
+
+    def _get_dt(self, date_series):
+        """Get the datetime object from the series."""
+        dt = date_series
+        if isinstance(date_series, pd.Timestamp):
+            dt = date_series
+        elif isinstance(date_series, pd.DatetimeIndex):
+            dt = date_series
+        elif isinstance(date_series, pd.Series):
+            dt = date_series.dt
+        elif isinstance(date_series, pd.DataFrame):
+            dt = date_series.dt
+        elif isinstance(date_series, np.datetime64):
+            dt = pd.to_datetime(date_series)
+        else:
+            msg = f"Invalid type for conversion to datetime: {type(date_series)}"
+            raise ValueError(msg)
+        return dt
+
+    def __call__(self, y_true, y_pred=None, **kwargs):
+        if "dates" not in kwargs:
+            msg = "'dates' must be provided in kwargs for DateRangeWeightGenerator"
+            raise ValueError(msg)
+
+        if not (
+            isinstance(self.date_ranges, list)
+            and (
+                all(isinstance(range_config, dict) for range_config in self.date_ranges)
+            )
+        ):
+            raise ValueError("'date_ranges' must be a list of dictionaries")
+
+        if not all(
+            "start" in range_config
+            and "end" in range_config
+            and "weight" in range_config
+            for range_config in self.date_ranges
+        ):
+            msg = "'date_ranges' must be a list of dicts with the keys: "
+            msg += "'start', 'end', and 'weight'"
+            raise ValueError(msg)
+
+        dates = pd.to_datetime(kwargs["dates"])
+        weights = np.full(len(y_true), self.default_weight)
+
+        for range_config in self.date_ranges:
+            start_date = pd.to_datetime(range_config["start"], format="%m-%d")
+            end_date = pd.to_datetime(range_config["end"], format="%m-%d")
+
+            dt = self._get_dt(dates)
+            mask = (
+                (dt.month >= start_date.month)
+                & (dt.month <= end_date.month)
+                & (dt.day >= start_date.day)
+                & (dt.day <= end_date.day)
+            )
+            weights[mask] = range_config["weight"]
+
+        return weights / np.sum(weights)
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_base_sample_weight_generator():
+    """Test BaseSampleWeightGenerator."""
+
+    class TestGenerator(BaseSampleWeightGenerator):
+        def __call__(self, y_true, y_pred=None, **kwargs):
+            return np.ones_like(y_true)
+
+    generator = TestGenerator()
+    y_true = np.array([1, 2, 3])
+    weights = generator(y_true)
+
+    assert isinstance(weights, np.ndarray)
+    assert np.array_equal(weights, np.ones_like(y_true))
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_check_sample_weight_generator():
+    """Test check_sample_weight_generator function."""
+
+    def valid_generator(y_true, y_pred=None, **kwargs):
+        return np.ones_like(y_true)
+
+    def valid_generator_no_params(y_true, y_pred=None, **kwargs):
+        return None
+
+    def valid_generator_no_y_pred(y_true, **kwargs):
+        return np.ones_like(y_true)
+
+    assert check_sample_weight_generator(valid_generator)
+    assert check_sample_weight_generator(valid_generator_no_params)
+    assert check_sample_weight_generator(valid_generator_no_y_pred)
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_check_sample_weight_generator_are_invalid():
+    """Test check_sample_weight_generator function."""
+
+    def valid_generator_no_kwargs(y_true, y_pred=None):
+        return np.ones_like(y_true)
+
+    def invalid_generator():
+        return "invalid"
+
+    def invalid_generator_no_param_y_true(invalid):
+        return np.ones((1, 1))
+
+    # Validate
+    with pytest.raises(ValueError):
+        check_sample_weight_generator(valid_generator_no_kwargs)
+
+    with pytest.raises(ValueError):
+        check_sample_weight_generator(invalid_generator)
+
+    with pytest.raises(ValueError):
+        check_sample_weight_generator(invalid_generator_no_param_y_true)
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_dummy_weight_generator():
+    generator = DummyWeightGenerator()
+    y_true = np.array([1, 2, 3])
+    weights = generator(y_true)
+
+    assert weights is None
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_uniform_weight_generator():
+    generator = UniformWeightGenerator()
+    y_true = np.array([1, 2, 3])
+    weights = generator(y_true)
+
+    assert isinstance(weights, np.ndarray)
+    assert np.array_equal(weights, np.ones_like(y_true))
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_recency_weight_generator():
+    generator = RecencyWeightGenerator(decay_rate=0.1)
+    y_true = np.array([1, 2, 3])
+    weights = generator(y_true)
+
+    assert isinstance(weights, np.ndarray)
+    assert len(weights) == len(y_true)
+    assert np.all(weights[:-1] < weights[1:])  # Weights should be increasing
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_date_range_weight_generator():
+    date_ranges = [
+        {"start": "01-01", "end": "03-31", "weight": 2},
+        {"start": "06-01", "end": "08-31", "weight": 3},
+    ]
+    generator = DateRangeWeightGenerator(date_ranges=date_ranges)
+    y_true = np.array([1, 2, 3, 4, 5])
+    dates = pd.date_range(start="2023-01-01", periods=5, freq="MS")
+    weights = generator(y_true, dates=dates)
+
+    assert isinstance(weights, np.ndarray)
+    assert len(weights) == len(y_true)
+    assert weights[0] > weights[3]  # January should have higher weight than April
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_sample_weight_generator_with_y_pred():
+    class TestGenerator(BaseSampleWeightGenerator):
+        def __call__(self, y_true, y_pred=None, **kwargs):
+            if y_pred is None:
+                return np.ones_like(y_true)
+            return np.abs(y_true - y_pred)
+
+    generator = TestGenerator()
+    y_true = np.array([1, 2, 3])
+    y_pred = np.array([1.1, 2.2, 2.8])
+    weights = generator(y_true, y_pred)
+
+    assert isinstance(weights, np.ndarray)
+    assert np.allclose(weights, np.abs(y_true - y_pred))
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+def test_sample_weight_generator_with_kwargs():
+    class TestGenerator(BaseSampleWeightGenerator):
+        def __call__(self, y_true, y_pred=None, **kwargs):
+            factor = kwargs.get("factor", 1)
+            return np.ones_like(y_true) * factor
+
+    generator = TestGenerator()
+    y_true = np.array([1, 2, 3])
+    weights = generator(y_true, factor=2)
+
+    assert isinstance(weights, np.ndarray)
+    assert np.array_equal(weights, np.ones_like(y_true) * 2)
diff --git a/sktime/performance_metrics/tests/test_performance_metrics_forecasting.py b/sktime/performance_metrics/tests/test_performance_metrics_forecasting.py
index 5789c8121..63ff1d140 100644
--- a/sktime/performance_metrics/tests/test_performance_metrics_forecasting.py
+++ b/sktime/performance_metrics/tests/test_performance_metrics_forecasting.py
@@ -47,6 +47,9 @@ from sktime.performance_metrics.forecasting import (
     median_squared_scaled_error,
     relative_loss,
 )
+from sktime.performance_metrics.forecasting.sample_weight._base import (
+    BaseSampleWeightGenerator,
+)
 from sktime.performance_metrics.tests._config import RANDOM_SEED
 from sktime.tests.test_switch import run_test_module_changed
 from sktime.utils._testing.series import _make_series
@@ -588,3 +591,99 @@ def test_y_true_y_pred_inconsistent_n_variables_raises_error(metric_func_name):
         ValueError, match="y_true and y_pred have different number of output"
     ):
         metric_func(y_true, y_pred, y_train=y_train, y_pred_benchmark=y_pred_benchmark)
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+@pytest.mark.parametrize("random_state", RANDOM_STATES)
+@pytest.mark.parametrize("metric_func_name", LOSS_RESULTS.keys())
+def test_sample_weight_generator_has_no_effect_on_metric_function(
+    metric_func_name, random_state
+):
+    """Tests that loss function with univariate input should return scalar number."""
+    y = _make_series(n_timepoints=75, random_state=random_state)
+    y_train, y_true = y.iloc[:50], y.iloc[50:]
+    y_pred = y.shift(1).iloc[50:]
+    y_pred_benchmark = y.rolling(2).mean().iloc[50:]
+
+    class TestWeightGenerator(BaseSampleWeightGenerator):
+        def __call__(self, y_true, y_pred=None, **kwargs):
+            return np.arange(1, len(y_true) + 1)
+
+    weight_generator = TestWeightGenerator()
+
+    metric_func = LOSS_RESULTS[metric_func_name]["func"]
+
+    function_loss = metric_func(
+        y_true, y_pred, y_train=y_train, y_pred_benchmark=y_pred_benchmark
+    )
+
+    function_loss_with_weights = metric_func(
+        y_true,
+        y_pred,
+        y_train=y_train,
+        y_pred_benchmark=y_pred_benchmark,
+        sample_weight=weight_generator,
+    )
+
+    is_num = is_numeric_dtype(function_loss)
+    is_scalar = np.isscalar(function_loss)
+    assert is_num and is_scalar, " ".join(
+        ["Loss function with univariate input should return scalar number"]
+    )
+
+    is_num = is_numeric_dtype(function_loss_with_weights)
+    is_scalar = np.isscalar(function_loss_with_weights)
+    assert is_num and is_scalar, " ".join(
+        ["Loss function with sample weight generator should return scalar number"]
+    )
+
+    assert np.isclose(function_loss, function_loss_with_weights), " ".join(
+        ["Loss function with sample weight generator should return different value"]
+    )
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.performance_metrics"]),
+    reason="Run if performance_metrics module has changed.",
+)
+@pytest.mark.parametrize("random_state", RANDOM_STATES)
+@pytest.mark.parametrize(
+    "metric_class",
+    [
+        MeanSquaredError,
+        MeanAbsoluteError,
+        MeanAbsolutePercentageError,
+    ],
+)
+def test_sample_weight_generator_is_passed_to_func(metric_class, random_state):
+    """Tests that loss function with univariate input should return scalar number."""
+    y = _make_series(n_timepoints=75, random_state=random_state)
+    y_train, y_true = y.iloc[:50], y.iloc[50:]
+    y_pred = y.shift(1).iloc[50:]
+    y_pred_benchmark = y.rolling(2).mean().iloc[50:]
+
+    class TestWeightGenerator(BaseSampleWeightGenerator):
+        def __call__(self, y_true, y_pred=None, **kwargs):
+            return np.arange(1, len(y_true) + 1)
+
+    weight_generator = TestWeightGenerator()
+
+    metric = metric_class()
+
+    function_loss = metric(
+        y_true, y_pred, y_train=y_train, y_pred_benchmark=y_pred_benchmark
+    )
+    function_loss_with_weights = metric(
+        y_true,
+        y_pred,
+        y_train=y_train,
+        y_pred_benchmark=y_pred_benchmark,
+        sample_weight=weight_generator,
+    )
+
+    assert not np.isclose(function_loss, function_loss_with_weights), " ".join(
+        ["Loss function with sample weight generator should return different value"]
+    )
diff --git a/sktime/registry/tests/test_lookup.py b/sktime/registry/tests/test_lookup.py
index e192d9311..96ebd776f 100644
--- a/sktime/registry/tests/test_lookup.py
+++ b/sktime/registry/tests/test_lookup.py
@@ -239,7 +239,15 @@ def test_all_estimators_tag_filter(pred_int):
 def test_scitype_inference(estimator_scitype):
     """Check that scitype inverts _check_estimator_types."""
     base_class = _check_estimator_types(estimator_scitype)[0]
-    inferred_scitype = scitype(base_class)
+    all_scitypes = scitype(base_class, force_single_scitype=False, coerce_to_list=True)
+    inferred_scitype = all_scitypes[0]
+
+    # stepout for detector due to rename in scitype
+    # todo 0.37.0 - replace "detector" with "series-annotator"
+    # todo 1.0.0 - remove this stepout entirely
+    if estimator_scitype == "detector":
+        assert "detector" in all_scitypes
+        return None
 
     assert (
         inferred_scitype == estimator_scitype
diff --git a/sktime/tests/_config.py b/sktime/tests/_config.py
index fee1cba91..a43c609cc 100644
--- a/sktime/tests/_config.py
+++ b/sktime/tests/_config.py
@@ -319,7 +319,6 @@ EXCLUDED_TESTS_BY_TEST = {
         "MiniRocketMultivariate",
         "MiniRocketMultivariateVariable",
         "MultiRocket",
-        "MultiRocketMultivariate",
         "MultioutputTabularRegressionForecaster",
         "MultioutputTimeSeriesRegressionForecaster",
         "OnlineEnsembleForecaster",
diff --git a/sktime/tests/test_class_register.py b/sktime/tests/test_class_register.py
index 461e55268..8f1f57a73 100644
--- a/sktime/tests/test_class_register.py
+++ b/sktime/tests/test_class_register.py
@@ -54,12 +54,14 @@ def get_test_class_registry():
     # so also imply estimator and object tests, or only object tests
     testclass_dict["aligner"] = TestAllAligners
     testclass_dict["classifier"] = TestAllClassifiers
+    testclass_dict["detector"] = TestAllAnnotators
     testclass_dict["distribution"] = TestAllDistributions
     testclass_dict["early_classifier"] = TestAllEarlyClassifiers
     testclass_dict["forecaster"] = TestAllForecasters
     testclass_dict["global_forecaster"] = TestAllGlobalForecasters
     testclass_dict["param_est"] = TestAllParamFitters
     testclass_dict["regressor"] = TestAllRegressors
+    # todo 1.0.0 - remove series-annotator
     testclass_dict["series-annotator"] = TestAllAnnotators
     testclass_dict["splitter"] = TestAllSplitters
     testclass_dict["transformer"] = TestAllTransformers