Repository: sktime/sktime
Pull request #7544 (2024-12-18 14:19:54)

[BUG] Accepting prereleases as valid python version
#### Reference Issues/PRs
Fixes: https://github.com/sktime/sktime/issues/7517

#### What does this implement/fix? Explain your changes.
Make "rc" python version recognizable during python version checking.
Introducing a parameter `prereleases=True`
The following code snipped now returns true:
```python
"3.11.0rc1" in SpecifierSet(">3.8", prereleases=True) 
```
This is controlled by a parameter of _check_python_version with default as `True`

#### Does your contribution introduce a new dependency? If yes, which one?
No

#### What should a reviewer concentrate their feedback on?
On the tests regarding checking python versions.

#### Did you add any tests for the change?

No

#### Any other comments?
<!--
We value all user contributions, no matter how small or complex they are. If you have any questions, feel free to post
in the dev-chat channel on the sktime discord https://discord.com/invite/54ACzaFsn7. If we are slow to review (>3 working days), likewise feel free to ping us on discord. Thank you for your understanding during the review process.
-->

#### PR checklist
<!--
Please go through the checklist below. Please feel free to remove points if they are not applicable.
-->

##### For all contributions
- [x] I've added myself to the [list of contributors](https://github.com/sktime/sktime/blob/main/CONTRIBUTORS.md) with any new badges I've earned :-)
  How to: add yourself to the [all-contributors file](https://github.com/sktime/sktime/blob/main/.all-contributorsrc) in the `sktime` root directory (not the `CONTRIBUTORS.md`). Common badges: `code` - fixing a bug, or adding code logic. `doc` - writing or improving documentation or docstrings. `bug` - reporting or diagnosing a bug (get this plus `code` if you also fixed the bug in the PR).`maintenance` - CI, test framework, release.
  See here for [full badge reference](https://allcontributors.org/docs/en/emoji-key)
governance.html#algorithm-maintainers).
- [x] The PR title starts with either [ENH], [MNT], [DOC], or [BUG]. [BUG] - bugfix, [MNT] - CI, test framework, [ENH] - adding or improving code, [DOC] - writing or improving documentation or docstrings.


<!--
Thanks for contributing!
-->


Abelarm: > Approved on priciple, but will request you to kindly add a test for both True and False cases using `_check_python_version`.
> 
> Also I am wondering (question for @fkiraly primarily) how to reduce and hopefully eliminate duplication between sktime and skbase.

is ok to just test the functionality of `_check_python_version` standalone, not integrated with everything else? 

Regarding the questio for @fkiraly  I crated a PR in skbase as well https://github.com/sktime/skbase/pull/389
fkiraly: > Also I am wondering (question for @fkiraly primarily) how to reduce and hopefully eliminate duplication between sktime and skbase.

I was planning to do that once the packages have been in sync for a number of minor releases ... but this change of course resets the timer. Or, does it?

Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index fa6c6a0a7..b63d6260c 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -2800,6 +2800,15 @@
         "doc"
       ]
     },
+    {
+      "login": "Abelarm",
+      "name": "Luigi Giugliano",
+      "avatar_url": "https://avatars.githubusercontent.com/u/6976921?v=4",
+      "profile": "https://github.com/Abelarm",
+      "contributions": [
+        "code"
+      ]
+    },
     {
       "login": "morestart",
       "name": "ctl",
@@ -3295,6 +3304,33 @@
         "doc",
         "code"
       ]
+    },
+    {
+      "login": "marcosfelt",
+      "name": "Kobi Felton",
+      "avatar_url": "https://avatars.githubusercontent.com/u/25933639?v=4",
+      "profile": "https://github.com/marcosfelt",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "b9junkers",
+      "name": "Shounak Shirodkar",
+      "avatar_url": "https://avatars.githubusercontent.com/u/54496663?v=4",
+      "profile": "https://github.com/b9junkers",
+      "contributions": [
+        "doc"
+      ]
+    },
+    {
+      "login": "VjayRam",
+      "name": "Vijay Ram Enaganti",
+      "avatar_url": "https://avatars.githubusercontent.com/u/76694566?v=4",
+      "profile": "https://github.com/VjayRam",
+      "contributions": [
+        "doc"
+      ]
     }
   ]
 }
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 69fedd936..7bfa40d72 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-324-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-325-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!
@@ -211,12 +211,13 @@ 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/Abelarm"><img src="https://avatars.githubusercontent.com/u/6976921?v=4?s=100" width="100px;" alt="Luigi Giugliano"/><br /><sub><b>Luigi Giugliano</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Abelarm" title="Code">💻</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>
       <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>
     </tr>
     <tr>
+      <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>
@@ -225,9 +226,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/martin-walter-1a33b3114/"><img src="https://avatars0.githubusercontent.com/u/29627036?v=4?s=100" width="100px;" alt="Martin Walter"/><br /><sub><b>Martin Walter</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=aiwalter" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Aaiwalter" title="Bug reports">🐛</a> <a href="#projectManagement-aiwalter" title="Project Management">📆</a> <a href="#fundingFinding-aiwalter" title="Funding Finding">🔍</a> <a href="#mentoring-aiwalter" title="Mentoring">🧑‍🏫</a> <a href="#ideas-aiwalter" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-aiwalter" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Aaiwalter" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=aiwalter" title="Documentation">📖</a> <a href="#talk-aiwalter" title="Talks">📢</a></td>
       <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>
@@ -236,9 +237,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Hephaest"><img src="https://avatars2.githubusercontent.com/u/37981444?v=4?s=100" width="100px;" alt="Miao Cai"/><br /><sub><b>Miao Cai</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AHephaest" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Hephaest" title="Code">💻</a></td>
       <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>
@@ -247,9 +248,9 @@ 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/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/mjste"><img src="https://avatars.githubusercontent.com/mjste?s=100" width="100px;" alt="Michał Stefanik"/><br /><sub><b>Michał Stefanik</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mjste" title="Documentation">📖</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>
     </tr>
     <tr>
+      <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>
       <td align="center" valign="top" width="11.11%"><a href="https://moradabaz.github.io/"><img src="https://avatars.githubusercontent.com/u/29915156?v=4?s=100" width="100px;" alt="Morad :)"/><br /><sub><b>Morad :)</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=moradabaz" title="Documentation">📖</a></td>
@@ -258,9 +259,9 @@ 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/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/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>
@@ -269,9 +270,9 @@ 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/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="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>
@@ -280,9 +281,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <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/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>
@@ -291,9 +292,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
       <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>
@@ -302,9 +303,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
       <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>
@@ -313,9 +314,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
       <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>
@@ -324,9 +325,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <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>
-      <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>
     </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://github.com/Sohaib-Ahmed21"><img src="https://avatars.githubusercontent.com/Sohaib-Ahmed21?s=100" width="100px;" alt="Sohaib Ahmed"/><br /><sub><b>Sohaib Ahmed</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Sohaib-Ahmed21" title="Code">💻</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>
@@ -335,9 +336,9 @@ 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/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/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>
       <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>
@@ -346,9 +347,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <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/vagechirkov"><img src="https://avatars.githubusercontent.com/vagechirkov?s=100" width="100px;" alt="Valerii Chirkov"/><br /><sub><b>Valerii Chirkov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vagechirkov" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vagechirkov" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/vagechirkov"><img src="https://avatars.githubusercontent.com/vagechirkov?s=100" width="100px;" alt="Valerii Chirkov"/><br /><sub><b>Valerii Chirkov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vagechirkov" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vagechirkov" 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>
       <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>
@@ -357,9 +358,9 @@ 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/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>
     </tr>
     <tr>
+      <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>
       <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>
@@ -368,9 +369,9 @@ 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/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>
     </tr>
     <tr>
+      <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>
       <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>
@@ -379,9 +380,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
@@ -390,9 +391,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
@@ -401,9 +402,9 @@ 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/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>
       <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>
     </tr>
     <tr>
+      <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>
@@ -412,6 +413,8 @@ 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/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>
       <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>
+    </tr>
+    <tr>
       <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>
     </tr>
   </tbody>
diff --git a/docs/source/api_reference/forecasting.rst b/docs/source/api_reference/forecasting.rst
index d84765ba2..8e765eac9 100644
--- a/docs/source/api_reference/forecasting.rst
+++ b/docs/source/api_reference/forecasting.rst
@@ -134,6 +134,7 @@ Direct and recursive - 3rd party
     :template: class.rst
 
     SkforecastAutoreg
+    SkforecastRecursive
 
 .. currentmodule:: sktime.forecasting.darts
 
diff --git a/docs/source/api_reference/tags.rst b/docs/source/api_reference/tags.rst
index 623486153..269406311 100644
--- a/docs/source/api_reference/tags.rst
+++ b/docs/source/api_reference/tags.rst
@@ -200,3 +200,4 @@ The tags below have limited use in retrieval or inspection of objects.
 
     x_inner_mtype
     y_inner_mtype
+    visual_block_kind
diff --git a/pyproject.toml b/pyproject.toml
index 97798086d..1a8a24356 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -104,9 +104,9 @@ all_extras = [
   'scikit_posthocs>=0.6.5; python_version < "3.13"',
   'seaborn>=0.11; python_version < "3.13"',
   'seasonal; python_version < "3.13"',
-  'skforecast<0.14,>=0.12.1; python_version < "3.13"',
+  'skforecast<0.15,>=0.12.1; python_version < "3.13"',
   "skpro>=2,<2.9.0",
-  'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
+  'statsforecast<2.1.0,>=1.0.0; python_version < "3.13"',
   'statsmodels>=0.12.1; python_version < "3.13"',
   'stumpy>=1.5.1; python_version < "3.11"',
   'tbats>=1.1; python_version < "3.12"',
@@ -146,9 +146,9 @@ all_extras_pandas2 = [
   'scikit_posthocs>=0.6.5; python_version < "3.13"',
   'seaborn>=0.11; python_version < "3.13"',
   'seasonal; python_version < "3.13"',
-  'skforecast<0.14,>=0.12.1; python_version < "3.13"',
+  'skforecast<0.15,>=0.12.1; python_version < "3.13"',
   'skpro>=2,<2.9.0',
-  'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
+  'statsforecast<2.1.0,>=1.0.0; python_version < "3.13"',
   'statsmodels>=0.12.1; python_version < "3.13"',
   'stumpy>=1.5.1; python_version < "3.11"',
   'tbats>=1.1; python_version < "3.12"',
@@ -200,9 +200,9 @@ forecasting = [
   'autots<0.7,>=0.6.1; python_version < "3.13"',
   'pmdarima!=1.8.1,<2.1,>=1.8; python_version < "3.12"',
   'prophet<1.2,>=1.1; python_version < "3.13"',
-  'skforecast<0.14,>=0.12.1; python_version < "3.13"',
+  'skforecast<0.15,>=0.12.1; python_version < "3.13"',
   "skpro>=2,<2.9.0",
-  'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
+  'statsforecast<2.1.0,>=1.0.0; python_version < "3.13"',
   'statsmodels<0.15,>=0.12.1; python_version < "3.13"',
   'tbats<1.2,>=1.1; python_version < "3.12"',
 ]
diff --git a/sktime/classification/deep_learning/cnn.py b/sktime/classification/deep_learning/cnn.py
index d8c37ce76..05b5128bf 100644
--- a/sktime/classification/deep_learning/cnn.py
+++ b/sktime/classification/deep_learning/cnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNClassifier(BaseDeepClassifier):
     """Time Convolutional Neural Network (CNN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -51,11 +54,6 @@ class CNNClassifier(BaseDeepClassifier):
           ``input_shape[0] < 60`` in the input layer, and ``"valid"`` otherwise.
         - "valid", "same", and other values are passed directly to ``Conv1D``
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -75,7 +73,8 @@ class CNNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "TonyBagnall"],
+        "authors": ["hfawaz", "James-Large"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/classification/deep_learning/cntc.py b/sktime/classification/deep_learning/cntc.py
index 6238ac9c7..e4404761a 100644
--- a/sktime/classification/deep_learning/cntc.py
+++ b/sktime/classification/deep_learning/cntc.py
@@ -12,6 +12,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNTCClassifier(BaseDeepClassifier):
     """Contextual Time-series Neural Classifier (CNTC), as described in [1].
 
+    Adapted from the implementation from Fullah et. al
+    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -38,11 +41,6 @@ class CNTCClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizer, default=keras.optimizers.Adam(),
     metrics         : list of strings, default=["accuracy"],
 
-    Notes
-    -----
-    Adapted from the implementation from Fullah et. al
-    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
-
     References
     ----------
     .. [1] Network originally defined in:
@@ -73,7 +71,13 @@ class CNTCClassifier(BaseDeepClassifier):
     """
 
     _tags = {
-        "authors": ["James-Large", "Withington", "TonyBagnall", "AurumnPegasus"],
+        "authors": [
+            "AmaduFullah",
+            "James-Large",
+            "Withington",
+            "TonyBagnall",
+            "AurumnPegasus",
+        ],
         "maintainers": ["James-Large", "Withington", "AurumnPegasus"],
         "python_dependencies": ["tensorflow", "keras-self-attention"],
     }
diff --git a/sktime/classification/deep_learning/fcn.py b/sktime/classification/deep_learning/fcn.py
index 6a1470c33..2d0b9b5fd 100644
--- a/sktime/classification/deep_learning/fcn.py
+++ b/sktime/classification/deep_learning/fcn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNClassifier(BaseDeepClassifier):
     """Fully Connected Neural Network (FCN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -39,11 +42,6 @@ class FCNClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -63,7 +61,8 @@ class FCNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus"],
         # estimator type handled by parent class
     }
diff --git a/sktime/classification/deep_learning/lstmfcn.py b/sktime/classification/deep_learning/lstmfcn.py
index 983d6c82f..e4e9aa46d 100644
--- a/sktime/classification/deep_learning/lstmfcn.py
+++ b/sktime/classification/deep_learning/lstmfcn.py
@@ -15,10 +15,8 @@ from sktime.networks.lstmfcn import LSTMFCNNetwork
 class LSTMFCNClassifier(BaseDeepClassifier):
     """Implementation of LSTMFCNClassifier from Karim et al (2019) [1].
 
-    Overview
-    --------
-     Combines an LSTM arm with a CNN arm. Optionally uses an attention mechanism in the
-     LSTM which the author indicates provides improved performance.
+    Combines an LSTM arm with a CNN arm. Optionally uses an attention mechanism in the
+    LSTM which the author indicates provides improved performance.
 
     Parameters
     ----------
diff --git a/sktime/classification/deep_learning/mcdcnn.py b/sktime/classification/deep_learning/mcdcnn.py
index a84c21e9b..d11832a66 100644
--- a/sktime/classification/deep_learning/mcdcnn.py
+++ b/sktime/classification/deep_learning/mcdcnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MCDCNNClassifier(BaseDeepClassifier):
     """Multi Channel Deep Convolutional Neural Classifier, as described in [1]_.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
+
     Parameters
     ----------
     n_epochs : int, optional (default=120)
@@ -57,11 +60,6 @@ class MCDCNNClassifier(BaseDeepClassifier):
     random_state : int, optional (default=0)
         The seed to any random action.
 
-    Notes
-    -----
-    Adapted from the implementation of Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
-
     References
     ----------
     .. [1] Zheng et. al, Time series classification using multi-channels deep
@@ -81,7 +79,7 @@ class MCDCNNClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["james-large"],
+        "authors": ["hfawaz", "james-large"],
         "maintainers": ["james-large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/classification/deep_learning/mlp.py b/sktime/classification/deep_learning/mlp.py
index e8c770116..7e6c9f7d0 100644
--- a/sktime/classification/deep_learning/mlp.py
+++ b/sktime/classification/deep_learning/mlp.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPClassifier(BaseDeepClassifier):
     """Multi Layer Perceptron Network (MLP), as described in [1]_.
 
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -39,11 +42,6 @@ class MLPClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1] Wang et. al, Time series classification from
@@ -63,7 +61,8 @@ class MLPClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus"],
         # estimator type handled by parent class
     }
diff --git a/sktime/classification/deep_learning/resnet.py b/sktime/classification/deep_learning/resnet.py
index 82e46c667..6a2a84b28 100644
--- a/sktime/classification/deep_learning/resnet.py
+++ b/sktime/classification/deep_learning/resnet.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetClassifier(BaseDeepClassifier):
     """Residual Neural Network as described in [1].
 
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
+
     Parameters
     ----------
     n_epochs       : int, default = 1500
@@ -38,12 +41,6 @@ class ResNetClassifier(BaseDeepClassifier):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
         .. [1] Wang et. al, Time series classification from
@@ -63,7 +60,8 @@ class ResNetClassifier(BaseDeepClassifier):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus", "nilesh05apr"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus", "nilesh05apr"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         "python_dependencies": ["tensorflow"],
         # estimator type handled by parent class
diff --git a/sktime/datatypes/_panel/_check.py b/sktime/datatypes/_panel/_check.py
index f0040ac44..723056216 100644
--- a/sktime/datatypes/_panel/_check.py
+++ b/sktime/datatypes/_panel/_check.py
@@ -1184,7 +1184,58 @@ def _check_polars_panel(obj, return_metadata=False, var_name="obj", scitype="Pan
 
 
 class PanelGluontsList(ScitypePanel):
-    """Data type: polars.DataFrame based specification of panel of time series.
+    """Data type: gluonTS representation of univariate and multivariate time series.
+
+    Name: ``"gluonts_ListDataset_panel"``
+
+    Short description:
+
+    A ``list`` of ``dict``,
+    with list index = instances, ``dict['target']`` rows = time points,
+    ``dict['target']`` cols = variables, and ``dict['start']`` marking the interval.
+    Identical to ``gluonts.dataset.common.ListDataset``.
+
+    Long description:
+
+    The ``"gluonts_ListDataset_panel"`` :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 ``dict``.
+      Each ``dict`` must contain a key ``"target"``which
+      maps to a 1D ``numpy.ndarray`` for a univariate, and
+      2D ``numpy.ndarray`` for a multivariate time series.
+      Optionally, it may also contain a key ``"start"``
+      that maps to a ``pandas.Period`` object.
+      eg: ``pandas.Period("2024-01-01", freq="D")`` for a time series starting
+      on 2024-01-01 and sampled daily.
+    * 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]['target']`` correspond to
+      different, distinct time points, at which
+      instance ``i`` is observed.
+    * time index: the time index is implicit and by-convention.
+      The ``j``-th element (for an integer ``j``) of instance ``i`` is interpreted
+      as an observation at the time point ``j``.
+      If ``"start"`` key is present, the time index for
+      the ``j``-th element of instance ``i`` is ``obj[i]['start'] + j``.
+    * variables: columns of ``obj[i]['target']`` correspond to different variables
+      available for instance ``i``.
+    * variable names: ``numpy`` mtypes cannot represent variable names. If required,
+      then variable names are assigned ``"value_{k}``
+      where ``k`` is the feature column index.
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * can not represent panels of 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
     ----------
diff --git a/sktime/datatypes/_series/_base.py b/sktime/datatypes/_series/_base.py
index 4469a6e3d..04f701cb1 100644
--- a/sktime/datatypes/_series/_base.py
+++ b/sktime/datatypes/_series/_base.py
@@ -25,7 +25,7 @@ class ScitypeSeries(BaseDatatype):
 
     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`
+    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:
diff --git a/sktime/datatypes/_table/_check.py b/sktime/datatypes/_table/_check.py
index 4517e7338..72ac6a383 100644
--- a/sktime/datatypes/_table/_check.py
+++ b/sktime/datatypes/_table/_check.py
@@ -45,7 +45,33 @@ PRIMITIVE_TYPES = (float, int, str)
 
 
 class TablePdDataFrame(ScitypeTable):
-    """Data type: pandas.DataFrame based specification of data frame table.
+    """Data type: pandas.DataFrame based specification of tabular data.
+
+    Name: ``"pd_DataFrame_Table"``
+
+    Short description:
+
+    a pandas ``DataFrame`` representing tabular data,
+    with rows = instances, cols = features
+
+    Long description:
+
+    The ``"pd_DataFrame_Table"`` :term:`mtype` is a concrete specification
+    that implements the ``Table`` :term:`scitype`, i.e., the abstract
+    type of tabular data.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` can be any valid pandas index.
+    * features: columns of ``obj`` correspond to different features
+    * feature names: column names ``obj.columns``
+    * instances: rows of ``obj`` correspond to different instances
+    * instance index: ``obj.index`` is interpreted as the instance index
+
+    Capabilities:
+
+    * can represent multivariate data
+    * can represent missing values
 
     Parameters are inferred by check.
 
@@ -139,7 +165,33 @@ def _check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
 
 
 class TablePdSeries(ScitypeTable):
-    """Data type: pandas.Series based specification of data frame table.
+    """Data type: pandas.Series based specification of tabular data.
+
+    Name: ``"pd_Series_Table"``
+
+    Short description:
+
+    a pandas ``Series`` representing tabular data,
+    with rows = instances, single feature
+
+    Long description:
+
+    The ``"pd_Series_Table"`` :term:`mtype` is a concrete specification
+    that implements the ``Table`` :term:`scitype`, i.e., the abstract
+    type of tabular data.
+
+    An object ``obj: pandas.Series`` follows the specification iff:
+
+    * structure convention: ``obj.index`` can be any valid pandas index.
+    * feature: the series ``obj`` represents a single feature
+    * feature name: the ``name`` attribute of the ``pd.Series`` object
+    * instances: rows of ``obj`` correspond to different instances
+    * instance index: ``obj.index`` is interpreted as the instance index
+
+    Capabilities:
+
+    * cannot represent multivariate data
+    * can represent missing values
 
     Parameters are inferred by check.
 
@@ -240,6 +292,33 @@ def _check_pdseries_table(obj, return_metadata=False, var_name="obj"):
 class TableNp1D(ScitypeTable):
     """Data type: 1D np.ndarray based specification of data frame table.
 
+    Name: ``"numpy1D"``
+
+    Short description:
+
+    a 1D numpy ``ndarray`` representing a univariate data table,
+    with elements as instances of single feature
+
+    Long description:
+
+    The ``"numpy1D"`` :term:`mtype` is a concrete specification
+    that implements the ``Table`` :term:`scitype`, i.e., the abstract
+    type of tabular data.
+
+    An object ``obj: np.ndarray`` follows the specification iff:
+
+    * structure convention: ``obj`` is a 1D numpy array.
+    * feature: the array ``obj`` represents a single feature
+    * instances: elements of ``obj`` correspond to different instances
+    * instance index: The instance index is implicit and by-convention.
+      The ``i``-th entry (for an integer ``i``) is interpreted as the ``i``-th instance.
+      That is, the index is always interpreted as zero-indexed integer.
+
+    Capabilities:
+
+    * cannot represent multivariate data
+    * can represent missing values
+
     Parameters are inferred by check.
 
     Parameters
diff --git a/sktime/detection/_datatypes/__init__.py b/sktime/detection/_datatypes/__init__.py
new file mode 100644
index 000000000..95f3aca30
--- /dev/null
+++ b/sktime/detection/_datatypes/__init__.py
@@ -0,0 +1,1 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
diff --git a/sktime/detection/_datatypes/_check.py b/sktime/detection/_datatypes/_check.py
new file mode 100644
index 000000000..b3b1c3746
--- /dev/null
+++ b/sktime/detection/_datatypes/_check.py
@@ -0,0 +1,59 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
+
+import pandas as pd
+
+
+def _is_valid_detection(obj, type="points"):
+    """Check if the input is valid common output format.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check for validity
+    type : str {"points", "segments"}
+        Type of output to check for validity
+    """
+    if not isinstance(obj, pd.DataFrame):
+        return False
+    if not isinstance(obj.index, pd.RangeIndex):
+        return False
+    if "ilocs" not in obj.columns:
+        return False
+
+    if type == "points":
+        return _is_points_dtype(obj)
+    elif type == "segments":
+        return _is_segments_dtype(obj)
+
+    return False
+
+
+def _is_points_dtype(obj):
+    """Check if the input is points-like.
+
+    Assumes validity of input is checked elsewhere.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check
+    """
+    return pd.api.types.is_integer_dtype(obj.ilocs.dtype)
+
+
+def _is_segments_dtype(obj):
+    """Check if the input is valid segments-like.
+
+    Assumes validity of input is checked elsewhere.
+
+    Parameters
+    ----------
+    obj : pd.DataFrame
+        Output of a detector to check
+    """
+    ilocs_dtype = obj.ilocs.dtype
+    if not (isinstance(ilocs_dtype, pd.IntervalDtype) or len(obj) == 0):
+        return False
+    if not len(obj) == 0:
+        return pd.api.types.is_integer_dtype(ilocs_dtype.subtype)
+    return True
diff --git a/sktime/detection/_datatypes/_convert.py b/sktime/detection/_datatypes/_convert.py
new file mode 100644
index 000000000..3d6f1c8ef
--- /dev/null
+++ b/sktime/detection/_datatypes/_convert.py
@@ -0,0 +1,80 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
+
+import numpy as np
+import pandas as pd
+
+
+def _convert_points_to_segments(points_df, len_X=None, include_labels=False):
+    """Convert points-like output to segments-like output.
+
+    Parameters
+    ----------
+    points_df : pd.DataFrame
+        Points-like output of a detector
+    len_X : int, optional, default=None
+        Length of the input data.
+        If None, the last segment is assumed to be length 1.
+    include_labels : bool, optional, default=False
+        Whether to include labels in the output.
+        If True, labels are RangeIndex of the same length as the segments.
+
+    Returns
+    -------
+    pd.DataFrame
+        Segments-like output of a detector
+    """
+    if len(points_df) == 0:
+        return pd.DataFrame(columns=["ilocs", "labels"], dtype="int64")
+
+    points = points_df.ilocs.values
+    if points[0] != 0:
+        points = np.insert(points, 0, 0)
+    if len_X is None:
+        points = np.append(points, points[-1] + 1)
+    elif points[-1] != len_X:
+        points = np.append(points, len_X)
+
+    ilocs = pd.IntervalIndex.from_breaks(points, closed="left")
+
+    df_dict = {"ilocs": ilocs}
+    if include_labels:
+        labels = pd.RangeIndex(len(ilocs))
+        df_dict["labels"] = labels
+
+    return pd.DataFrame(df_dict)
+
+
+def _convert_segments_to_points(seg_df, len_X=None):
+    """Convert points-like output to segments-like output.
+
+    Parameters
+    ----------
+    seg_df : pd.DataFrame
+        Points-like output of a detector
+    len_X : int, optional
+        Length of the input data.
+        If None, the (right point) end of the last segment is omitted.
+
+    Returns
+    -------
+    pd.DataFrame
+        Segments-like output of a detector
+    """
+    if len(seg_df) == 0:
+        return pd.DataFrame(columns=["ilocs"], dtype="int64")
+
+    ix = seg_df.set_index("ilocs").index
+    vals = np.array([ix.left.values, ix.right.values]).transpose().flatten()
+    vals = np.unique(vals)
+
+    if not ix.is_non_overlapping_monotonic:
+        vals = np.sort(vals)
+
+    if vals[0] == 0:
+        vals = vals[1:]
+
+    if len_X is None or vals[-1] == len_X:
+        vals = vals[:-1]
+
+    points_df = pd.DataFrame({"ilocs": vals})
+    return points_df
diff --git a/sktime/detection/_datatypes/_examples.py b/sktime/detection/_datatypes/_examples.py
new file mode 100644
index 000000000..7f74c22f1
--- /dev/null
+++ b/sktime/detection/_datatypes/_examples.py
@@ -0,0 +1,68 @@
+"""Utilities to handle checks and conversions between output formats of detectors."""
+
+import pandas as pd
+
+
+def _get_example_segments_0():
+    """Generate example 0 for segmentation output.
+
+    - non-overlapping
+    - non-exhaustive
+    - no labels
+    """
+    segs = pd.IntervalIndex.from_tuples([(1, 2), (3, 6), (7, 10)], "left")
+    return pd.DataFrame({"ilocs": segs})
+
+
+def _get_example_segments_1():
+    """Generate example 1 for segmentation output.
+
+    - non-overlapping
+    - non-exhaustive
+    - labeled
+    """
+    segs = pd.IntervalIndex.from_tuples([(1, 2), (3, 6), (7, 10), (12, 14)], "left")
+    labels = pd.Series([0, 1, 1, 0], index=segs)
+    return pd.DataFrame({"ilocs": segs, "labels": labels})
+
+
+def _get_example_segments_2():
+    """Generate example 2 for segmentation output.
+
+    - non-overlapping
+    - exhaustive
+    - labeled
+    """
+    segs = pd.IntervalIndex.from_tuples([(0, 2), (2, 3), (3, 7), (7, 10)], "left")
+    labels = pd.Series([0, 1, 2, 3])
+    return pd.DataFrame({"ilocs": segs, "labels": labels})
+
+
+def _get_example_points_2():
+    """Generate example 2 for point output.
+
+    Corresponds to example 2 for segmentation output.
+    """
+    points = pd.Series([2, 3, 7], name="ilocs")
+    return pd.DataFrame({"ilocs": points})
+
+
+def _get_example_segments_3():
+    """Generate example 3 for segmentation output.
+
+    - overlapping
+    - exhaustive
+    - labeled
+    """
+    segs = pd.IntervalIndex.from_tuples([(0, 3), (2, 5), (3, 7), (7, 10)], "left")
+    labels = pd.Series([0, 1, 2, 3])
+    return pd.DataFrame({"ilocs": segs, "labels": labels})
+
+
+def _get_example_points_3():
+    """Generate example 3 as points only.
+
+    Corresponds to example 3 for point output.
+    """
+    pts = [2, 3, 5, 7]
+    return pd.DataFrame({"ilocs": pts})
diff --git a/sktime/forecasting/base/_meta.py b/sktime/forecasting/base/_meta.py
index 740541659..72c6d8dad 100644
--- a/sktime/forecasting/base/_meta.py
+++ b/sktime/forecasting/base/_meta.py
@@ -18,6 +18,12 @@ class _HeterogenousEnsembleForecaster(_HeterogenousMetaEstimator, BaseForecaster
     # this must be an iterable of (name: str, estimator, ...) tuples for the default
     _steps_attr = "forecasters"
 
+    # if the estimator is fittable, _HeterogenousMetaEstimator also
+    # provides an override for get_fitted_params for params from the fitted estimators
+    # the fitted estimators should be in a different attribute, _steps_fitted_attr
+    # this must be an iterable of (name: str, estimator, ...) tuples for the default
+    _steps_fitted_attr = "forecasters_"
+
     def __init__(self, forecasters, n_jobs=None):
         self.forecasters = forecasters
         self.forecasters_ = None
diff --git a/sktime/forecasting/compose/__init__.py b/sktime/forecasting/compose/__init__.py
index b34a2a1b6..d451cb92b 100644
--- a/sktime/forecasting/compose/__init__.py
+++ b/sktime/forecasting/compose/__init__.py
@@ -70,7 +70,10 @@ from sktime.forecasting.compose._reduce import (
     YfromX,
     make_reduction,
 )
-from sktime.forecasting.compose._skforecast_reduce import SkforecastAutoreg
+from sktime.forecasting.compose._skforecast_reduce import (
+    SkforecastAutoreg,
+    SkforecastRecursive,
+)
 from sktime.forecasting.compose._stack import StackingForecaster
 from sktime.forecasting.compose._transform_select_forecaster import (
     TransformSelectForecaster,
diff --git a/sktime/forecasting/compose/_hierarchy_ensemble.py b/sktime/forecasting/compose/_hierarchy_ensemble.py
index 9a7d1f7da..131912399 100644
--- a/sktime/forecasting/compose/_hierarchy_ensemble.py
+++ b/sktime/forecasting/compose/_hierarchy_ensemble.py
@@ -61,19 +61,20 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
     >>> from sktime.forecasting.trend import PolynomialTrendForecaster, TrendForecaster
     >>> from sktime.utils._testing.hierarchical import _bottom_hier_datagen
     >>> y = _bottom_hier_datagen(
-    ...         no_bottom_nodes=7,
-    ...         no_levels=2,
-    ...         random_seed=123
+    ...     no_bottom_nodes=7,
+    ...     no_levels=2,
+    ...     random_seed=123,
     ... )
 
     >>> # Example of by = 'level'
     >>> forecasters = [
     ...     ('naive', NaiveForecaster(), 0),
-    ...     ('trend', TrendForecaster(), 1)
+    ...     ('trend', TrendForecaster(), 1),
     ... ]
     >>> forecaster = HierarchyEnsembleForecaster(
-    ...                 forecasters=forecasters,
-    ...                 by='level', default = PolynomialTrendForecaster(degree=2)
+    ...     forecasters=forecasters,
+    ...     by='level',
+    ...     default=PolynomialTrendForecaster(degree=2),
     ... )
     >>> forecaster.fit(y, fh=[1, 2, 3])
     HierarchyEnsembleForecaster(...)
@@ -188,11 +189,12 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
         x = X
 
         # check forecasters
-        self.forecasters_ = self._check_forecasters(y, z)
+        forecasters_ = self._check_forecasters(y, z)
+        self.forecasters_ = self._ensure_clone(forecasters_)
         self.fitted_list = []
 
         if y.index.nlevels == 1:
-            frcstr = self.forecasters_[0][1].clone()
+            frcstr = self.forecasters_[0][1]
             frcstr.fit(y, fh=fh, X=X)
             self.fitted_list.append([frcstr, y.index])
             return self
@@ -201,7 +203,7 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
             hier_dict = self._get_hier_dict(z)
             for _, forecaster, level in self.forecasters_:
                 if level in hier_dict.keys():
-                    frcstr = forecaster.clone()
+                    frcstr = forecaster
                     df = z[z.index.droplevel(-1).isin(hier_dict[level])]
                     if X is not None:
                         x = X.loc[df.index]
@@ -211,7 +213,7 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
         else:
             node_dict, frcstr_dict = self._get_node_dict(z)
             for key, nodes in node_dict.items():
-                frcstr = frcstr_dict[key].clone()
+                frcstr = frcstr_dict[key]
                 df = z[z.index.droplevel(-1).isin(nodes)]
                 if X is not None:
                     x = X.loc[df.index]
@@ -594,6 +596,21 @@ class HierarchyEnsembleForecaster(_HeterogenousEnsembleForecaster):
 
         return forecasters
 
+    def _ensure_clone(self, forecasters):
+        """Ensure that forecasters are cloned.
+
+        This should be done by _check_forecasters, but the function is hard to
+        understand and debug. This function is a safety net to ensure that
+        all forecasters are cloned.
+
+        This function, and _check_forecasters, should be refactored to be more
+        readable and maintainable.
+        """
+        forecasters_ = []
+        for name, forecaster, level_nd in forecasters:
+            forecasters_.append((name, forecaster.clone(), level_nd))
+        return forecasters_
+
     @classmethod
     def get_test_params(cls):
         """Return testing parameter settings for the estimator.
diff --git a/sktime/forecasting/compose/_skforecast_reduce.py b/sktime/forecasting/compose/_skforecast_reduce.py
index 3bdb49a24..46b5f4140 100644
--- a/sktime/forecasting/compose/_skforecast_reduce.py
+++ b/sktime/forecasting/compose/_skforecast_reduce.py
@@ -463,4 +463,471 @@ class SkforecastAutoreg(BaseForecaster):
         return [param1, param2]
 
 
-__all__ = ["SkforecastAutoreg"]
+# TODO: SkforecastRecursive has significant duplication with SkforecastAutoreg
+# https://github.com/sktime/sktime/issues/7451
+class SkforecastRecursive(BaseForecaster):
+    """Adapter for ``skforecast.recursive.ForecasterRecursive`` class [1]_.
+
+    This class turns any regressor compatible with the scikit-learn API into a recursive
+    autoregressive (multi-step) forecaster.
+
+    Parameters
+    ----------
+    regressor : regressor or pipeline compatible with the scikit-learn API
+        An instance of a regressor or pipeline compatible with the scikit-learn API
+    lags : int, list, numpy ndarray, range, default ``None``
+        Lags used as predictors. Index starts at 1, so lag 1 is equal to t-1.
+
+        - ``int``: include lags from 1 to ``lags`` (included).
+        - ``list``, ``1d numpy ndarray`` or ``range``: include only lags present in
+        ``lags``, all elements must be int.
+        - ``None``: no lags are included as predictors.
+    window_features : object, list, default ``None``
+        Instance or list of instances used to create window features. Window features
+        are created from the original time series and are included as predictors. This argument is meant to work with ``RollingFeatures`` class [2]_.
+    transformer_y : object transformer (preprocessor), default ``None``
+        An instance of a transformer (preprocessor) compatible with the ``scikit-learn``
+        preprocessing API with methods: ``fit``, ``transform``, ``fit_transform`` and
+        ``inverse_transform``. ``ColumnTransformer``'s are not allowed since they do not
+        have ``inverse_transform`` method. The transformation is applied to ``y`` before
+        training the forecaster.
+    transformer_X : object transformer (preprocessor), default ``None``
+        An instance of a transformer (preprocessor) compatible with the scikit-learn
+        preprocessing API. The transformation is applied to ``X`` before training the
+        forecaster. ``inverse_transform`` is not available when using
+        ``ColumnTransformer``'s.
+    weight_func : Callable, default ``None``
+        Function that defines the individual weights for each sample based on the
+        index. For example, a function that assigns a lower weight to certain dates.
+        Ignored if ``regressor`` does not have the argument ``sample_weight`` in its
+        ``fit`` method. The resulting ``sample_weight`` cannot have negative values.
+    differentiation : int, default ``None``
+        Order of differencing applied to the time series before training the forecaster.
+        If ``None``, no differencing is applied. The order of differentiation is the
+        number of times the differencing operation is applied to a time series.
+        Differencing involves computing the differences between consecutive data points
+        in the series. Differentiation is reversed in the output of ``predict()`` and
+        ``predict_interval()``.
+    fit_kwargs : dict, default ``None``
+        Additional arguments to be passed to the ``fit`` method of the regressor.
+    binner_kwargs : dict, default ``None``
+        Additional arguments to pass to the ``QuantileBinner`` class [3]_ used to
+        discretize the residuals into k bins according to the predicted values
+        associated with each residual. Available arguments are:
+
+        - ``n_bins``
+        - ``method``
+        - ``subsample``
+        - ``random_state``
+        - ``dtype``
+
+        Argument ``method`` is passed internally to the fucntion ``numpy.percentile``.
+
+    References
+    ----------
+    .. [1] https://skforecast.org/latest/api/forecasterrecursive#forecasterrecursive
+    .. [2] https://skforecast.org/0.14.0/api/preprocessing#skforecast.preprocessing.preprocessing.RollingFeatures
+    .. [3] https://skforecast.org/latest/api/preprocessing.html#skforecast.preprocessing.preprocessing.QuantileBinner
+
+    Examples
+    --------
+    >>> from sktime.forecasting.compose import SkforecastRecursive
+
+    Without exogenous features
+
+    >>> from sklearn.linear_model import LinearRegression
+    >>> from sktime.datasets import load_airline
+    >>> y = load_airline()
+    >>> forecaster = SkforecastRecursive(  # doctest: +SKIP
+    ...     LinearRegression(), 2
+    ... )
+    >>> forecaster.fit(y)  # doctest: +SKIP
+    SkforecastRecursive(lags=2, regressor=LinearRegression())
+    >>> y_pred = forecaster.predict(fh=[1, 2, 3])  # doctest: +SKIP
+    >>> y_pred_int = forecaster.predict_interval(  # doctest: +SKIP
+    ...     fh=[2], coverage=[0.9, 0.95]
+    ... )
+    >>> y_pred_qtl = forecaster.predict_quantiles(  # doctest: +SKIP
+    ...     fh=[1, 3], alpha=[0.8, 0.3, 0.2, 0.7]
+    ... )
+
+    With exogenous features
+
+    >>> from sklearn.ensemble import RandomForestRegressor
+    >>> from sktime.datasets import load_longley
+    >>> y, X = load_longley()
+    >>> y_train = y.head(n=12)
+    >>> y_test = y.tail(n=4)
+    >>> X_train = X.head(n=12)
+    >>> X_test = X.tail(n=4)
+    >>> forecaster = SkforecastRecursive(  # doctest: +SKIP
+    ...     RandomForestRegressor(), [2, 4]
+    ... )
+    >>> forecaster.fit(y_train, X=X_train)  # doctest: +SKIP
+    SkforecastRecursive(lags=[2, 4], regressor=RandomForestRegressor())
+    >>> y_pred = forecaster.predict(fh=[1, 2, 3], X=X_test)  # doctest: +SKIP
+    >>> y_pred_int = forecaster.predict_interval(  # doctest: +SKIP
+    ...     fh=[1, 3], X=X_test, coverage=[0.6, 0.4]
+    ... )
+    >>> y_pred_qtl = forecaster.predict_quantiles(  # doctest: +SKIP
+    ...     fh=[1, 3], X=X_test, alpha=[0.01, 0.5]
+    ... )
+
+    """  # noqa: E501
+
+    _tags = {
+        # packaging info
+        # --------------
+        "authors": [
+            "JoaquinAmatRodrigo",
+            "JavierEscobarOrtiz",
+            "yarnabrina",
+            "Abhay-Lejith",
+        ],
+        "maintainers": ["yarnabrina"],
+        # estimator type
+        # --------------
+        "y_inner_mtype": "pd.Series",
+        "X_inner_mtype": "pd.DataFrame",
+        "requires-fh-in-fit": False,
+        "handles-missing-data": False,
+        "capability:insample": False,
+        "capability:pred_int": True,
+        "capability:pred_int:insample": False,
+        "capability:categorical_in_X": True,
+        "python_version": ">=3.9",
+        "python_dependencies": ["skforecast>=0.14"],
+    }
+
+    def __init__(
+        self: "SkforecastRecursive",
+        regressor: object,
+        lags: Optional[Union[int, list, np.ndarray, range]] = None,
+        window_features: Optional[Union[object, list]] = None,
+        transformer_y: Optional[object] = None,
+        transformer_X: Optional[object] = None,
+        weight_func: Optional[Callable] = None,
+        differentiation: Optional[int] = None,
+        fit_kwargs: Optional[dict] = None,
+        binner_kwargs: Optional[dict] = None,
+    ) -> None:
+        self.regressor = regressor
+        self.lags = lags
+        self.window_features = window_features
+        self.transformer_y = transformer_y
+        self.transformer_X = transformer_X
+        self.weight_func = weight_func
+        self.differentiation = differentiation
+        self.fit_kwargs = fit_kwargs
+        self.binner_kwargs = binner_kwargs
+
+        super().__init__()
+
+        self._regressor = None
+        self._forecaster = None
+        self._transformer_y = None
+        self._transformer_X = None
+
+        self._clone_estimators()
+
+    def _clone_estimators(self: "SkforecastRecursive"):
+        """Clone the regressor and transformers."""
+        from sklearn.base import clone
+
+        self._regressor = clone(self.regressor)
+
+        if self.transformer_y:
+            self._transformer_y = clone(self.transformer_y)
+
+        if self.transformer_X:
+            self._transformer_X = clone(self.transformer_X)
+
+    def _create_forecaster(self: "SkforecastRecursive"):
+        """Create ``skforecast.recursive.ForecasterRecursive`` model."""
+        from skforecast.recursive import ForecasterRecursive
+
+        return ForecasterRecursive(
+            self._regressor,
+            lags=self.lags,
+            window_features=self.window_features,
+            transformer_y=self._transformer_y,
+            transformer_exog=self._transformer_X,
+            weight_func=self.weight_func,
+            differentiation=self.differentiation,
+            fit_kwargs=self.fit_kwargs,
+            binner_kwargs=self.binner_kwargs,
+        )
+
+    @staticmethod
+    def _coerce_column_names(X: Optional[pd.DataFrame]):
+        if X is None:
+            return None
+
+        return X.rename(columns=lambda column_name: str(column_name))
+
+    @staticmethod
+    def _coerce_int_to_range_index(df):
+        new_df = df.copy(deep=True)
+        start = new_df.index[0]
+        stop = new_df.index[-1] + 1
+        if len(new_df.index) == 1:
+            step = 1
+        else:
+            step = new_df.index[1] - start
+
+        new_index = pd.RangeIndex(start, stop, step)
+        # testing if RangeIndex is matching the original integer Index.
+        # this will fail if indices are not equally spaced apart.
+        # exception is caught in _make_index_compatible.
+        np.testing.assert_array_equal(new_df.index, new_index)
+        # assigning RangeIndex to the new DataFrame
+        new_df.index = new_index
+        return new_df
+
+    @staticmethod
+    def _coerce_period_to_datetime_index(df):
+        new_df = df.copy(deep=True)
+        period_freq = new_df.index.freq
+        # converting the period index to the timestamp at the 'end' of the period
+        # Example:        Period                   Datetime
+        #          '2024-01-12 00:00' --> '2024-01-12 00:59:59.999999999'
+        #          '2024-01-12 01:00' --> '2024-01-12 01:59:59.999999999'
+        new_df.index = new_df.index.to_timestamp(how="e")
+        new_df.index.freq = period_freq
+        return new_df
+
+    def _make_index_compatible(self, df, input_var):
+        if df is None:
+            return None
+
+        if isinstance(df.index, (pd.RangeIndex, pd.DatetimeIndex)):
+            return df
+
+        if isinstance(df.index, pd.PeriodIndex):
+            new_df = self._coerce_period_to_datetime_index(df)
+        elif pd.api.types.is_integer_dtype(df.index):
+            try:
+                new_df = self._coerce_int_to_range_index(df)
+            except AssertionError:
+                raise ValueError(
+                    f"Coercion of index of {input_var} from integer pd.Index to "
+                    "pd.RangeIndex failed. Please ensure that indexes are equally "
+                    "spaced apart."
+                )
+        else:
+            raise ValueError(
+                f"{input_var} must have one of the following index types: "
+                "pd.RangeIndex, pd.DatetimeIndex, pd.PeriodIndex, pd.Index"
+                f"(int dtype). Found index of type: {type(df.index)}"
+            )
+        return new_df
+
+    def _fit(
+        self: "SkforecastRecursive",
+        y: pd.Series,
+        X: Optional[pd.DataFrame],
+        fh: Optional[ForecastingHorizon],
+    ):
+        """Fit forecaster to training data.
+
+        private _fit containing the core logic, called from fit
+
+        Writes to self:
+            Sets fitted model attributes ending in "_".
+
+        Parameters
+        ----------
+        y : pd.Series
+            Target time series to which to fit the forecaster.
+        fh : guaranteed to be ForecastingHorizon or None, optional (default=None)
+            The forecasting horizon with the steps ahead to to predict.
+            Required (non-optional) here.
+        X : pd.DataFrame, optional (default=None)
+            Exogeneous time series to fit to.
+
+        Returns
+        -------
+        self : reference to self
+        """
+        del fh  # avoid being detected as unused by ``vulture`` like tools
+
+        self._forecaster = self._create_forecaster()
+
+        # skforecast does not support PeriodIndex and Integer Index.
+        # So converting to supported index types here if necessary.
+        y_new = self._make_index_compatible(y, "y")
+        X_new = self._make_index_compatible(X, "X")
+
+        self._forecaster.fit(y_new, exog=self._coerce_column_names(X_new))
+
+        return self
+
+    def _get_horizon_details(
+        self: "SkforecastRecursive", fh: Optional[ForecastingHorizon]
+    ):
+        if not fh.is_all_out_of_sample(self.cutoff):
+            raise NotImplementedError(
+                f"{self.__class__.__name__} does not support in-sample predictions."
+            )
+
+        out_of_sample_horizon = fh.to_out_of_sample(self.cutoff)
+        maximum_forecast_horizon = out_of_sample_horizon.to_relative(self.cutoff)[-1]
+
+        absolute_horizons = out_of_sample_horizon.to_absolute_index(self.cutoff)
+        horizon_positions = out_of_sample_horizon.to_indexer(self.cutoff)
+
+        return maximum_forecast_horizon, absolute_horizons, horizon_positions
+
+    def _predict(
+        self: "SkforecastRecursive",
+        fh: Optional[ForecastingHorizon],
+        X: Optional[pd.DataFrame],
+    ):
+        """Forecast time series at future horizon.
+
+        private _predict containing the core logic, called from predict
+
+        State required:
+            Requires state to be "fitted".
+
+        Accesses in self:
+            Fitted model attributes ending in "_"
+            self.cutoff
+
+        Parameters
+        ----------
+        fh : guaranteed to be ForecastingHorizon or None, optional (default=None)
+            The forecasting horizon with the steps ahead to to predict.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous time series
+
+        Returns
+        -------
+        y_pred : pd.DataFrame
+            Point predictions
+        """
+        (
+            maximum_forecast_horizon,
+            absolute_horizons,
+            horizon_positions,
+        ) = self._get_horizon_details(fh)
+
+        X_new = self._make_index_compatible(X, "X")
+
+        point_predictions = self._forecaster.predict(
+            maximum_forecast_horizon, exog=self._coerce_column_names(X_new)
+        ).to_numpy()
+        final_point_predictions = pd.Series(
+            point_predictions[horizon_positions],
+            index=absolute_horizons,
+            name=None if self._y.name is None else str(self._y.name),
+        )
+
+        return final_point_predictions
+
+    def _predict_quantiles(
+        self: "SkforecastRecursive",
+        fh: Optional[ForecastingHorizon],
+        X: Optional[pd.DataFrame],
+        alpha: list[float],
+    ):
+        """Compute/return prediction quantiles for a forecast.
+
+        private _predict_quantiles containing the core logic,
+            called from predict_quantiles and possibly predict_interval
+
+        State required:
+            Requires state to be "fitted".
+
+        Accesses in self:
+            Fitted model attributes ending in "_"
+            self.cutoff
+
+        Parameters
+        ----------
+        fh : guaranteed to be ForecastingHorizon or None, optional (default=None)
+            The forecasting horizon with the steps ahead to to predict.
+        X :  sktime time series object, optional (default=None)
+            guaranteed to be of an mtype in self.get_tag("X_inner_mtype")
+            Exogeneous time series for the forecast
+        alpha : list of float (guaranteed not None and floats in [0,1] interval)
+            A list of probabilities at which quantile forecasts are computed.
+
+        Returns
+        -------
+        quantiles : pd.DataFrame
+            Column has multi-index: first level is variable name from y in fit,
+                second level being the values of alpha passed to the function.
+            Row index is fh, with additional (upper) levels equal to instance levels,
+                    from y seen in fit, if y_inner_mtype is Panel or Hierarchical.
+            Entries are quantile forecasts, for var in col index,
+                at quantile probability in second col index, for the row index.
+        """
+        (
+            maximum_forecast_horizon,
+            absolute_horizons,
+            horizon_positions,
+        ) = self._get_horizon_details(fh)
+
+        var_names = self._get_varnames()
+        var_name = var_names[0]
+
+        quantile_predictions_indices = pd.MultiIndex.from_product([var_names, alpha])
+        quantile_predictions = pd.DataFrame(
+            index=absolute_horizons, columns=quantile_predictions_indices
+        )
+
+        X_new = self._make_index_compatible(X, "X")
+
+        quantile_pred = self._forecaster.predict_quantiles(
+            maximum_forecast_horizon,
+            exog=self._coerce_column_names(X_new),
+            quantiles=alpha,
+        )
+
+        for quantile in alpha:
+            quantile_predictions[(var_name, quantile)] = (
+                quantile_pred[f"q_{quantile}"].iloc[horizon_positions].to_list()
+            )
+        return quantile_predictions
+
+    @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.
+            There are currently no reserved values for forecasters.
+
+        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`
+        """
+        del parameter_set  # to avoid being detected as unused by ``vulture`` etc.
+
+        from sklearn.ensemble import RandomForestRegressor
+        from sklearn.linear_model import LinearRegression
+        from sklearn.preprocessing import StandardScaler
+
+        param1 = {
+            "regressor": LinearRegression(),
+            "lags": 2,
+            "transformer_X": StandardScaler(),
+        }
+        param2 = {
+            "regressor": RandomForestRegressor(),
+            "lags": [1, 3],
+            "differentiation": 2,
+        }
+
+        return [param1, param2]
+
+
+__all__ = ["SkforecastAutoreg", "SkforecastRecursive"]
diff --git a/sktime/networks/cnn.py b/sktime/networks/cnn.py
index 663b16c30..b4dce3e99 100644
--- a/sktime/networks/cnn.py
+++ b/sktime/networks/cnn.py
@@ -9,7 +9,7 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNNetwork(BaseDeepNetwork):
     """Establish the network structure for a CNN.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation used in [1]_.
 
     Parameters
     ----------
@@ -31,18 +31,18 @@ class CNNNetwork(BaseDeepNetwork):
     random_state    : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
-
     References
     ----------
     .. [1] Zhao et al. Convolutional neural networks for time series classification,
     Journal of Systems Engineering and Electronics 28(1), 162--169, 2017
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        # packaging info
+        # --------------
+        "authors": ["hfawaz"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/fcn.py b/sktime/networks/fcn.py
index 9626ed965..185fe27a4 100644
--- a/sktime/networks/fcn.py
+++ b/sktime/networks/fcn.py
@@ -9,18 +9,16 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNNetwork(BaseDeepNetwork):
     """Establish the network structure for a FCN.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
+    Implements network in [1]_.
 
     Parameters
     ----------
-    random_state    : int, default = 0
+    random_states : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Network originally defined in:
diff --git a/sktime/networks/inceptiontime.py b/sktime/networks/inceptiontime.py
index 379111e3a..0c2ab1a32 100644
--- a/sktime/networks/inceptiontime.py
+++ b/sktime/networks/inceptiontime.py
@@ -24,7 +24,10 @@ class InceptionTimeNetwork(BaseDeepNetwork):
                     ArXiv}, Year                     = {2019} }
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "JamesLarge", "Withington"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/mcdcnn.py b/sktime/networks/mcdcnn.py
index 6d82745b7..cd1e8f351 100644
--- a/sktime/networks/mcdcnn.py
+++ b/sktime/networks/mcdcnn.py
@@ -1,6 +1,6 @@
 """Multi Channel Deep Convolution Neural Network (MCDCNN)."""
 
-__author__ = ["James Large", "Withington"]
+__author__ = ["James-Large", "Withington"]
 
 from sktime.networks.base import BaseDeepNetwork
 from sktime.utils.dependencies import _check_dl_dependencies
@@ -10,7 +10,7 @@ class MCDCNNNetwork(BaseDeepNetwork):
     """
     Multi Channel Deep Convolutional Neural Network (MCDCNN).
 
-    Adapted from the implementation from Fawaz et. al:
+    Adapted from the implementation of Fawaz et. al:
     https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
 
     Parameters
@@ -35,7 +35,10 @@ class MCDCNNNetwork(BaseDeepNetwork):
         The seed to any random action.
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/mlp.py b/sktime/networks/mlp.py
index 6c5912650..dfbccbda0 100644
--- a/sktime/networks/mlp.py
+++ b/sktime/networks/mlp.py
@@ -9,18 +9,16 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPNetwork(BaseDeepNetwork):
     """Establish the network structure for a MLP.
 
-    Adapted from the implementation used in [1]
+    Adapted from the implementation from source code
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
+    Implements a simple MLP network, as in [1]_.
 
     Parameters
     ----------
     random_state    : int, default = 0
         seed to any needed random actions
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1]  Network originally defined in:
@@ -31,7 +29,10 @@ class MLPNetwork(BaseDeepNetwork):
     1578--1585}, year={2017}, organization={IEEE} }
     """
 
-    _tags = {"python_dependencies": "tensorflow"}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington", "AurumnPegasus"],
+        "python_dependencies": "tensorflow",
+    }
 
     def __init__(
         self,
diff --git a/sktime/networks/resnet.py b/sktime/networks/resnet.py
index 0c5630b1a..53c3f7844 100644
--- a/sktime/networks/resnet.py
+++ b/sktime/networks/resnet.py
@@ -1,6 +1,6 @@
 """Residual Network (ResNet) (minus the final output layer)."""
 
-__author__ = ["James Large", "Withington", "nilesh05apr"]
+__author__ = ["James-Large", "Withington", "nilesh05apr"]
 
 from sktime.networks.base import BaseDeepNetwork
 from sktime.utils.dependencies import _check_dl_dependencies
@@ -9,18 +9,14 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetNetwork(BaseDeepNetwork):
     """Establish the network structure for a ResNet.
 
-    Adapted from the implementations used in [1]
+    Adapted from the implementation in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
 
     Parameters
     ----------
     random_state : int, optional (default = 0)
         The random seed to use random activities.
 
-    Notes
-    -----
-    Adapted from the implementation source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
     .. [1] H. Fawaz, G. B. Lanckriet, F. Petitjean, and L. Idoumghar,
@@ -34,7 +30,10 @@ class ResNetNetwork(BaseDeepNetwork):
     1578--1585}, year={2017}, organization={IEEE} }
     """
 
-    _tags = {"python_dependencies": ["tensorflow", "keras-self-attention"]}
+    _tags = {
+        "authors": ["hfawaz", "James-Large", "Withington", "nilesh05apr"],
+        "python_dependencies": ["tensorflow", "keras-self-attention"],
+    }
 
     def __init__(self, random_state=0):
         _check_dl_dependencies(severity="error")
diff --git a/sktime/performance_metrics/detection/_base.py b/sktime/performance_metrics/detection/_base.py
index b802856bd..fdc1978ad 100644
--- a/sktime/performance_metrics/detection/_base.py
+++ b/sktime/performance_metrics/detection/_base.py
@@ -2,6 +2,14 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 
 from sktime.datatypes import check_is_scitype, convert_to
+from sktime.detection._datatypes._check import (
+    _is_points_dtype,
+    _is_segments_dtype,
+)
+from sktime.detection._datatypes._convert import (
+    _convert_points_to_segments,
+    _convert_segments_to_points,
+)
 from sktime.performance_metrics.base import BaseMetric
 
 
@@ -144,4 +152,25 @@ class BaseDetectionMetric(BaseMetric):
         y_pred = _coerce_to_df(y_pred, var_name="y_pred")
         X = _coerce_to_df(X, var_name="X", allow_none=allow_none_X)
 
+        # coerce to detection type
+        y_true = self._coerce_to_detection_type(y_true, X, allow_none=allow_none_y_true)
+        y_pred = self._coerce_to_detection_type(y_pred, X)
+
         return y_true, y_pred, X
+
+    def _coerce_to_detection_type(self, y, X, allow_none=False):
+        """Coerce input to detection type."""
+        if allow_none and y is None:
+            return None
+
+        detection_type = self.get_tag("scitype:y")
+        if X is None:
+            len_X = None
+        else:
+            len_X = len(X)
+
+        if _is_points_dtype(y) and detection_type == "segments":
+            y = _convert_points_to_segments(y, len_X=len_X)
+        elif _is_segments_dtype(y) and detection_type == "points":
+            y = _convert_segments_to_points(y, len_X=len_X)
+        return y
diff --git a/sktime/performance_metrics/forecasting/_classes.py b/sktime/performance_metrics/forecasting/_classes.py
index 18866c221..955295b47 100644
--- a/sktime/performance_metrics/forecasting/_classes.py
+++ b/sktime/performance_metrics/forecasting/_classes.py
@@ -711,7 +711,7 @@ class BaseForecastingErrorMetric(BaseMetric):
                 return y.X_multiindex
 
             valid, msg, metadata = check_is_scitype(
-                y, scitype=SCITYPES, return_metadata=True, var_name=var_name
+                y, scitype=SCITYPES, return_metadata=[], var_name=var_name
             )
             if not valid:
                 raise TypeError(msg)
diff --git a/sktime/registry/_tags.py b/sktime/registry/_tags.py
index 11081854c..0c46bb5b7 100644
--- a/sktime/registry/_tags.py
+++ b/sktime/registry/_tags.py
@@ -1811,6 +1811,44 @@ class y_inner_mtype(_BaseTag):
     }
 
 
+class visual_block_kind(_BaseTag):
+    """How to display html representation of a meta-estimator in a jupyter notebook.
+
+    - String name: ``"visual_block_kind"``
+    - Extension developer tag
+    - Values: string, one of ``"single"``, ``"serial"``, ``"parallel"``
+    - Example: ``"single"``
+    - Default: ``"single"``
+
+    This tag specifies how to display the html representation of a meta-estimator
+    in a jupyter notebook.
+
+    Meta-estimators are composites with a variable number of sub-estimators,
+    such as ``ForecastingPipeline`` or ``ColumnTransformer``, inheriting from
+    ``_HeterogenousMetaEstimator``.
+
+    The html display is triggered by calling the ``_repr_html_`` method on any
+    ``scikit-base`` estimator, which returns a html representation of the estimator,
+    used by default in jupyter notebooks, or also other html display environments.
+
+    Possible values are:
+
+    * ``"single"``: the meta-estimator is displayed as a single block in the notebook.
+    * ``"serial"``: the meta-estimator is displayed as a series of blocks, one for
+      each sub-estimator, in a serial layout, i.e., as a vertical stack.
+    * ``"parallel"``: the meta-estimator is displayed as a series of blocks, one for
+      each sub-estimator, in a parallel layout, i.e., as a horizontal stack.
+    """
+
+    _tags = {
+        "tag_name": "visual_block_kind",
+        "parent_type": "estimator",
+        "tag_type": ("str", ["single", "serial", "parallel"]),
+        "short_descr": "how to display html represantation of a meta-estimator in jupyter notebook",  # noqa: E501
+        "user_facing": False,
+    }
+
+
 ESTIMATOR_TAG_REGISTER = [
     (
         "sktime_version",
@@ -2117,12 +2155,6 @@ ESTIMATOR_TAG_REGISTER = [
         "dict",
         "deprecated tag for dependency import aliases",
     ),
-    (
-        "visual_block_kind",
-        "estimator",
-        ("str", ["single", "serial", "parallel"]),
-        "how to display html represantation of a meta-estimator in jupyter notebook",
-    ),
 ]
 
 # construct the tag register from all classes in this module
diff --git a/sktime/regression/deep_learning/cnn.py b/sktime/regression/deep_learning/cnn.py
index de9a0a8f6..a0037ad02 100644
--- a/sktime/regression/deep_learning/cnn.py
+++ b/sktime/regression/deep_learning/cnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNNRegressor(BaseDeepRegressor):
     """Time Series Convolutional Neural Network (CNN), as described in [1].
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/cnn.py
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -77,7 +80,8 @@ class CNNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["AurumnPegasus", "achieveordie"],
+        "authors": ["hfawaz", "AurumnPegasus", "achieveordie"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["AurumnPegasus", "achieveordie"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/regression/deep_learning/cntc.py b/sktime/regression/deep_learning/cntc.py
index 830c9dfa6..03d51830f 100644
--- a/sktime/regression/deep_learning/cntc.py
+++ b/sktime/regression/deep_learning/cntc.py
@@ -12,6 +12,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class CNTCRegressor(BaseDeepRegressor):
     """Contextual Time-series Neural Regressor (CNTC), as described in [1].
 
+    Adapted from the implementation from Fullah et. al
+    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
+
     Parameters
     ----------
     n_epochs       : int, default = 2000
@@ -38,11 +41,6 @@ class CNTCRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizer, default=keras.optimizers.Adam(),
     metrics         : list of strings, default=["accuracy"],
 
-    Notes
-    -----
-    Adapted from the implementation from Fullah et. al
-    https://github.com/AmaduFullah/CNTC_MODEL/blob/master/cntc.ipynb
-
     References
     ----------
     .. [1] Network originally defined in:
@@ -63,7 +61,12 @@ class CNTCRegressor(BaseDeepRegressor):
     """
 
     _tags = {
-        "authors": ["James-Large", "Withington", "TonyBagnall", "AurumnPegasus"],
+        "authors": [
+            "AmaduFullah",
+            "James-Large",
+            "Withington",
+            "AurumnPegasus",
+        ],
         "maintainers": ["James-Large", "Withington", "AurumnPegasus", "nilesh05apr"],
         "python_dependencies": ["tensorflow", "keras-self-attention"],
     }
diff --git a/sktime/regression/deep_learning/fcn.py b/sktime/regression/deep_learning/fcn.py
index 244de161b..ed3d81dcb 100644
--- a/sktime/regression/deep_learning/fcn.py
+++ b/sktime/regression/deep_learning/fcn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class FCNRegressor(BaseDeepRegressor):
     """Fully Connected Neural Network (FCN), as described in [1]_.
 
+    Adapted from the implementation from Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -38,11 +41,6 @@ class FCNRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/fcn.py
-
     References
     ----------
     .. [1] Zhao et. al, Convolutional neural networks for time series classification,
@@ -52,7 +50,7 @@ class FCNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/inceptiontime.py b/sktime/regression/deep_learning/inceptiontime.py
index f2b704125..6cd95fce7 100644
--- a/sktime/regression/deep_learning/inceptiontime.py
+++ b/sktime/regression/deep_learning/inceptiontime.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class InceptionTimeRegressor(BaseDeepRegressor):
     """InceptionTime Deep Learning Regressor.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/InceptionTime/blob/master/classifiers/inception.py
+
     Parameters
     ----------
     n_epochs : int, default=1500
@@ -39,15 +42,12 @@ class InceptionTimeRegressor(BaseDeepRegressor):
     -----
     ..[1] Fawaz et. al, InceptionTime: Finding AlexNet for Time Series
     Classification, Data Mining and Knowledge Discovery, 34, 2020
-
-    Adapted from the implementation from Fawaz et. al
-    https://github.com/hfawaz/InceptionTime/blob/master/classifiers/inception.py
     """
 
     _tags = {
         # packaging info
         # --------------
-        "authors": ["james-large"],
+        "authors": ["hfawaz", "james-large"],
         "maintainers": ["james-large", "niles05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/mcdcnn.py b/sktime/regression/deep_learning/mcdcnn.py
index 01ea12725..3b235d718 100644
--- a/sktime/regression/deep_learning/mcdcnn.py
+++ b/sktime/regression/deep_learning/mcdcnn.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MCDCNNRegressor(BaseDeepRegressor):
     """Multi Channel Deep Convolutional Neural Regressor, adopted from [1]_.
 
+    Adapted from the implementation of Fawaz et. al
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
+
     Parameters
     ----------
     n_epochs : int, optional (default=120)
@@ -56,11 +59,6 @@ class MCDCNNRegressor(BaseDeepRegressor):
     random_state : int, optional (default=0)
         The seed to any random action.
 
-    Notes
-    -----
-    Adapted from the implementation of Fawaz et. al
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mcdcnn.py
-
     References
     ----------
     .. [1] Zheng et. al, Time series classification using multi-channels deep
@@ -80,7 +78,7 @@ class MCDCNNRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large"],
+        "authors": ["hfawaz", "James-Large"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/mlp.py b/sktime/regression/deep_learning/mlp.py
index ead20dbd3..ea752b81c 100644
--- a/sktime/regression/deep_learning/mlp.py
+++ b/sktime/regression/deep_learning/mlp.py
@@ -15,6 +15,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class MLPRegressor(BaseDeepRegressor):
     """Multi Layer Perceptron Network (MLP), as described in [1]_.
 
+    Adapted from the implementation by hfawaz in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
+
     Parameters
     ----------
     should inherited fields be listed here?
@@ -38,11 +41,6 @@ class MLPRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/mlp.py
-
     References
     ----------
     .. [1] Wang et. al, Time series classification from
@@ -64,7 +62,7 @@ class MLPRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "AurumnPegasus"],
+        "authors": ["hfawaz", "James-Large", "AurumnPegasus"],
         "maintainers": ["James-Large", "AurumnPegasus", "nilesh05apr"],
         # estimator type handled by parent class
     }
diff --git a/sktime/regression/deep_learning/resnet.py b/sktime/regression/deep_learning/resnet.py
index 2a8ce52aa..557b2dc49 100644
--- a/sktime/regression/deep_learning/resnet.py
+++ b/sktime/regression/deep_learning/resnet.py
@@ -14,6 +14,9 @@ from sktime.utils.dependencies import _check_dl_dependencies
 class ResNetRegressor(BaseDeepRegressor):
     """Residual Neural Network Regressor adopted from [1].
 
+    Adapted from the implementation by hfawaz in
+    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
+
     Parameters
     ----------
     n_epochs       : int, default = 1500
@@ -37,12 +40,6 @@ class ResNetRegressor(BaseDeepRegressor):
     optimizer       : keras.optimizers object, default = Adam(lr=0.01)
         specify the optimizer and the learning rate to be used.
 
-
-    Notes
-    -----
-    Adapted from the implementation from source code
-    https://github.com/hfawaz/dl-4-tsc/blob/master/classifiers/resnet.py
-
     References
     ----------
         .. [1] Wang et. al, Time series classification from
@@ -62,7 +59,8 @@ class ResNetRegressor(BaseDeepRegressor):
     _tags = {
         # packaging info
         # --------------
-        "authors": ["James-Large", "Withington"],
+        "authors": ["hfawaz", "James-Large", "Withington"],
+        # hfawaz for dl-4-tsc
         "maintainers": ["Withington"],
         "python_dependencies": "tensorflow",
         # estimator type handled by parent class
diff --git a/sktime/split/instance.py b/sktime/split/instance.py
index c36b72c80..678163538 100644
--- a/sktime/split/instance.py
+++ b/sktime/split/instance.py
@@ -2,7 +2,7 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """Splitter that uses an sklearn splitter to split by instance."""
 
-__author__ = ["fkiraly"]
+__author__ = ["fkiraly", "ksharma6"]
 
 __all__ = [
     "InstanceSplitter",
@@ -10,11 +10,11 @@ __all__ = [
 
 from typing import Optional
 
-import numpy as np
 import pandas as pd
 
 from sktime.split.base import BaseSplitter
 from sktime.split.base._common import ACCEPTED_Y_TYPES, SPLIT_GENERATOR_TYPE
+from sktime.utils.multiindex import apply_split
 
 
 class InstanceSplitter(BaseSplitter):
@@ -62,15 +62,10 @@ class InstanceSplitter(BaseSplitter):
             y = pd.MultiIndex.from_arrays([zeros, y])
 
         inst_ix = y.droplevel(-1).unique()
-        iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)
 
         for y_train_inst_iloc, y_test_inst_iloc in self.cv.split(inst_ix):
-            y_train_inst_loc = inst_ix[np.array(y_train_inst_iloc)]
-            y_test_inst_loc = inst_ix[np.array(y_test_inst_iloc)]
-            tr_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_train_inst_loc]
-            tt_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_test_inst_loc]
-            y_train_iloc = np.concatenate(tr_np)
-            y_test_iloc = np.concatenate(tt_np)
+            y_train_iloc = apply_split(y, y_train_inst_iloc)
+            y_test_iloc = apply_split(y, y_test_inst_iloc)
             yield y_train_iloc, y_test_iloc
 
     def get_n_splits(self, y: Optional[ACCEPTED_Y_TYPES] = None) -> int:
diff --git a/sktime/transformations/panel/catch22.py b/sktime/transformations/panel/catch22.py
index 02b10ad97..b7005b99a 100644
--- a/sktime/transformations/panel/catch22.py
+++ b/sktime/transformations/panel/catch22.py
@@ -134,6 +134,27 @@ FEATURE_NAMES = CATCH22_FEATURE_NAMES  # for backwards compatibility, this was p
 
 
 def _verify_features(features, catch24: bool):
+    """
+    Verify and validate the requested feature indices for catch22 or catch24 features.
+
+    Parameters
+    ----------
+    features : str, int, list, or tuple
+        The features to verify. Options include:
+        - `"all"`: Select all features.
+        - A string: The name of a single feature (either full or short name).
+        - An integer: The index of a single feature (0-based).
+        - A list or tuple: A collection of feature names or indices (mixed types also).
+
+    catch24 : bool
+        If `True`, uses the catch24 feature set (24 features). If `False`, uses the
+        catch22 feature set (22 features).
+
+    Returns
+    -------
+    f_idx : list of int
+        A list of validated feature indices corresponding to the requested features.
+    """
     feature_names = ALL_FEATURE_NAMES if catch24 else CATCH22_FEATURE_NAMES
     short_feature_names = (
         ALL_SHORT_FEATURE_NAMES if catch24 else CATCH22_SHORT_FEATURE_NAMES
@@ -346,6 +367,25 @@ class Catch22(BaseTransformer):
     def _transform_single_feature(
         self, X: pd.Series, feature: Union[int, str], case_id="deprecated"
     ):
+        """
+        Transform a single feature  into a Catch22 or Catch24 feature.
+
+        Parameters
+        ----------
+        X : pd.Series or pd.DataFrame
+            The input time series data.
+
+        feature : int or str
+            The feature to compute.
+
+        case_id : str, optional, default="deprecated"
+            Deprecated argument, maintained for compatibility.
+
+        Returns
+        -------
+        np.ndarray: A 1D NumPy array of shape `(n_instances,)` containing the
+        transformed feature values for each instance in the input data.
+        """
         if case_id != "deprecated":
             warn(
                 "In Catch22._transform_single_feature, the argument "
diff --git a/sktime/transformations/panel/tsfresh.py b/sktime/transformations/panel/tsfresh.py
index f3ed49bcd..c4e58eca6 100644
--- a/sktime/transformations/panel/tsfresh.py
+++ b/sktime/transformations/panel/tsfresh.py
@@ -6,6 +6,7 @@ __author__ = ["AyushmaanSeth", "mloning", "alwinw", "MatthewMiddlehurst"]
 __all__ = ["TSFreshFeatureExtractor", "TSFreshRelevantFeatureExtractor"]
 
 from sktime.transformations.base import BaseTransformer
+from sktime.utils.dependencies import _check_soft_dependencies
 from sktime.utils.validation import check_n_jobs
 
 
@@ -92,6 +93,7 @@ class _TSFreshFeatureExtractor(BaseTransformer):
             "profiling_sorting": PROFILING_SORTING,
             "profiling_filename": PROFILING_FILENAME,
             "profile": PROFILING,
+            "distributor": None,
         }
 
         # Replace defaults with user defined parameters
@@ -192,10 +194,9 @@ class TSFreshFeatureExtractor(_TSFreshFeatureExtractor):
     profiling_filename : basestring, default=None
         Where to save the profiling results.
     distributor : distributor class, default=None
-        Advanced parameter: set this to a class name that you want to use as a
-        distributor. See the tsfresh package utilities/distribution.py for more
-        information.
-        Leave to None, if you want TSFresh to choose the best distributor.
+        Advanced parameter: class to use as a distributor.
+        See the tsfresh package utilities/distribution.py for more information.
+        The default=None has the tsfresh default implementation choose the distributor.
 
     References
     ----------
@@ -391,10 +392,9 @@ class TSFreshRelevantFeatureExtractor(_TSFreshFeatureExtractor):
     profiling_filename : basestring, default=None
         Where to save the profiling results.
     distributor : distributor class, default=None
-        Advanced parameter: set this to a class name that you want to use as a
-        distributor. See the tsfresh package utilities/distribution.py for more
-        information.
-        Leave to None, if you want TSFresh to choose the best distributor.
+        Advanced parameter: class to use as a distributor.
+        See the tsfresh package utilities/distribution.py for more information.
+        The default=None has the tsfresh default implementation choose the distributor.
     test_for_binary_target_binary_feature : str or None, default=None
         Which test to be used for binary target, binary feature (currently unused).
     test_for_binary_target_real_feature : str or None, default=None
@@ -619,6 +619,7 @@ class TSFreshRelevantFeatureExtractor(_TSFreshFeatureExtractor):
             profiling=self.profiling,
             profiling_filename=self.profiling_filename,
             profiling_sorting=self.profiling_sorting,
+            distributor=self.distributor,
         )
 
         self.selector_ = FeatureSelector(
@@ -667,6 +668,7 @@ class TSFreshRelevantFeatureExtractor(_TSFreshFeatureExtractor):
             profiling=self.profiling,
             profiling_filename=self.profiling_filename,
             profiling_sorting=self.profiling_sorting,
+            distributor=self.distributor,
         )
 
         self.selector_ = FeatureSelector(
@@ -730,4 +732,17 @@ class TSFreshRelevantFeatureExtractor(_TSFreshFeatureExtractor):
             "disable_progressbar": True,
             "show_warnings": False,
         }
-        return [params, params2]
+        params = [params, params2]
+
+        if _check_soft_dependencies("tsfresh", severity="none"):
+            from tsfresh.utilities.distribution import MapDistributor
+
+            params3 = {
+                "default_fc_parameters": "minimal",
+                "disable_progressbar": True,
+                "show_warnings": False,
+                "distributor": MapDistributor(),
+            }
+            params.append(params3)
+
+        return params
diff --git a/sktime/utils/dependencies/_dependencies.py b/sktime/utils/dependencies/_dependencies.py
index 1c4a1322b..b9bcd9329 100644
--- a/sktime/utils/dependencies/_dependencies.py
+++ b/sktime/utils/dependencies/_dependencies.py
@@ -1,7 +1,5 @@
 """Utility to check soft dependency imports, and raise warnings or errors."""
 
-__author__ = ["fkiraly", "mloning"]
-
 import sys
 import warnings
 from functools import lru_cache
@@ -131,23 +129,20 @@ def _check_soft_dependencies(
         if pkg_env_version is None:
             if obj is None and msg is None:
                 msg = (
-                    f"{package!r} not found. "
-                    f"{package!r} is a soft dependency and not included in the "
-                    f"base sktime installation. Please run: `pip install {package}` to "
-                    f"install the {package} package. "
-                    f"To install all soft dependencies, run: `pip install "
-                    f"sktime[all_extras]`"
+                    f"{class_name} requires package {package!r} to be present "
+                    f"in the python environment, but {package!r} was not found. "
                 )
             elif msg is None:  # obj is not None, msg is None
                 msg = (
                     f"{class_name} requires package {package!r} to be present "
                     f"in the python environment, but {package!r} was not found. "
-                    f"{package!r} is a soft dependency and not included in the base "
-                    f"sktime installation. Please run: `pip install {package}` to "
-                    f"install the {package} package. "
-                    f"To install all soft dependencies, run: `pip install "
-                    f"sktime[all_extras]`"
+                    f"{package!r} is a dependency of {class_name} and required "
+                    f"to construct it. "
                 )
+            msg = msg + (
+                f"To install the requirement {package!r}, please run: "
+                f"pip install {package}` "
+            )
             # if msg is not None, none of the above is executed,
             # so if msg is passed it overrides the default messages
 
@@ -221,10 +216,10 @@ def _check_mlflow_dependencies(msg=None, severity="error"):
     Parameters
     ----------
     msg: str, optional, default= default message (msg below)
-        error message to be returned when `ModuleNotFoundError` is raised.
+        error message to be returned when ``ModuleNotFoundError`` is raised.
     severity: str, either of "error", "warning" or "none"
         behaviour for raising errors or warnings
-        "error" - raises a `ModuleNotFound` if mlflow-related packages are not found.
+        "error" - raises a ``ModuleNotFound`` if mlflow-related packages are not found.
         "warning" - raises a warning message if any mlflow-related package is not
             installed also returns False. In case all packages are present,
             returns True.
@@ -314,7 +309,9 @@ def _get_pkg_version(package_name):
     return pkg_env_version
 
 
-def _check_python_version(obj, package=None, msg=None, severity="error"):
+def _check_python_version(
+    obj, package=None, msg=None, severity="error", prereleases=True
+):
     """Check if system python version is compatible with requirements of obj.
 
     Parameters
@@ -337,6 +334,13 @@ def _check_python_version(obj, package=None, msg=None, severity="error"):
         * "none" - does not raise exception or warning
           function returns False if one of packages is not installed, otherwise True
 
+    prereleases: str, default = True
+        Whether prerelease versions are considered compatible.
+        If True, allows prerelease versions to be considered compatible.
+        If False, always considers prerelease versions as incompatible, i.e., always
+        raises error, warning, or returns False, if the system python version is a
+        prerelease.
+
     Returns
     -------
     compatible : bool, whether obj is compatible with system python version
@@ -354,7 +358,7 @@ def _check_python_version(obj, package=None, msg=None, severity="error"):
         return True
 
     try:
-        est_specifier = SpecifierSet(est_specifier_tag)
+        est_specifier = SpecifierSet(est_specifier_tag, prereleases=prereleases)
     except InvalidSpecifier:
         msg_version = (
             f"wrong format for python_version tag, "
@@ -381,6 +385,9 @@ def _check_python_version(obj, package=None, msg=None, severity="error"):
             f" but system python version is {sys.version}."
         )
 
+        if "rc" in sys_version:
+            msg += " This is due to the release candidate status of your system Python."
+
         if package is not None:
             msg += (
                 f" This is due to python version requirements of the {package} package."
diff --git a/sktime/utils/multiindex.py b/sktime/utils/multiindex.py
index 38d23175b..a02acc0c0 100644
--- a/sktime/utils/multiindex.py
+++ b/sktime/utils/multiindex.py
@@ -4,6 +4,7 @@
 __author__ = ["fkiraly"]
 __all__ = []
 
+import numpy as np
 import pandas as pd
 
 
@@ -83,3 +84,46 @@ def rename_multiindex(idx, feature_names_out, idx_name="index"):
             'must be one of "flat", "multiindex", "original", "auto", '
             f"but found {feature_names_out}"
         )
+
+
+def apply_split(y, iloc_ix):
+    """Generate iloc indices to split according to first MultiIndex level.
+
+    Applies iloc_ix to the leftmost (0-th) level of a MultiIndex y.
+
+    Parameters
+    ----------
+    y : pd.MultiIndex or pd.Index
+        Index to split, coerced to MultiIndex if not already
+    iloc_ix: 1D np.ndarray of integer
+        iloc indices to apply to the first level of y
+
+    Returns
+    -------
+    y_iloc : ndarray
+        iloc indices for y after applying iloc_ix to the first level
+
+    Examples
+    --------
+    >>> import numpy as np
+    >>> import pandas as pd
+    >>> from sktime.utils.multiindex import apply_split
+    >>> y = pd.MultiIndex.from_tuples([(0, 0), (0, 1), (1, 0), (1, 1)])
+    >>> iloc_ix = np.array([1, 0])
+    >>> apply_split(y, iloc_ix)
+    array([2, 3, 0, 1])
+    """
+    if not isinstance(y, pd.MultiIndex):
+        zeros = [0] * len(y)
+        y = pd.MultiIndex.from_arrays([zeros, y])
+
+    if not isinstance(iloc_ix, np.ndarray):
+        iloc_ix = np.array(iloc_ix)
+
+    inst_ix = y.droplevel(-1).unique()
+    iloc_ixer = pd.DataFrame(pd.RangeIndex(len(y)), index=y)
+
+    y_loc = inst_ix[np.array(iloc_ix)]
+    y_np = [iloc_ixer.loc[x].to_numpy().flatten() for x in y_loc]
+    y_iloc = np.concatenate(y_np)
+    return y_iloc


Test patch:
diff --git a/sktime/detection/_datatypes/test/__init__.py b/sktime/detection/_datatypes/test/__init__.py
new file mode 100644
index 000000000..41ca60652
--- /dev/null
+++ b/sktime/detection/_datatypes/test/__init__.py
@@ -0,0 +1,1 @@
+"""Tests for utilities for checks and conversions for detection outputs."""
diff --git a/sktime/detection/_datatypes/test/test_convert.py b/sktime/detection/_datatypes/test/test_convert.py
new file mode 100644
index 000000000..348fcfe73
--- /dev/null
+++ b/sktime/detection/_datatypes/test/test_convert.py
@@ -0,0 +1,47 @@
+"""Tests for detection output converters."""
+
+import pandas as pd
+import pytest
+
+from sktime.detection._datatypes._convert import (
+    _convert_points_to_segments,
+    _convert_segments_to_points,
+)
+from sktime.detection._datatypes._examples import (
+    _get_example_points_2,
+    _get_example_points_3,
+    _get_example_segments_2,
+    _get_example_segments_3,
+)
+from sktime.tests.test_switch import run_test_module_changed
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed("sktime.detection._datatypes"),
+    reason="Test only runs when module changed",
+)
+def test_convert_points_to_segments():
+    """Test _convert_points_to_segments on an example."""
+    points_df = _get_example_points_2()
+    segments_df_no_lab = _convert_points_to_segments(points_df, len_X=10)
+    segments_df_w_lab = _convert_points_to_segments(
+        points_df, len_X=10, include_labels=True
+    )
+    expected_segments_df_w_lab = _get_example_segments_2()
+    expected_segments_df_no_lab = expected_segments_df_w_lab.drop(columns=["labels"])
+
+    pd.testing.assert_frame_equal(segments_df_no_lab, expected_segments_df_no_lab)
+    pd.testing.assert_frame_equal(segments_df_w_lab, expected_segments_df_w_lab)
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed("sktime.detection._datatypes"),
+    reason="Test only runs when module changed",
+)
+def test_convert_segments_to_points():
+    """Test _convert_points_to_segments on an example."""
+    seg_df = _get_example_segments_3()
+    points_df_expected = _get_example_points_3()
+    points_df = _convert_segments_to_points(seg_df, len_X=10)
+
+    pd.testing.assert_frame_equal(points_df, points_df_expected)
diff --git a/sktime/detection/tests/test_all_detectors.py b/sktime/detection/tests/test_all_detectors.py
index 335b7b6b1..13ae66282 100644
--- a/sktime/detection/tests/test_all_detectors.py
+++ b/sktime/detection/tests/test_all_detectors.py
@@ -5,6 +5,7 @@ __all__ = []
 
 import pandas as pd
 
+from sktime.detection._datatypes._check import _is_valid_detection
 from sktime.tests.test_all_estimators import BaseFixtureGenerator, QuickTester
 from sktime.utils._testing.detection import make_detection_problem
 from sktime.utils.validation.detection import check_learning_type, check_task
@@ -54,9 +55,21 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
         X_test = make_detection_problem(
             n_timepoints=10, estimator_type=estimator.get_tag("distribution_type")
         )
-        y_test = estimator.predict(X_test)
-        assert isinstance(y_test, pd.DataFrame)
-        assert isinstance(y_test.index, pd.RangeIndex)
+        y_pred = estimator.predict(X_test)
+
+        detector_type = estimator.get_tag("task")
+        if detector_type in ["anomaly_detection", "change_point_detection"]:
+            expected_y_pred_type = "points"
+        elif detector_type == "segmentation":
+            expected_y_pred_type = "segments"
+        else:
+            raise ValueError(
+                f"Unknown task tag of {estimator_instance}: {detector_type}, "
+                "expected one of ['anomaly_detection', 'change_point_detection', "
+                f"'segmentation'], but found {detector_type}"
+            )
+
+        assert _is_valid_detection(y_pred, type=expected_y_pred_type), y_pred
 
     def test_transform_output_type(self, estimator_instance):
         """Test output type for the transform method."""
@@ -84,10 +97,7 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
             estimator_type=estimator_instance.get_tag("distribution_type"),
         )
         y_pred = estimator_instance.predict_points(X_test)
-        assert isinstance(y_pred, pd.DataFrame)
-        assert isinstance(y_pred.index, pd.RangeIndex)
-        assert "ilocs" in y_pred.columns
-        assert pd.api.types.is_integer_dtype(y_pred["ilocs"].dtype), y_pred
+        assert _is_valid_detection(y_pred, type="points"), y_pred
 
     def test_predict_segments(self, estimator_instance):
         X_train = make_detection_problem(
@@ -101,13 +111,7 @@ class TestAllDetectors(DetectorFixtureGenerator, QuickTester):
             estimator_type=estimator_instance.get_tag("distribution_type"),
         )
         y_pred = estimator_instance.predict_segments(X_test)
-        assert isinstance(y_pred, pd.DataFrame)
-        assert isinstance(y_pred.index, pd.RangeIndex)
-        assert "ilocs" in y_pred.columns
-        ilocs_dtype = y_pred["ilocs"].dtype
-        assert isinstance(y_pred["ilocs"].dtype, pd.IntervalDtype) or len(y_pred) == 0
-        if not len(y_pred) == 0:
-            assert pd.api.types.is_integer_dtype(ilocs_dtype.subtype)
+        assert _is_valid_detection(y_pred, type="segments"), y_pred
 
     def test_detector_tags(self, estimator_class):
         """Check the learning_type and task tags are valid."""
diff --git a/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py b/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
index 1f6d5c928..760818b69 100644
--- a/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
+++ b/sktime/forecasting/compose/tests/test_hierarchy_ensemble.py
@@ -212,3 +212,34 @@ def test_level_one_data(forecasters, default):
         def_pred = def_frcstr.predict()
         msg = "Node default predictions do not match"
         assert np.all(actual_pred.loc[def_pred.index] == def_pred), msg
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(HierarchyEnsembleForecaster),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_get_fitted_params():
+    """Tests that get_fitted_params works as expected.
+
+    Checks absence of bug #7418.
+    """
+    from sktime.forecasting.compose import HierarchyEnsembleForecaster
+    from sktime.forecasting.naive import NaiveForecaster
+    from sktime.forecasting.trend import PolynomialTrendForecaster, TrendForecaster
+    from sktime.utils._testing.hierarchical import _bottom_hier_datagen
+
+    y = _bottom_hier_datagen(no_bottom_nodes=7, no_levels=2, random_seed=123)
+
+    forecasters = [
+        ("naive", NaiveForecaster(), 0),
+        ("trend", TrendForecaster(), 1),
+    ]
+    forecaster = HierarchyEnsembleForecaster(
+        forecasters=forecasters,
+        by="level",
+        default=PolynomialTrendForecaster(degree=2),
+    )
+    forecaster.fit(y, fh=[1, 2, 3])
+
+    assert forecaster.get_fitted_params()["naive"].is_fitted
+    assert forecaster.get_fitted_params()["trend"].is_fitted
diff --git a/sktime/forecasting/compose/tests/test_skforecast_reduce.py b/sktime/forecasting/compose/tests/test_skforecast_reduce.py
index 0eb1e7dcb..4d7136e21 100644
--- a/sktime/forecasting/compose/tests/test_skforecast_reduce.py
+++ b/sktime/forecasting/compose/tests/test_skforecast_reduce.py
@@ -6,7 +6,7 @@ import pandas as pd
 import pytest
 from pandas.testing import assert_frame_equal, assert_series_equal
 
-from sktime.forecasting.compose import SkforecastAutoreg
+from sktime.forecasting.compose import SkforecastAutoreg, SkforecastRecursive
 from sktime.tests.test_switch import run_test_for_class
 from sktime.utils._testing.forecasting import make_forecasting_problem
 
@@ -130,3 +130,120 @@ def test_SkforecastAutoreg_predict_quantile_against_ForecasterAutoreg():
     skforecast_pred_qtl.columns = pd.MultiIndex.from_arrays(multiindex)
 
     assert_frame_equal(sktime_pred_qtl, skforecast_pred_qtl)
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(SkforecastRecursive),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_SkforecastRecursive_predict_against_ForecasterRecursive():
+    """Compares the predictions of the ``sktime`` adapter against ``skforecast``'s ``ForecasterRecursive``."""  # noqa: E501
+    from skforecast.recursive import ForecasterRecursive
+    from sklearn.linear_model import LinearRegression
+
+    df = make_forecasting_problem(n_timepoints=10)
+    fh = [1, 2, 3]
+
+    sktime_model = SkforecastRecursive(LinearRegression(), 2)
+    sktime_model.fit(df)
+    sktime_pred = sktime_model.predict(fh)
+
+    skforecast_model = ForecasterRecursive(LinearRegression(), 2)
+    skforecast_model.fit(df)
+    skforecast_pred = skforecast_model.predict(3)
+
+    assert_series_equal(sktime_pred, skforecast_pred, check_names=False)
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(SkforecastRecursive),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_SkforecastRecursive_predict_with_exog_against_ForecasterRecursive():
+    """Compares the predictions of the ``sktime`` adapter against ``skforecast``'s ``ForecasterRecursive``."""  # noqa: E501
+    from skforecast.recursive import ForecasterRecursive
+    from sklearn.linear_model import LinearRegression
+
+    y, X = make_forecasting_problem(n_timepoints=10, make_X=True, index_type="range")
+    fh = [1, 2, 3]
+    X_train = X.head(7)
+    X_test = X.tail(3)
+    y_train = y.head(7)
+
+    sktime_model = SkforecastRecursive(LinearRegression(), 2)
+    sktime_model.fit(y_train, X_train)
+    sktime_pred = sktime_model.predict(fh, X_test)
+
+    # skforecast requires all or none of the column names to be string
+    X_train.columns = X_train.columns.astype("str")
+    X_test.columns = X_test.columns.astype("str")
+
+    skforecast_model = ForecasterRecursive(LinearRegression(), 2)
+    skforecast_model.fit(y_train, X_train)
+    skforecast_pred = skforecast_model.predict(3, exog=X_test)
+
+    assert_series_equal(sktime_pred, skforecast_pred, check_names=False)
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(SkforecastRecursive),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_SkforecastRecursive_predict_interval_against_ForecasterRecursive():
+    """Compares the predictions of the ``sktime`` adapter against ``skforecast``'s ``ForecasterRecursive``.
+
+    Notes
+    -----
+    * Predict confidence intervals using underlying estimator and the wrapper.
+    * Predicts for a single coverage.
+    * Uses a non-default value of 80% to test inputs are actually being respected.
+    """  # noqa: E501
+    from skforecast.recursive import ForecasterRecursive
+    from sklearn.linear_model import LinearRegression
+
+    df = make_forecasting_problem(n_timepoints=10)
+    fh = [1, 2, 3]
+
+    sktime_model = SkforecastRecursive(LinearRegression(), 2)
+    sktime_model.fit(df)
+    sktime_pred_int = sktime_model.predict_interval(fh, coverage=0.8)
+
+    skforecast_model = ForecasterRecursive(LinearRegression(), 2)
+    skforecast_model.fit(df)
+    skforecast_pred_int = skforecast_model.predict_interval(3, interval=[10, 90])
+    skforecast_pred_int = skforecast_pred_int.drop(columns="pred")
+    multiindex = [[0, 0], [0.8, 0.8], ["lower", "upper"]]
+    skforecast_pred_int.columns = pd.MultiIndex.from_arrays(multiindex)
+
+    assert_frame_equal(sktime_pred_int, skforecast_pred_int, check_names=False)
+
+
+@pytest.mark.skipif(
+    not run_test_for_class(SkforecastRecursive),
+    reason="run test only if softdeps are present and incrementally (if requested)",
+)
+def test_SkforecastRecursive_predict_quantile_against_ForecasterRecursive():
+    """Compares the predictions of the ``sktime`` adapter against ``skforecast``'s ``ForecasterRecursive``.
+
+    Notes
+    -----
+    * Predict quantiles using underlying estimator and the wrapper.
+    * Predicts for multiple coverage values, viz. 70% and 80%.
+    """  # noqa: E501
+    from skforecast.recursive import ForecasterRecursive
+    from sklearn.linear_model import LinearRegression
+
+    df = make_forecasting_problem(n_timepoints=10)
+    fh = [1, 2, 3]
+
+    sktime_model = SkforecastRecursive(LinearRegression(), 2)
+    sktime_model.fit(df)
+    sktime_pred_qtl = sktime_model.predict_quantiles(fh, alpha=[0.7, 0.8])
+
+    skforecast_model = ForecasterRecursive(LinearRegression(), 2)
+    skforecast_model.fit(df)
+    skforecast_pred_qtl = skforecast_model.predict_quantiles(3, quantiles=[0.7, 0.8])
+    multiindex = [[0, 0], [0.7, 0.8]]
+    skforecast_pred_qtl.columns = pd.MultiIndex.from_arrays(multiindex)
+
+    assert_frame_equal(sktime_pred_qtl, skforecast_pred_qtl)
diff --git a/sktime/performance_metrics/detection/tests/test_base.py b/sktime/performance_metrics/detection/tests/test_base.py
new file mode 100644
index 000000000..1de740f8a
--- /dev/null
+++ b/sktime/performance_metrics/detection/tests/test_base.py
@@ -0,0 +1,38 @@
+"""Tests for base class boilerplate."""
+
+import pandas as pd
+import pytest
+
+from sktime.detection._datatypes._examples import (
+    _get_example_points_2,
+    _get_example_points_3,
+    _get_example_segments_2,
+    _get_example_segments_3,
+)
+from sktime.performance_metrics.detection._chamfer import DirectedChamfer
+from sktime.tests.test_switch import run_test_module_changed
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed("sktime.performance_metrics.detection"),
+    reason="run test only if detection module changed",
+)
+def test_input_coercions():
+    """Test that segments are coerced for point metrics."""
+    y_pred_seg = _get_example_segments_2()
+    y_true_seg = _get_example_segments_3()
+
+    y_pred_pts = _get_example_points_2()
+    y_true_pts = _get_example_points_3()
+
+    metric = DirectedChamfer()
+
+    loss_seg = metric(y_true_seg, y_pred_seg)
+    loss_pts = metric(y_true_pts, y_pred_pts)
+    assert loss_seg == loss_pts
+
+    X = pd.DataFrame({"range10": range(10)})
+
+    loss_seg_X = metric(y_true_seg, y_pred_seg, X)
+    loss_pts_X = metric(y_true_pts, y_pred_pts, X)
+    assert loss_seg_X == loss_pts_X
diff --git a/sktime/tests/test_softdeps.py b/sktime/tests/test_softdeps.py
index 599dd7fb4..e1e228a8c 100644
--- a/sktime/tests/test_softdeps.py
+++ b/sktime/tests/test_softdeps.py
@@ -12,6 +12,7 @@ __author__ = ["mloning", "fkiraly"]
 import pkgutil
 import re
 from importlib import import_module
+from unittest.mock import patch
 
 import pytest
 
@@ -83,9 +84,7 @@ def is_soft_dep_missing_message(msg):
     missing_version_msg = "to be present in the python environment, with version"
     cond1 = missing_version_msg in msg
     # message if dependency is missing entirely
-    missing_dep_entirely_msg = (
-        "is a soft dependency and not included in the base sktime installation"
-    )
+    missing_dep_entirely_msg = "requires package"
     cond2 = missing_dep_entirely_msg in msg
     # special message for deep learning dependencies
     error_msg_dl = "required for deep learning"
@@ -325,3 +324,53 @@ def test_est_fit_without_modulenotfound(estimator):
             f'to the "python_dependencies" tag, and python version bounds should be'
             f' added to the "python_version" tag. Exception text: {error_msg}'
         ) from e
+
+
+@patch("sktime.utils.dependencies._dependencies.sys")
+@pytest.mark.parametrize(
+    "mock_release_version, prereleases, expect_exception",
+    [
+        (True, True, False),
+        (True, False, True),
+        (False, False, False),
+        (False, True, False),
+    ],
+)
+def test_check_python_version(
+    mock_sys, mock_release_version, prereleases, expect_exception
+):
+    from sktime.base import BaseObject
+
+    if mock_release_version:
+        mock_sys.version = "3.8.1rc"
+    else:
+        mock_sys.version = "3.8.1"
+
+    class DummyObjectClass(BaseObject):
+        _tags = {
+            "python_version": ">=3.7.1",  # PEP 440 version specifier, e.g., ">=3.7"
+            "python_dependencies": None,  # PEP 440 dependency strs, e.g., "pandas>=1.0"
+            "env_marker": None,  # PEP 508 environment marker, e.g., "os_name=='posix'"
+        }
+        """Define dummy class to test set_tags."""
+
+    dummy_object_instance = DummyObjectClass()
+
+    try:
+        _check_python_version(dummy_object_instance, prereleases=prereleases)
+    except ModuleNotFoundError as exception:
+        expected_msg = (
+            f"{type(dummy_object_instance).__name__} requires python version "
+            f"to be {dummy_object_instance.get_tags()['python_version']}, "
+            f"but system python version is {mock_sys.version}. "
+            "This is due to the release candidate status of your system Python."
+        )
+
+        if not expect_exception or exception.msg != expected_msg:
+            # Throw Error since exception is not expected or has not the correct message
+            raise AssertionError(
+                "ModuleNotFoundError should be NOT raised by:",
+                f"\n\t - mock_release_version: {mock_release_version},",
+                f"\n\t - prereleases: {prereleases},",
+                f"\nERROR MESSAGE: {exception.msg}",
+            ) from exception
diff --git a/sktime/utils/_testing/tests/test_check_imports.py b/sktime/utils/_testing/tests/test_check_imports.py
index 52ea182ba..4c1210848 100644
--- a/sktime/utils/_testing/tests/test_check_imports.py
+++ b/sktime/utils/_testing/tests/test_check_imports.py
@@ -5,8 +5,9 @@ from sktime.utils.dependencies import _check_soft_dependencies
 
 def test_check_soft_dependencies_raises_error():
     """Test the _check_soft_dependencies() function."""
-    with pytest.raises(ModuleNotFoundError, match=r".* soft dependency .*"):
-        _check_soft_dependencies("unavailable_module")
+    MODULE = "unavailable_module"
+    with pytest.raises(ModuleNotFoundError, match=r".* requires package .*"):
+        _check_soft_dependencies(MODULE)
 
-    with pytest.raises(ModuleNotFoundError, match=r".* soft dependency .*"):
-        _check_soft_dependencies("unavailable_module_1", "unavailable_module_2")
+    with pytest.raises(ModuleNotFoundError, match=r".* requires package .*"):
+        _check_soft_dependencies(MODULE + "_1", MODULE + "_2")
diff --git a/sktime/utils/tests/test_multiindex.py b/sktime/utils/tests/test_multiindex.py
index 2023f4d5d..b2b5bbc56 100644
--- a/sktime/utils/tests/test_multiindex.py
+++ b/sktime/utils/tests/test_multiindex.py
@@ -1,10 +1,11 @@
 """Testing multiindex utilities."""
 
+import numpy as np
 import pandas as pd
 import pytest
 
 from sktime.tests.test_switch import run_test_module_changed
-from sktime.utils.multiindex import flatten_multiindex, rename_multiindex
+from sktime.utils.multiindex import apply_split, flatten_multiindex, rename_multiindex
 
 
 @pytest.mark.skipif(
@@ -79,3 +80,21 @@ def test_rename_multiindex():
 
     assert isinstance(orig, pd.Index)
     assert (expected_orig == orig).all()
+
+
+@pytest.mark.skipif(
+    not run_test_module_changed(["sktime.utils.multiindex"]),
+    reason="Run if multiindex module has changed.",
+)
+def test_apply_split():
+    """Test apply_split() and check shapes"""
+    mi = pd.MultiIndex.from_product([["a", "b"], [0, 42]])
+
+    iloc_ix = [1]
+
+    result = apply_split(mi, iloc_ix)
+
+    expected = np.array([2, 3])
+
+    assert isinstance(result, np.ndarray)
+    assert np.array_equal(result, expected)