Repository: sktime/sktime
Pull request #7245 (2024-10-09 20:23:18)

[MNT] [Dependabot](deps): Update skpro requirement from <2.6.0,>=2 to >=2,<2.8.0
Updates the requirements on [skpro](https://github.com/sktime/skpro) to permit the latest version.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/sktime/skpro/releases">skpro's releases</a>.</em></p>
<blockquote>
<h2>v2.7.0</h2>
<h2>What's Changed</h2>
<p>Maintenance release with <code>python 3.13</code> support and some minor enhancements.</p>
<p><strong>Full Changelog</strong>: <a href="https://github.com/sktime/skpro/compare/v2.6.0...v2.7.0">https://github.com/sktime/skpro/compare/v2.6.0...v2.7.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/sktime/skpro/commit/48b9eaf62e1ebc579f585660711ee94bd317383b"><code>48b9eaf</code></a> Release 2.7.0 (<a href="https://redirect.github.com/sktime/skpro/issues/476">#476</a>)</li>
<li><a href="https://github.com/sktime/skpro/commit/d22aaf67a2c86e48401fe790b980b34165e3a73b"><code>d22aaf6</code></a> [ENH] rename <code>capability:online</code> tag to <code>capability:update</code> (<a href="https://redirect.github.com/sktime/skpro/issues/479">#479</a>)</li>
<li><a href="https://github.com/sktime/skpro/commit/109aa4b6dedb3cfd8fff896f305432d85138c46d"><code>109aa4b</code></a> [MNT] change macos runners to <code>macos-latest</code> version (<a href="https://redirect.github.com/sktime/skpro/issues/477">#477</a>)</li>
<li><a href="https://github.com/sktime/skpro/commit/592b19f2c9fbe83e81328fc4bbba619264f850b1"><code>592b19f</code></a> [MNT] python 3.13 support, add 3.13 to test matrix (<a href="https://redirect.github.com/sktime/skpro/issues/471">#471</a>)</li>
<li><a href="https://github.com/sktime/skpro/commit/1444f9a4dcfc5bcb79f869e3bff9094383afdd94"><code>1444f9a</code></a> [ENH] minor refactor - remove unnecessary <code>__init__</code> methods in <code>datatypes</code> m...</li>
<li><a href="https://github.com/sktime/skpro/commit/af594ad065a4e7e79f1d315592162ea83bde95f6"><code>af594ad</code></a> [MNT] <a href="deps">Dependabot</a>: Update polars requirement from &lt;1.7.0 to &lt;1.10.0 (#...</li>
<li><a href="https://github.com/sktime/skpro/commit/90a155a581fbea2f0966b1c3d61fd87b48584865"><code>90a155a</code></a> [MNT] <a href="deps">Dependabot</a>: Update scikit-base requirement from &lt;0.10.0,&gt;=0.6.1...</li>
<li><a href="https://github.com/sktime/skpro/commit/f4390124707a7bd5a516a1b302d913f7a30c3331"><code>f439012</code></a> [MNT] differential testing - handle non-package changes in <code>pyproject.toml</code> (...</li>
<li><a href="https://github.com/sktime/skpro/commit/8a1596169f1718b878870e944b7a0d64d084db67"><code>8a15961</code></a> [ENH] online refitting strategy after N data points (<a href="https://redirect.github.com/sktime/skpro/issues/469">#469</a>)</li>
<li><a href="https://github.com/sktime/skpro/commit/ba2aae5a3806954be5855969a156461475e289d4"><code>ba2aae5</code></a> [ENH] online update capability for probabilistic regressors (<a href="https://redirect.github.com/sktime/skpro/issues/462">#462</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/sktime/skpro/compare/v2.0.0...v2.7.0">compare view</a></li>
</ul>
</details>
<br />


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

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

---

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

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


</details>


Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 80432619a..64fe08a86 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -3053,6 +3053,15 @@
         "doc"
       ]
     },
+    {
+      "login": "Dehelaan",
+      "name": "Nihal Chaudhary",
+      "avatar_url": "https://avatars.githubusercontent.com/u/120308161?s=400&v=4",
+      "profile": "https://github.com/Dehelaan",
+      "contributions": [
+        "doc"
+      ]
+    },
     {
       "login":"vedantag17",
       "name": "Vedant Agrawal",
@@ -3063,13 +3072,31 @@
       ]
     },
     {
-      "login":"jan-mue",
+      "login": "jan-mue",
       "name": "Jan Müller",
       "avatar_url": "https://avatars.githubusercontent.com/u/6440416?v=4",
       "profile": "https://github.com/jan-mue",
       "contributions": [
         "doc"
       ]
+    },
+    {
+      "login": "Z-Fran",
+      "name": "Jindong Zhang",
+      "avatar_url": "https://avatars.githubusercontent.com/u/49083766?v=4",
+      "profile": "https://github.com/Z-Fran",
+      "contributions": [
+        "code"
+      ]
+    },
+    {
+      "login": "RigvedManoj",
+      "name": "Rigved Manoj",
+      "avatar_url": "https://avatars.githubusercontent.com/u/28307990?v=4",
+      "profile": "https://github.com/RigvedManoj",
+      "contributions": [
+        "code"
+      ]
     }
   ]
 }
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 5cb049132..ef38ce6c0 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-300-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-303-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!
@@ -167,12 +167,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/whackteachers"><img src="https://avatars0.githubusercontent.com/u/33785383?v=4?s=100" width="100px;" alt="Jason Pong"/><br /><sub><b>Jason Pong</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=whackteachers" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=whackteachers" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mateuja"><img src="https://avatars.githubusercontent.com/mateuja?s=100" width="100px;" alt="Jaume Mateu"/><br /><sub><b>Jaume Mateu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mateuja" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/javiber"><img src="https://avatars.githubusercontent.com/u/3588715?v=4?s=100" width="100px;" alt="Javier Berneche"/><br /><sub><b>Javier Berneche</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=javiber" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=javiber" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Z-Fran"><img src="https://avatars.githubusercontent.com/u/49083766?v=4?s=100" width="100px;" alt="Jindong Zhang"/><br /><sub><b>Jindong Zhang</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Z-Fran" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pirnerjonas"><img src="https://avatars.githubusercontent.com/u/48887249?v=4?s=100" width="100px;" alt="Jonas Pirner"/><br /><sub><b>Jonas Pirner</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pirnerjonas" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/JonathanBechtel"><img src="https://avatars.githubusercontent.com/u/481696?v=4?s=100" width="100px;" alt="JonathanBechtel"/><br /><sub><b>JonathanBechtel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=JonathanBechtel" title="Code">💻</a> <a href="#ideas-JonathanBechtel" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-JonathanBechtel" title="Project Management">📆</a> <a href="#talk-JonathanBechtel" title="Talks">📢</a> <a href="https://github.com/sktime/sktime/commits?author=JonathanBechtel" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jorenham"><img src="?s=100" width="100px;" alt="Joren Hammudoglu"/><br /><sub><b>Joren Hammudoglu</b></sub></a><br /><a href="#infra-jorenham" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://juanitorduz.github.io/"><img src="https://avatars1.githubusercontent.com/u/22996444?v=4?s=100" width="100px;" alt="Juan Orduz"/><br /><sub><b>Juan Orduz</b></sub></a><br /><a href="#tutorial-juanitorduz" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/commits?author=juanitorduz" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://juanitorduz.github.io/"><img src="https://avatars1.githubusercontent.com/u/22996444?v=4?s=100" width="100px;" alt="Juan Orduz"/><br /><sub><b>Juan Orduz</b></sub></a><br /><a href="#tutorial-juanitorduz" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/commits?author=juanitorduz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/julia-kraus"><img src="https://avatars.githubusercontent.com/julia-kraus?s=100" width="100px;" alt="Julia Kraus"/><br /><sub><b>Julia Kraus</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=julia-kraus" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jelc53"><img src="?s=100" width="100px;" alt="Julian Cooper"/><br /><sub><b>Julian Cooper</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jelc53" title="Code">💻</a> <a href="#ideas-jelc53" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/helloplayer1"><img src="https://avatars.githubusercontent.com/u/32032467?v=4?s=100" width="100px;" alt="Julian Haderlein"/><br /><sub><b>Julian Haderlein</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=helloplayer1" title="Documentation">📖</a></td>
@@ -181,9 +182,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.justinshenk.com/"><img src="https://avatars.githubusercontent.com/u/10270308?v=4?s=100" width="100px;" alt="Justin Shenk"/><br /><sub><b>Justin Shenk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=justinshenk" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kcc-lion"><img src="?s=100" width="100px;" alt="Kai Lion"/><br /><sub><b>Kai Lion</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=kcc-lion" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kanand77"><img src="https://avatars.githubusercontent.com/kanand77?s=100" width="100px;" alt="Kavin Anand"/><br /><sub><b>Kavin Anand</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kanand77" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://kejsitake.com/"><img src="https://avatars.githubusercontent.com/u/23707808?v=4?s=100" width="100px;" alt="Kejsi Take"/><br /><sub><b>Kejsi Take</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kejsitake" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://kejsitake.com/"><img src="https://avatars.githubusercontent.com/u/23707808?v=4?s=100" width="100px;" alt="Kejsi Take"/><br /><sub><b>Kejsi Take</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kejsitake" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/kevinlam2"><img src="https://avatars.githubusercontent.com/u/114420932?s=400&v=4?s=100" width="100px;" alt="Kevin Lam"/><br /><sub><b>Kevin Lam</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Code">💻</a> <a href="#example-klam-data" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=klam-data" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kirilral"><img src="https://avatars.githubusercontent.com/u/34281484?v=4?s=100" width="100px;" alt="Kiril Ralinovski"/><br /><sub><b>Kiril Ralinovski</b></sub></a><br /><a href="#ideas-kirilral" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-kirilral" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-kirilral" title="Project Management">📆</a> <a href="#talk-kirilral" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://whitakerlab.github.io/"><img src="https://avatars1.githubusercontent.com/u/3626306?v=4?s=100" width="100px;" alt="Kirstie Whitaker"/><br /><sub><b>Kirstie Whitaker</b></sub></a><br /><a href="#ideas-KirstieJane" title="Ideas, Planning, & Feedback">🤔</a> <a href="#fundingFinding-KirstieJane" title="Funding Finding">🔍</a></td>
@@ -192,9 +193,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/krumeto"><img src="https://avatars3.githubusercontent.com/u/11272436?v=4?s=100" width="100px;" alt="Krum Arnaudov"/><br /><sub><b>Krum Arnaudov</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Akrumeto" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=krumeto" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/koralturkk"><img src="https://avatars2.githubusercontent.com/u/18037789?s=460&v=4?s=100" width="100px;" alt="Kutay Koralturk"/><br /><sub><b>Kutay Koralturk</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=koralturkk" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akoralturkk" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ltsaprounis"><img src="https://avatars.githubusercontent.com/u/64217214?v=4?s=100" width="100px;" alt="Leonidas Tsaprounis"/><br /><sub><b>Leonidas Tsaprounis</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ltsaprounis" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Altsaprounis" title="Bug reports">🐛</a> <a href="#mentoring-ltsaprounis" title="Mentoring">🧑‍🏫</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Altsaprounis" title="Reviewed Pull Requests">👀</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/lielleravid"><img src="https://avatars.githubusercontent.com/u/37774194?v=4?s=100" width="100px;" alt="Lielle Ravid"/><br /><sub><b>Lielle Ravid</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/lielleravid"><img src="https://avatars.githubusercontent.com/u/37774194?v=4?s=100" width="100px;" alt="Lielle Ravid"/><br /><sub><b>Lielle Ravid</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lielleravid" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chillerobscuro"><img src="https://avatars.githubusercontent.com/u/5232872?v=4?s=100" width="100px;" alt="Logan Duffy"/><br /><sub><b>Logan Duffy</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=chillerobscuro" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Achillerobscuro" title="Bug reports">🐛</a> <a href="#ideas-chillerobscuro" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://lpantano.github.io/"><img src="https://avatars2.githubusercontent.com/u/1621788?v=4?s=100" width="100px;" alt="Lorena Pantano"/><br /><sub><b>Lorena Pantano</b></sub></a><br /><a href="#ideas-lpantano" title="Ideas, Planning, & Feedback">🤔</a></td>
       <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>
@@ -203,9 +204,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/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://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>
     </tr>
     <tr>
+      <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/marrov"><img src="https://avatars.githubusercontent.com/u/54272586?v=4?s=100" width="100px;" alt="Marc Rovira"/><br /><sub><b>Marc Rovira</b></sub></a><br /><a href="#design-marrov" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/commits?author=marrov" title="Documentation">📖</a> <a href="#ideas-marrov" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-marrov" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-marrov" title="Project Management">📆</a> <a href="#talk-marrov" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://marcelotryle.com"><img src="https://avatars3.githubusercontent.com/u/7353520?v=4?s=100" width="100px;" alt="Marcelo Trylesinski"/><br /><sub><b>Marcelo Trylesinski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Kludex" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MarcoGorelli"><img src="https://avatars2.githubusercontent.com/u/33491632?v=4?s=100" width="100px;" alt="Marco Gorelli"/><br /><sub><b>Marco Gorelli</b></sub></a><br /><a href="#infra-MarcoGorelli" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
@@ -214,9 +215,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://twitter.com/marielli"><img src="https://avatars2.githubusercontent.com/u/13499809?v=4?s=100" width="100px;" alt="Marielle"/><br /><sub><b>Marielle</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Code">💻</a> <a href="#ideas-marielledado" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mloning"><img src="https://avatars3.githubusercontent.com/u/21020482?v=4?s=100" width="100px;" alt="Markus Löning"/><br /><sub><b>Markus Löning</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mloning" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Tests">⚠️</a> <a href="#maintenance-mloning" title="Maintenance">🚧</a> <a href="#platform-mloning" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amloning" title="Reviewed Pull Requests">👀</a> <a href="#infra-mloning" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#example-mloning" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amloning" title="Bug reports">🐛</a> <a href="#tutorial-mloning" title="Tutorials">✅</a> <a href="#business-mloning" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Documentation">📖</a> <a href="#design-mloning" title="Design">🎨</a> <a href="#eventOrganizing-mloning" title="Event Organizing">📋</a> <a href="#fundingFinding-mloning" title="Funding Finding">🔍</a> <a href="#ideas-mloning" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-mloning" title="Project Management">📆</a> <a href="#question-mloning" title="Answering Questions">💬</a> <a href="#talk-mloning" title="Talks">📢</a> <a href="#mentoring-mloning" title="Mentoring">🧑‍🏫</a> <a href="#video-mloning" title="Videos">📹</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/martinagvilas"><img src="https://avatars2.githubusercontent.com/u/37339384?v=4?s=100" width="100px;" alt="Martina G. Vilas"/><br /><sub><b>Martina G. Vilas</b></sub></a><br /><a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amartinagvilas" title="Reviewed Pull Requests">👀</a> <a href="#ideas-martinagvilas" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mateuszkasprowicz"><img src="https://avatars.githubusercontent.com/mateuszkasprowicz?s=100" width="100px;" alt="Mateusz Kasprowicz"/><br /><sub><b>Mateusz Kasprowicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mateuszkasprowicz" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MCRE-BE"><img src="https://avatars.githubusercontent.com/u/99316631?s=100" width="100px;" alt="Mathias Creemers"/><br /><sub><b>Mathias Creemers</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMCRE-BE" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MCRE-BE" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars0.githubusercontent.com/u/25731235?v=4?s=100" width="100px;" alt="Matthew Middlehurst"/><br /><sub><b>Matthew Middlehurst</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Tests">⚠️</a> <a href="#tutorial-MatthewMiddlehurst" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3AMatthewMiddlehurst" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AMatthewMiddlehurst" title="Bug reports">🐛</a></td>
@@ -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://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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="michaelfeil.eu"><img src="https://avatars.githubusercontent.com/u/63565275?v=4?s=100" width="100px;" alt="Michael Feil"/><br /><sub><b>Michael Feil</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=michaelfeil" title="Tests">⚠️</a> <a href="#ideas-michaelfeil" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mgazian000"><img src="https://avatars.githubusercontent.com/mgazian000?s=100" width="100px;" alt="Michael Gaziani"/><br /><sub><b>Michael Gaziani</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgazian000" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MMTrooper"><img src="https://avatars.githubusercontent.com/u/89777534?v=4?s=100" width="100px;" alt="Michael Mwimali"/><br /><sub><b>Michael Mwimali</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MMTrooper" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MichalChromcak"><img src="https://avatars1.githubusercontent.com/u/12393430?v=4?s=100" width="100px;" alt="Michal Chromcak"/><br /><sub><b>Michal Chromcak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Tests">⚠️</a> <a href="#tutorial-MichalChromcak" title="Tutorials">✅</a></td>
@@ -236,20 +237,21 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Multivin12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="Multivin12"/><br /><sub><b>Multivin12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Multivin12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="Multivin12"/><br /><sub><b>Multivin12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Multivin12" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/marcio55afr"><img src="https://avatars.githubusercontent.com/u/42646282?v=4?s=100" width="100px;" alt="Márcio A. Freitas Jr"/><br /><sub><b>Márcio A. Freitas Jr</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marcio55afr" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/niekvanderlaan"><img src="https://avatars.githubusercontent.com/u/9962825?v=4?s=100" width="100px;" alt="Niek van der Laan"/><br /><sub><b>Niek van der Laan</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=niekvanderlaan" title="Code">💻</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Dehelaan"><img src="https://avatars.githubusercontent.com/u/120308161?s=400&v=4?s=100" width="100px;" alt="Nihal Chaudhary"/><br /><sub><b>Nihal Chaudhary</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Dehelaan" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=100" width="100px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Documentation">📖</a></td>
       <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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/NoaBenAmi"><img src="https://avatars.githubusercontent.com/u/37590002?v=4?s=100" width="100px;" alt="Noa Ben Ami"/><br /><sub><b>Noa Ben Ami</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=NoaBenAmi" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/shchur"><img src="https://avatars.githubusercontent.com/u/6944857?v=4?s=100" width="100px;" alt="Oleksandr Shchur"/><br /><sub><b>Oleksandr Shchur</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ashchur" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=shchur" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/kachayev"><img src="https://avatars.githubusercontent.com/u/485647?v=4?s=100" width="100px;" alt="Oleksii Kachaiev"/><br /><sub><b>Oleksii Kachaiev</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/shchur"><img src="https://avatars.githubusercontent.com/u/6944857?v=4?s=100" width="100px;" alt="Oleksandr Shchur"/><br /><sub><b>Oleksandr Shchur</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Ashchur" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=shchur" title="Code">💻</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/kachayev"><img src="https://avatars.githubusercontent.com/u/485647?v=4?s=100" width="100px;" alt="Oleksii Kachaiev"/><br /><sub><b>Oleksii Kachaiev</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=kachayev" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/olivermatthews"><img src="https://avatars.githubusercontent.com/u/31141490?v=4?s=100" width="100px;" alt="Oliver Matthews"/><br /><sub><b>Oliver Matthews</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=OliverMatthews" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=100" width="100px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Code">💻</a> <a href="#design-prockenschaub" title="Design">🎨</a> <a href="#ideas-prockenschaub" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=100" width="100px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
@@ -257,131 +259,132 @@ 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/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>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Piyush1729"><img src="https://avatars2.githubusercontent.com/u/64950012?v=4?s=100" width="100px;" alt="Piyush Gade"/><br /><sub><b>Piyush Gade</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Piyush1729" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3APiyush1729" title="Reviewed Pull Requests">👀</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/rahulporuri"><img src="https://avatars.githubusercontent.com/u/1926457?v=4?s=100" width="100px;" alt="Poruri Sai Rahul"/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rahulporuri" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/pranav-prajapati-a5b413226/"><img src="https://avatars.githubusercontent.com/u/94780581?v=4?s=100" width="100px;" alt="Pranav Prajapati"/><br /><sub><b>Pranav Prajapati</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Apranavvp16" title="Bug reports">🐛</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/rahulporuri"><img src="https://avatars.githubusercontent.com/u/1926457?v=4?s=100" width="100px;" alt="Poruri Sai Rahul"/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rahulporuri" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/pranav-prajapati-a5b413226/"><img src="https://avatars.githubusercontent.com/u/94780581?v=4?s=100" width="100px;" alt="Pranav Prajapati"/><br /><sub><b>Pranav Prajapati</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Apranavvp16" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=100" width="100px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=100" width="100px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ram0nB"><img src="https://avatars.githubusercontent.com/u/45173421?s=100" width="100px;" alt="Ramon Bussing"/><br /><sub><b>Ramon Bussing</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ARam0nB" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RavenRudi"><img src="https://avatars.githubusercontent.com/u/46402968?v=4?s=100" width="100px;" alt="RavenRudi"/><br /><sub><b>RavenRudi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RavenRudi" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wolph"><img src="?s=100" width="100px;" alt="Rick van Hattem"/><br /><sub><b>Rick van Hattem</b></sub></a><br /><a href="#infra-wolph" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/RigvedManoj"><img src="https://avatars.githubusercontent.com/u/28307990?v=4?s=100" width="100px;" alt="Rigved Manoj"/><br /><sub><b>Rigved Manoj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RigvedManoj" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <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/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%"><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://www.linkedin.com/in/romanlutz/"><img src="https://avatars.githubusercontent.com/u/10245648?v=4?s=100" width="100px;" alt="Roman Lutz"/><br /><sub><b>Roman Lutz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=romanlutz" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ronnie-llamado"><img src="https://avatars.githubusercontent.com/ronnie-llamado?s=100" width="100px;" alt="Ronnie Llamado"/><br /><sub><b>Ronnie Llamado</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ronnie-llamado" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rnkuhns"><img src="https://avatars0.githubusercontent.com/u/26907244?v=4?s=100" width="100px;" alt="Ryan Kuhns"/><br /><sub><b>Ryan Kuhns</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Documentation">📖</a> <a href="#tutorial-RNKuhns" title="Tutorials">✅</a> <a href="#example-RNKuhns" title="Examples">💡</a> <a href="#ideas-RNKuhns" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3ARNKuhns" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=RNKuhns" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/achieveordie"><img src="https://avatars.githubusercontent.com/u/54197164?v=4?s=100" width="100px;" alt="Sagar Mishra"/><br /><sub><b>Sagar Mishra</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aachieveordie" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=achieveordie" title="Code">💻</a> <a href="#ideas-achieveordie" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-achieveordie" title="Project Management">📆</a> <a href="https://github.com/sktime/sktime/commits?author=achieveordie" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SaiRevanth25"><img src="https://avatars.githubusercontent.com/SaiRevanth25?s=100" width="100px;" alt="Sai Revanth Gowravajhala"/><br /><sub><b>Sai Revanth Gowravajhala</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SaiRevanth25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ASaiRevanth25" title="Bug reports">🐛</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://sajay.online"><img src="https://avatars2.githubusercontent.com/u/25329624?v=4?s=100" width="100px;" alt="Sajaysurya Ganesh"/><br /><sub><b>Sajaysurya Ganesh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Documentation">📖</a> <a href="#design-sajaysurya" title="Design">🎨</a> <a href="#example-sajaysurya" title="Examples">💡</a> <a href="#ideas-sajaysurya" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Tests">⚠️</a> <a href="#tutorial-sajaysurya" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamiAlavi"><img src="https://avatars.githubusercontent.com/u/32700289?v=4?s=100" width="100px;" alt="Sami Alavi"/><br /><sub><b>Sami Alavi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamiAlavi" title="Code">💻</a> <a href="#maintenance-SamiAlavi" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamruddhiNavale"><img src="https://avatars.githubusercontent.com/u/86359115?v=4?s=100" width="100px;" alt="Samruddhi Navale"/><br /><sub><b>Samruddhi Navale</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamruddhiNavale" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sanjayk0508"><img src="https://avatars.githubusercontent.com/u/102804548?v=4?s=100" width="100px;" alt="Sanjay Kumar"/><br /><sub><b>Sanjay Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sanjayk0508" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/deysanjeeb"><img src="https://avatars.githubusercontent.com/u/39940629?v=4?s=100" width="100px;" alt="Sanjeeb Dey"/><br /><sub><b>Sanjeeb Dey</b></sub></a><br /><a href="#maintenance-deysanjeeb" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sssilvar"><img src="https://avatars.githubusercontent.com/u/16252054?v=4?s=100" width="100px;" alt="Santiago Smith Silva"/><br /><sub><b>Santiago Smith Silva</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sssilvar" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Saptarshi-Bandopadhyay"><img src="https://avatars.githubusercontent.com/u/88289395?v=4?s=100" width="100px;" alt="Saptarshi Bandopadhyay"/><br /><sub><b>Saptarshi Bandopadhyay</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Saptarshi-Bandopadhyay" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Saransh-cpp"><img src="https://avatars.githubusercontent.com/u/74055102?v=4?s=100" width="100px;" alt="Saransh Chopra"/><br /><sub><b>Saransh Chopra</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Saransh-cpp" title="Documentation">📖</a> <a href="#infra-Saransh-cpp" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/satya-pattnaik-77a430144/"><img src="https://avatars.githubusercontent.com/u/22102468?v=4?s=100" width="100px;" alt="Satya Prakash Pattnaik"/><br /><sub><b>Satya Prakash Pattnaik</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=satya-pattnaik" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/dasgupsa"><img src="https://avatars2.githubusercontent.com/u/10398956?v=4?s=100" width="100px;" alt="Saurabh Dasgupta"/><br /><sub><b>Saurabh Dasgupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=dasgupsa" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SebasKoel"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="Sebastiaan Koel"/><br /><sub><b>Sebastiaan Koel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=100" width="100px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=shagn" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bastisar"><img src="https://avatars.githubusercontent.com/u/142449680?v=4?s=100" width="100px;" alt="Sebastian Hien"/><br /><sub><b>Sebastian Hien</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Abastisar" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bastisar" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShivamPathak99"><img src="https://avatars.githubusercontent.com/u/98941325?s=400&v=4?s=100" width="100px;" alt="Shivam Pathak"/><br /><sub><b>Shivam Pathak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ShivamPathak99" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/AurumnPegasus"><img src="https://avatars.githubusercontent.com/u/54315149?v=4?s=100" width="100px;" alt="Shivansh Subramanian"/><br /><sub><b>Shivansh Subramanian</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=AurumnPegasus" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=AurumnPegasus" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><img src="https://gravatar.com/avatar/cbdbaac712ae282d730cd3028e862d45?s=400&d=robohash&r=x?s=100" width="100px;" alt="Shlok Sabarwal"/><br /><sub><b>Shlok Sabarwal</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=ssabarwal" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShreeshaM07"><img src="https://avatars.githubusercontent.com/u/120820143?s=400&v=4?s=100" width="100px;" alt="Shreesha M"/><br /><sub><b>Shreesha M</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AShreeshaM07" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sbuse"><img src="https://avatars.githubusercontent.com/u/24408707?v=4?s=100" width="100px;" alt="Simon B."/><br /><sub><b>Simon B.</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sbuse" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/slavik57"><img src="https://avatars.githubusercontent.com/u/6184997?v=4?s=100" width="100px;" alt="Slava Shpitalny"/><br /><sub><b>Slava Shpitalny</b></sub></a><br /><a href="#maintenance-slavik57" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/solomon-botchway-a1383821b/"><img src="https://avatars.githubusercontent.com/u/62394255?v=4?s=100" width="100px;" alt="Solomon Botchway"/><br /><sub><b>Solomon Botchway</b></sub></a><br /><a href="#maintenance-snnbotchway" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/khrapovs"><img src="https://avatars.githubusercontent.com/u/3774663?v=4?s=100" width="100px;" alt="Stanislav Khrapov"/><br /><sub><b>Stanislav Khrapov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=khrapovs" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/steenrotsman"><img src="https://avatars.githubusercontent.com/u/78110080?s=400&v=4?s=100" width="100px;" alt="Stijn J. Rotman"/><br /><sub><b>Stijn J. Rotman</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=steenrotsman" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/SveaMeyer13"><img src="https://avatars.githubusercontent.com/u/46671894?v=4?s=100" width="100px;" alt="Svea Marie Meyer"/><br /><sub><b>Svea Marie Meyer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SveaMeyer13" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=SveaMeyer13" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/TNTran92"><img src="https://avatars.githubusercontent.com/u/55965636?v=4?s=100" width="100px;" alt="TNTran92"/><br /><sub><b>TNTran92</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=TNTran92" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Taise228"><img src="https://avatars.githubusercontent.com/u/95762401?s=400&v=4?s=100" width="100px;" alt="Taisei Yamamoto"/><br /><sub><b>Taisei Yamamoto</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Taise228" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://thayeylolu.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/13348874?v=4?s=100" width="100px;" alt="Taiwo Owoseni"/><br /><sub><b>Taiwo Owoseni</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=thayeylolu" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lnthach"><img src="https://avatars0.githubusercontent.com/u/7788363?v=4?s=100" width="100px;" alt="Thach Le Nguyen"/><br /><sub><b>Thach Le Nguyen</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lnthach" title="Tests">⚠️</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mathco-wf"><img src="https://avatars.githubusercontent.com/mathco-wf?s=100" width="100px;" alt="TheMathcompay Widget Factory Team"/><br /><sub><b>TheMathcompay Widget Factory Team</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mathco-wf" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tombh"><img src="https://avatars.githubusercontent.com/u/160835?s=80&v=4?s=100" width="100px;" alt="Thomas Buckley-Houston"/><br /><sub><b>Thomas Buckley-Houston</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atombh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xxl4tomxu98"><img src="https://avatars.githubusercontent.com/u/62292177?s=40&v=4?s=100" width="100px;" alt="Tom Xu"/><br /><sub><b>Tom Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xxl4tomxu98" title="Documentation">📖</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tpvasconcelos"><img src="https://avatars.githubusercontent.com/u/17701527?v=4?s=100" width="100px;" alt="Tomas P. de Vasconcelos"/><br /><sub><b>Tomas P. de Vasconcelos</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Atpvasconcelos" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=tpvasconcelos" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tch"><img src="https://avatars3.githubusercontent.com/u/184076?v=4?s=100" width="100px;" alt="Tomasz Chodakowski"/><br /><sub><b>Tomasz Chodakowski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tch" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=tch" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Atch" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars1.githubusercontent.com/u/9594042?v=4?s=100" width="100px;" alt="Tony Bagnall"/><br /><sub><b>Tony Bagnall</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=TonyBagnall" title="Code">💻</a> <a href="#business-TonyBagnall" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=TonyBagnall" title="Documentation">📖</a> <a href="#design-TonyBagnall" title="Design">🎨</a> <a href="#eventOrganizing-TonyBagnall" title="Event Organizing">📋</a> <a href="#fundingFinding-TonyBagnall" title="Funding Finding">🔍</a> <a href="#ideas-TonyBagnall" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-TonyBagnall" title="Project Management">📆</a> <a href="#question-TonyBagnall" title="Answering Questions">💬</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3ATonyBagnall" title="Reviewed Pull Requests">👀</a> <a href="#talk-TonyBagnall" title="Talks">📢</a> <a href="#data-TonyBagnall" title="Data">🔣</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/onyekaugochukwu"><img src="https://avatars.githubusercontent.com/u/92909501?v=4?s=100" width="100px;" alt="Ugochukwu Onyeka"/><br /><sub><b>Ugochukwu Onyeka</b></sub></a><br /><a href="#business-onyekaugochukwu" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=onyekaugochukwu" title="Documentation">📖</a> <a href="#ideas-onyekaugochukwu" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-onyekaugochukwu" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-onyekaugochukwu" title="Project Management">📆</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/utsavcoding"><img src="https://avatars3.githubusercontent.com/u/55446385?v=4?s=100" width="100px;" alt="Utsav Kumar Tiwari"/><br /><sub><b>Utsav Kumar Tiwari</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=utsavcoding" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vandit98"><img src="https://avatars.githubusercontent.com/u/91458535?v=4?s=100" width="100px;" alt="Vandit Tyagi"/><br /><sub><b>Vandit Tyagi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vandit98" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Vasudeva-bit"><img src="https://avatars.githubusercontent.com/u/70791259?v=4?s=100" width="100px;" alt="Vasudeva Kilaru"/><br /><sub><b>Vasudeva Kilaru</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Vasudeva-bit" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedantag17"><img src="https://avatars.githubusercontent.com/u/118207011?v=4?s=100" width="100px;" alt="Vedant Agrawal"/><br /><sub><b>Vedant Agrawal</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedantag17" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/victordremov"><img src="https://avatars.githubusercontent.com/u/32140716?s=100" width="100px;" alt="Viktor Dremov"/><br /><sub><b>Viktor Dremov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=victordremov" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ViktorKaz"><img src="https://avatars0.githubusercontent.com/u/33499138?v=4?s=100" width="100px;" alt="ViktorKaz"/><br /><sub><b>ViktorKaz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ViktorKaz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ViktorKaz" title="Documentation">📖</a> <a href="#design-ViktorKaz" title="Design">🎨</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vnicholson1"><img src="?s=100" width="100px;" alt="Vincent Nicholson"/><br /><sub><b>Vincent Nicholson</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vnicholson1" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/VyomkeshVyas"><img src="?s=100" width="100px;" alt="Vyomkesh Vyas"/><br /><sub><b>Vyomkesh Vyas</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Documentation">📖</a> <a href="#example-VyomkeshVyas" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=VyomkeshVyas" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wayneadams"><img src="https://avatars.githubusercontent.com/u/15034841?s=400&u=d717e9945910bcc844c5e64cd56d570c6cc4e8e6&v=4?s=100" width="100px;" alt="Wayne Adams"/><br /><sub><b>Wayne Adams</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wayneadams" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/fr1ll"><img src="https://avatars.githubusercontent.com/u/29168593?v=4?s=100" width="100px;" alt="Will Sanger"/><br /><sub><b>Will Sanger</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/templierw/"><img src="https://github.com/templierw.png?s=100" width="100px;" alt="William Templier"/><br /><sub><b>William Templier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=templierw" title="Documentation">📖</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/magittan"><img src="https://avatars0.githubusercontent.com/u/14024202?v=4?s=100" width="100px;" alt="William Zheng"/><br /><sub><b>William Zheng</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=magittan" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=magittan" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wirrywoo"><img src="https://avatars.githubusercontent.com/u/148647848?v=4?s=100?s=100" width="100px;" alt="Wilson Cheung"/><br /><sub><b>Wilson Cheung</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=wirrywoo" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wpdonders"><img src="https://avatars.githubusercontent.com/u/1868824?v=4?s=100?s=100" width="100px;" alt="Wouter Donders"/><br /><sub><b>Wouter Donders</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wpdonders" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=wpdonders" title="Tests">⚠️</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/XinyuWuu"><img src="https://avatars.githubusercontent.com/u/57612792?v=4?s=100" width="100px;" alt="Xinyu Wu"/><br /><sub><b>Xinyu Wu</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AXinyuWuu" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=XinyuWuu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=XinyuWuu" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yairbeer"><img src="https://avatars.githubusercontent.com/yairbeer?s=100" width="100px;" alt="Yair Beer"/><br /><sub><b>Yair Beer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yairbeer" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/yann-hallouard/"><img src="https://avatars.githubusercontent.com/YHallouard?s=100" width="100px;" alt="Yann Hallouard"/><br /><sub><b>Yann Hallouard</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YHallouard" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MEMEO-PRO"><img src="https://avatars.githubusercontent.com/memeo-pro?s=100" width="100px;" alt="Yash Edake"/><br /><sub><b>Yash Edake</b></sub></a><br /><a href="#maintenance-memeo-pro" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amemeo-pro" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/YashKhare20"><img src="https://avatars.githubusercontent.com/u/92680366?s=400?s=100" width="100px;" alt="Yash Khare"/><br /><sub><b>Yash Khare</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yashlamba"><img src="https://avatars.githubusercontent.com/u/44164398?v=4?s=100" width="100px;" alt="Yash Lamba"/><br /><sub><b>Yash Lamba</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yashlamba" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=100" width="100px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sz85512678"><img src="https://avatars.githubusercontent.com/sz85512678?s=100" width="100px;" alt="Zhen Shao"/><br /><sub><b>Zhen Shao</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sz85512678" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ZiyaoWei"><img src="https://avatars.githubusercontent.com/u/940823?v=4?s=100" width="100px;" alt="Ziyao Wei"/><br /><sub><b>Ziyao Wei</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ZiyaoWei" title="Code">💻</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/aa25desh"><img src="https://avatars1.githubusercontent.com/u/29518290?v=4?s=100" width="100px;" alt="aa25desh"/><br /><sub><b>aa25desh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=aa25desh" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Aaa25desh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/abandus"><img src="https://avatars2.githubusercontent.com/u/46486474?v=4?s=100" width="100px;" alt="abandus"/><br /><sub><b>abandus</b></sub></a><br /><a href="#ideas-abandus" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=abandus" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/adoherty21"><img src="https://avatars.githubusercontent.com/u/52799751?s=400&v=4?s=100" width="100px;" alt="adoherty21"/><br /><sub><b>adoherty21</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Aadoherty21" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bethrice44"><img src="https://avatars.githubusercontent.com/u/11226988?v=4?s=100" width="100px;" alt="bethrice44"/><br /><sub><b>bethrice44</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Abethrice44" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abethrice44" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/commits?author=bethrice44" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/big-o"><img src="https://avatars1.githubusercontent.com/u/1134151?v=4?s=100" width="100px;" alt="big-o"/><br /><sub><b>big-o</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=big-o" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=big-o" title="Tests">⚠️</a> <a href="#design-big-o" title="Design">🎨</a> <a href="#ideas-big-o" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Abig-o" title="Reviewed Pull Requests">👀</a> <a href="#tutorial-big-o" title="Tutorials">✅</a> <a href="#mentoring-big-o" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/bobbys-dev"><img src="https://avatars.githubusercontent.com/bobbys-dev?s=100" width="100px;" alt="bobbys"/><br /><sub><b>bobbys</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=bobbys-dev" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/brettkoonce"><img src="https://avatars2.githubusercontent.com/u/11281814?v=4?s=100" width="100px;" alt="brett koonce"/><br /><sub><b>brett koonce</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=brettkoonce" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/btrtts"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="btrtts"/><br /><sub><b>btrtts</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=btrtts" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chizzi25"><img src="https://avatars3.githubusercontent.com/u/67911243?v=4?s=100" width="100px;" alt="chizzi25"/><br /><sub><b>chizzi25</b></sub></a><br /><a href="#blog-chizzi25" title="Blogposts">📝</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/chrisholder"><img src="https://avatars.githubusercontent.com/u/4674372?v=4?s=100" width="100px;" alt="chrisholder"/><br /><sub><b>chrisholder</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=chrisholder" title="Documentation">📖</a> <a href="#design-chrisholder" title="Design">🎨</a> <a href="#example-chrisholder" title="Examples">💡</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/morestart"><img src="https://avatars.githubusercontent.com/u/35556811?s=100" width="100px;" alt="ctl"/><br /><sub><b>ctl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Amorestart" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/danbartl"><img src="https://avatars.githubusercontent.com/u/19947407?v=4?s=100" width="100px;" alt="danbartl"/><br /><sub><b>danbartl</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3Adanbartl" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Code">💻</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Adanbartl" title="Reviewed Pull Requests">👀</a> <a href="#talk-danbartl" title="Talks">📢</a> <a href="https://github.com/sktime/sktime/commits?author=danbartl" title="Tests">⚠️</a> <a href="#tutorial-danbartl" title="Tutorials">✅</a> <a href="#video-danbartl" title="Videos">📹</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/hamzahiqb"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hamzahiqb"/><br /><sub><b>hamzahiqb</b></sub></a><br /><a href="#infra-hamzahiqb" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/hiqbal2"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=100" width="100px;" alt="hiqbal2"/><br /><sub><b>hiqbal2</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=hiqbal2" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jesellier"><img src="https://avatars0.githubusercontent.com/u/51952076?v=4?s=100" width="100px;" alt="jesellier"/><br /><sub><b>jesellier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jesellier" title="Code">💻</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/jschemm"><img src="https://avatars.githubusercontent.com/u/81151346?v=4?s=100" width="100px;" alt="jschemm"/><br /><sub><b>jschemm</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=jschemm" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/kkoziara"><img src="https://avatars1.githubusercontent.com/u/4346849?v=4?s=100" width="100px;" alt="kkoziara"/><br /><sub><b>kkoziara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=kkoziara" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Akkoziara" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/matteogales"><img src="https://avatars0.githubusercontent.com/u/9269326?v=4?s=100" width="100px;" alt="matteogales"/><br /><sub><b>matteogales</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=matteogales" title="Code">💻</a> <a href="#design-matteogales" title="Design">🎨</a> <a href="#ideas-matteogales" title="Ideas, Planning, & Feedback">🤔</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/oleskiewicz"><img src="https://avatars1.githubusercontent.com/u/5682158?v=4?s=100" width="100px;" alt="oleskiewicz"/><br /><sub><b>oleskiewicz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=oleskiewicz" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/pabworks"><img src="https://avatars.githubusercontent.com/u/32725127?v=4?s=100" width="100px;" alt="pabworks"/><br /><sub><b>pabworks</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pabworks" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xloem"><img src="?s=100" width="100px;" alt="patiently pending world peace"/><br /><sub><b>patiently pending world peace</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xloem" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/raishubham1"><img src="https://avatars3.githubusercontent.com/u/29356417?v=4?s=100" width="100px;" alt="raishubham1"/><br /><sub><b>raishubham1</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=raishubham1" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/simone-pignotti"><img src="https://avatars1.githubusercontent.com/u/44410066?v=4?s=100" width="100px;" alt="simone-pignotti"/><br /><sub><b>simone-pignotti</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=simone-pignotti" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Asimone-pignotti" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sophijka"><img src="https://avatars2.githubusercontent.com/u/47450591?v=4?s=100" width="100px;" alt="sophijka"/><br /><sub><b>sophijka</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sophijka" title="Documentation">📖</a> <a href="#maintenance-sophijka" title="Maintenance">🚧</a></td>
+    </tr>
+    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sri1419"><img src="https://avatars2.githubusercontent.com/u/65078278?v=4?s=100" width="100px;" alt="sri1419"/><br /><sub><b>sri1419</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sri1419" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tensorflow-as-tf"><img src="https://avatars.githubusercontent.com/u/51345718?v=4?s=100" width="100px;" alt="tensorflow-as-tf"/><br /><sub><b>tensorflow-as-tf</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tensorflow-as-tf" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vedazeren"><img src="https://avatars3.githubusercontent.com/u/63582874?v=4?s=100" width="100px;" alt="vedazeren"/><br /><sub><b>vedazeren</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=vedazeren" title="Tests">⚠️</a></td>
-    </tr>
-    <tr>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vincent-nich12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=100" width="100px;" alt="vincent-nich12"/><br /><sub><b>vincent-nich12</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vincent-nich12" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/vollmersj"><img src="https://avatars2.githubusercontent.com/u/12613127?v=4?s=100" width="100px;" alt="vollmersj"/><br /><sub><b>vollmersj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=vollmersj" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/xiaobenbenecho"><img src="https://avatars.githubusercontent.com/u/17461849?v=4?s=100" width="100px;" alt="xiaobenbenecho"/><br /><sub><b>xiaobenbenecho</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xiaobenbenecho" title="Code">💻</a></td>
diff --git a/README.md b/README.md
index d5727ee0c..0a6123d78 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 
 :rocket: **Version 0.33.1 out now!** [Check out the release notes here](https://www.sktime.net/en/latest/changelog.html).
 
-sktime is a library for time series analysis in Python. It provides a unified interface for multiple time series learning tasks. Currently, this includes time series classification, regression, clustering, annotation, and forecasting. It comes with [time series algorithms](https://www.sktime.net/en/stable/estimator_overview.html) and [scikit-learn] compatible tools to build, tune and validate time series models.
+sktime is a library for time series analysis in Python. It provides a unified interface for multiple time series learning tasks. Currently, this includes time series classification, regression, clustering, annotation, and forecasting. It comes with [time series algorithms](https://www.sktime.net/en/stable/estimator_overview.html) and [scikit-learn] compatible tools to build, tune, and validate time series models.
 
 [scikit-learn]: https://scikit-learn.org/stable/
 
@@ -62,7 +62,7 @@ Questions and feedback are extremely welcome! We strongly believe in the value o
 [discord]: https://discord.com/invite/54ACzaFsn7
 
 ## :dizzy: Features
-Our objective is to enhance the interoperability and usability of the time series analysis ecosystem in its entirety. sktime provides a __unified interface for distinct but related time series learning tasks__. It features [__dedicated time series algorithms__](https://www.sktime.net/en/stable/estimator_overview.html) and __tools for composite model building__  such as pipelining, ensembling, tuning, and reduction, empowering users to apply an algorithm designed for one task to another.
+Our objective is to enhance the interoperability and usability of the time series analysis ecosystem in its entirety. sktime provides a __unified interface for distinct but related time series learning tasks__. It features [__dedicated time series algorithms__](https://www.sktime.net/en/stable/estimator_overview.html) and __tools for composite model building__,  such as pipelining, ensembling, tuning, and reduction, empowering users to apply algorithms designed for one task to another.
 
 sktime also provides **interfaces to related libraries**, for example [scikit-learn], [statsmodels], [tsfresh], [PyOD], and [fbprophet], among others.
 
diff --git a/docs/source/api_reference/forecasting.rst b/docs/source/api_reference/forecasting.rst
index d90d06a2a..d951367bb 100644
--- a/docs/source/api_reference/forecasting.rst
+++ b/docs/source/api_reference/forecasting.rst
@@ -439,7 +439,7 @@ Structural time series models
     DynamicFactor
 
 Deep learning based forecasters
----------------------------------------------
+-------------------------------
 
 .. currentmodule:: sktime.forecasting.ltsf
 
@@ -452,66 +452,86 @@ Deep learning based forecasters
     LTSFNLinearForecaster
     LTSFTransformerForecaster
 
-.. currentmodule:: sktime.forecasting.hf_transformers_forecaster
+.. currentmodule:: sktime.forecasting.conditional_invertible_neural_network
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    HFTransformersForecaster
+    CINNForecaster
 
-.. currentmodule:: sktime.forecasting.timesfm_forecaster
+.. currentmodule:: sktime.forecasting.neuralforecast
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    TimesFMForecaster
+    NeuralForecastRNN
+    NeuralForecastLSTM
 
-.. currentmodule:: sktime.forecasting.ttm
+.. currentmodule:: sktime.forecasting.pytorchforecasting
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    TinyTimeMixerForecaster
+    PytorchForecastingTFT
+    PytorchForecastingDeepAR
+    PytorchForecastingNHiTS
+    PytorchForecastingNBeats
 
-.. currentmodule:: sktime.forecasting.conditional_invertible_neural_network
+.. currentmodule:: sktime.forecasting.pykan_forecaster
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    CINNForecaster
+    PyKANForecaster
 
-.. currentmodule:: sktime.forecasting.neuralforecast
+
+
+Pre-trained and foundation models
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. currentmodule:: sktime.forecasting.hf_transformers_forecaster
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    NeuralForecastRNN
-    NeuralForecastLSTM
+    HFTransformersForecaster
 
-.. currentmodule:: sktime.forecasting.pytorchforecasting
+.. currentmodule:: sktime.forecasting.chronos
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    PytorchForecastingTFT
-    PytorchForecastingDeepAR
-    PytorchForecastingNHiTS
-    PytorchForecastingNBeats
+    ChronosForecaster
 
-.. currentmodule:: sktime.forecasting.pykan_forecaster
+.. currentmodule:: sktime.forecasting.moirai_forecaster
 
 .. autosummary::
     :toctree: auto_generated/
     :template: class.rst
 
-    PyKANForecaster
+    MOIRAIForecaster
 
+.. currentmodule:: sktime.forecasting.timesfm_forecaster
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    TimesFMForecaster
+
+.. currentmodule:: sktime.forecasting.ttm
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    TinyTimeMixerForecaster
 
 Intermittent time series forecasters
 ------------------------------------
diff --git a/pyproject.toml b/pyproject.toml
index 40c9f8b7e..2c4e66c09 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -106,7 +106,7 @@ all_extras = [
   "seaborn>=0.11",
   "seasonal",
   "skforecast<0.14,>=0.12.1",
-  "skpro>=2,<2.6.0",
+  "skpro>=2,<2.8.0",
   'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
   "statsmodels>=0.12.1",
   'stumpy>=1.5.1; python_version < "3.11"',
@@ -148,7 +148,7 @@ all_extras_pandas2 = [
   "seaborn>=0.11",
   "seasonal",
   "skforecast<0.14,>=0.12.1",
-  "skpro>=2,<2.6.0",
+  "skpro>=2,<2.8.0",
   'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
   "statsmodels>=0.12.1",
   'stumpy>=1.5.1; python_version < "3.11"',
@@ -197,7 +197,7 @@ forecasting = [
   'pmdarima!=1.8.1,<2.1,>=1.8; python_version < "3.12"',
   "prophet<1.2,>=1.1",
   "skforecast<0.14,>=0.12.1",
-  "skpro>=2,<2.6.0",
+  "skpro>=2,<2.8.0",
   'statsforecast<1.8.0,>=1.0.0; python_version < "3.12"',
   "statsmodels<0.15,>=0.12.1",
   'tbats<1.2,>=1.1; python_version < "3.12"',
diff --git a/sktime/base/_base_panel.py b/sktime/base/_base_panel.py
index 9a6f91926..73df0606e 100644
--- a/sktime/base/_base_panel.py
+++ b/sktime/base/_base_panel.py
@@ -15,15 +15,6 @@ import numpy as np
 import pandas as pd
 
 from sktime.base import BaseEstimator
-from sktime.datatypes import (
-    MTYPE_LIST_PANEL,
-    MTYPE_LIST_TABLE,
-    VectorizedDF,
-    check_is_error_msg,
-    check_is_scitype,
-    convert,
-)
-from sktime.datatypes._dtypekind import DtypeKind
 from sktime.utils.warnings import warn
 
 
@@ -115,6 +106,8 @@ class BasePanelMixin(BaseEstimator):
         """Boilerplate logic for fit_predict and fit_predict_proba."""
         from sklearn.model_selection import KFold
 
+        from sktime.datatypes import convert
+
         if isinstance(cv, int):
             random_state = getattr(self, "random_state", None)
             cv = KFold(cv, random_state=random_state, shuffle=True)
@@ -329,6 +322,8 @@ class BasePanelMixin(BaseEstimator):
             usually a pd.DataFrame (nested) or 3D np.ndarray
             Checked and possibly converted input data
         """
+        from sktime.datatypes import convert
+
         inner_type = self.get_tag("X_inner_mtype")
         # convert pd.DataFrame
         X = convert(
@@ -357,6 +352,15 @@ class BasePanelMixin(BaseEstimator):
         y_mtype : str, only returned if return_to_mtype=True
             mtype of y_inner, after convert
         """
+        from sktime.datatypes import (
+            MTYPE_LIST_TABLE,
+            VectorizedDF,
+            check_is_error_msg,
+            check_is_scitype,
+            convert,
+        )
+        from sktime.datatypes._dtypekind import DtypeKind
+
         if y is None:
             if return_to_mtype:
                 return None, None, None
@@ -437,6 +441,8 @@ class BasePanelMixin(BaseEstimator):
         y_mtype : str
             mtype of y
         """
+        from sktime.datatypes import check_is_scitype
+
         y_mtype = check_is_scitype(y, "Table", return_metadata="mtype")
         return y_mtype
 
@@ -452,6 +458,8 @@ class BasePanelMixin(BaseEstimator):
         -------
         y : np.ndarray or pd.DataFrame
         """
+        from sktime.datatypes import convert
+
         # for consistency with legacy behaviour:
         # output is coerced to numpy1D in case of univariate output
         if not self._y_metadata["is_univariate"]:
@@ -503,6 +511,13 @@ class BasePanelMixin(BaseEstimator):
         ValueError
             If y or X is invalid input data type, or there is not enough data
         """
+        from sktime.datatypes import (
+            MTYPE_LIST_PANEL,
+            check_is_error_msg,
+            check_is_scitype,
+        )
+        from sktime.datatypes._dtypekind import DtypeKind
+
         # Check X is valid input type and recover the data characteristics
         X_valid, msg, X_metadata = check_is_scitype(
             X, scitype="Panel", return_metadata=return_metadata
diff --git a/sktime/datatypes/_adapter/dask_to_pd.py b/sktime/datatypes/_adapter/dask_to_pd.py
index e6af4e9a6..98a903d58 100644
--- a/sktime/datatypes/_adapter/dask_to_pd.py
+++ b/sktime/datatypes/_adapter/dask_to_pd.py
@@ -16,8 +16,8 @@ index is replaced by a string index where tuples are replaced with str coerced e
 
 import pandas as pd
 
-from sktime.datatypes._common import _req
-from sktime.datatypes._common import _ret as ret
+from sktime.datatypes._base._common import _req
+from sktime.datatypes._base._common import _ret as ret
 from sktime.datatypes._dtypekind import _get_feature_kind, _pandas_dtype_to_kind
 
 
@@ -132,11 +132,11 @@ def check_dask_frame(
     obj, return_metadata=False, var_name="obj", freq_set_check=False, scitype="Series"
 ):
     """Check dask frame, generic for sktime check format."""
-    import dask
+    import dask.dataframe as dd
 
     metadata = {}
 
-    if not isinstance(obj, dask.dataframe.core.DataFrame):
+    if not isinstance(obj, dd.DataFrame):
         msg = f"{var_name} must be a dask DataFrame, found {type(obj)}"
         return ret(False, msg, None, return_metadata)
 
diff --git a/sktime/datatypes/_adapter/polars.py b/sktime/datatypes/_adapter/polars.py
index e8138e4fa..e70f60610 100644
--- a/sktime/datatypes/_adapter/polars.py
+++ b/sktime/datatypes/_adapter/polars.py
@@ -1,8 +1,8 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """Common utilities for polars based data containers."""
 
-from sktime.datatypes._common import _req
-from sktime.datatypes._common import _ret as ret
+from sktime.datatypes._base._common import _req
+from sktime.datatypes._base._common import _ret as ret
 from sktime.datatypes._dtypekind import _get_feature_kind, _polars_dtype_to_kind
 
 
diff --git a/sktime/datatypes/_alignment/_check.py b/sktime/datatypes/_alignment/_check.py
index 7ecd8681b..caa710b3a 100644
--- a/sktime/datatypes/_alignment/_check.py
+++ b/sktime/datatypes/_alignment/_check.py
@@ -37,7 +37,7 @@ __all__ = ["check_dict"]
 import numpy as np
 import pandas as pd
 
-from sktime.datatypes._common import _ret
+from sktime.datatypes._base._common import _ret
 
 check_dict = dict()
 
diff --git a/sktime/datatypes/_base/_base.py b/sktime/datatypes/_base/_base.py
index d7103f239..96e58b4a3 100644
--- a/sktime/datatypes/_base/_base.py
+++ b/sktime/datatypes/_base/_base.py
@@ -4,7 +4,7 @@
 __author__ = ["fkiraly"]
 
 from sktime.base import BaseObject
-from sktime.datatypes._common import _ret
+from sktime.datatypes._base._common import _ret
 from sktime.utils.deep_equals import deep_equals
 
 
diff --git a/sktime/datatypes/_common.py b/sktime/datatypes/_base/_common.py
similarity index 100%
rename from sktime/datatypes/_common.py
rename to sktime/datatypes/_base/_common.py
diff --git a/sktime/datatypes/_check.py b/sktime/datatypes/_check.py
index cd81ceb57..f7b0032f5 100644
--- a/sktime/datatypes/_check.py
+++ b/sktime/datatypes/_check.py
@@ -23,31 +23,73 @@ __all__ = [
     "mtype",
 ]
 
-from typing import Union
+from functools import lru_cache
 
 import numpy as np
 
-from sktime.datatypes._alignment import check_dict_Alignment
-from sktime.datatypes._common import _metadata_requested, _ret
-from sktime.datatypes._hierarchical import check_dict_Hierarchical
-from sktime.datatypes._panel import check_dict_Panel
-from sktime.datatypes._proba import check_dict_Proba
+from sktime.datatypes._base import BaseDatatype
+from sktime.datatypes._base._common import _metadata_requested, _ret
 from sktime.datatypes._registry import AMBIGUOUS_MTYPES, SCITYPE_LIST, mtype_to_scitype
-from sktime.datatypes._series import check_dict_Series
-from sktime.datatypes._table import check_dict_Table
 
-# pool convert_dict-s
-check_dict = dict()
-check_dict.update(check_dict_Series)
-check_dict.update(check_dict_Panel)
-check_dict.update(check_dict_Hierarchical)
-check_dict.update(check_dict_Alignment)
-check_dict.update(check_dict_Table)
-check_dict.update(check_dict_Proba)
+
+def get_check_dict(soft_deps="present"):
+    """Retrieve check_dict, caches the first time it is requested.
+
+    This is to avoid repeated, time consuming crawling in generate_check_dict,
+    which would otherwise be called every time check_dict is requested.
+
+    Parameters
+    ----------
+    soft_deps : str, optional - one of "present", "all"
+        "present" - only checks with soft dependencies present are included
+        "all" - all checks are included
+    """
+    if soft_deps not in ["present", "all"]:
+        raise ValueError(
+            "Error in get_check_dict, soft_deps argument must be 'present' or 'all', "
+            f"found {soft_deps}"
+        )
+    check_dict = generate_check_dict(soft_deps=soft_deps)
+    return check_dict.copy()
+
+
+@lru_cache(maxsize=1)
+def generate_check_dict(soft_deps="present"):
+    """Generate check_dict using lookup."""
+    from skbase.utils.dependencies import _check_estimator_deps
+
+    from sktime.utils.retrieval import _all_classes
+
+    classes = _all_classes("sktime.datatypes")
+    classes = [x[1] for x in classes]
+    classes = [x for x in classes if issubclass(x, BaseDatatype)]
+    classes = [x for x in classes if not x.__name__.startswith("Base")]
+    classes = [x for x in classes if not x.__name__.startswith("Scitype")]
+
+    # subset only to data types with soft dependencies present
+    if soft_deps == "present":
+        classes = [x for x in classes if _check_estimator_deps(x, severity="none")]
+
+    check_dict = dict()
+    for cls in classes:
+        k = cls()
+        key = k._get_key()
+        check_dict[key] = k
+
+    # temporary while refactoring
+    from sktime.datatypes._alignment import check_dict_Alignment
+    from sktime.datatypes._proba import check_dict_Proba
+
+    # pool convert_dict-s
+    check_dict.update(check_dict_Alignment)
+    check_dict.update(check_dict_Proba)
+
+    return check_dict
 
 
 def _check_scitype_valid(scitype: str = None):
     """Check validity of scitype."""
+    check_dict = get_check_dict()
     valid_scitypes = list({x[1] for x in check_dict.keys()})
 
     if not isinstance(scitype, str):
@@ -88,7 +130,7 @@ def _coerce_list_of_str(obj, var_name="obj"):
 
 def check_is_mtype(
     obj,
-    mtype: Union[str, list[str]],
+    mtype,
     scitype: str = None,
     return_metadata=False,
     var_name="obj",
@@ -166,6 +208,7 @@ def check_is_mtype(
     """
     mtype = _coerce_list_of_str(mtype, var_name="mtype")
 
+    check_dict = get_check_dict()
     valid_keys = check_dict.keys()
 
     # we loop through individual mtypes in mtype and see whether they pass the check
@@ -280,7 +323,7 @@ def check_raise(obj, mtype: str, scitype: str = None, var_name: str = "input"):
 
 def mtype(
     obj,
-    as_scitype: Union[str, list[str]] = None,
+    as_scitype=None,
     exclude_mtypes=AMBIGUOUS_MTYPES,
 ):
     """Infer the mtype of an object considered as a specific scitype.
@@ -315,6 +358,7 @@ def mtype(
         for scitype in as_scitype:
             _check_scitype_valid(scitype)
 
+    check_dict = get_check_dict()
     m_plus_scitypes = [
         (x[0], x[1]) for x in check_dict.keys() if x[0] not in exclude_mtypes
     ]
@@ -362,7 +406,7 @@ def mtype(
 
 def check_is_scitype(
     obj,
-    scitype: Union[str, list[str]],
+    scitype,
     return_metadata=False,
     var_name="obj",
     exclude_mtypes=AMBIGUOUS_MTYPES,
@@ -425,6 +469,7 @@ def check_is_scitype(
     for x in scitype:
         _check_scitype_valid(x)
 
+    check_dict = get_check_dict()
     valid_keys = check_dict.keys()
 
     # find all the mtype keys corresponding to the scitypes
diff --git a/sktime/datatypes/_hierarchical/__init__.py b/sktime/datatypes/_hierarchical/__init__.py
index 6dfd801e1..d262e59f0 100644
--- a/sktime/datatypes/_hierarchical/__init__.py
+++ b/sktime/datatypes/_hierarchical/__init__.py
@@ -1,6 +1,5 @@
 """Module exports: Hierarchical type checkers, converters and mtype inference."""
 
-from sktime.datatypes._hierarchical._check import check_dict as check_dict_Hierarchical
 from sktime.datatypes._hierarchical._convert import (
     convert_dict as convert_dict_Hierarchical,
 )
@@ -10,7 +9,6 @@ from sktime.datatypes._hierarchical._registry import (
 )
 
 __all__ = [
-    "check_dict_Hierarchical",
     "convert_dict_Hierarchical",
     "MTYPE_LIST_HIERARCHICAL",
     "MTYPE_REGISTER_HIERARCHICAL",
diff --git a/sktime/datatypes/_hierarchical/_base.py b/sktime/datatypes/_hierarchical/_base.py
new file mode 100644
index 000000000..d13c3d4dd
--- /dev/null
+++ b/sktime/datatypes/_hierarchical/_base.py
@@ -0,0 +1,85 @@
+# copyright: skpro developers, BSD-3-Clause License (see LICENSE file)
+"""Base class for data types."""
+
+__author__ = ["fkiraly"]
+
+from sktime.datatypes._base import BaseDatatype
+
+
+class ScitypeHierarchical(BaseDatatype):
+    """Hierarchical data type. Represents a hierarchical collection of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the hierarchical collection.
+    is_one_panel: bool
+        True iff there is only one flat panel in the hierarchical collection,
+        i.e., the collection has a flat hierarchy, plus additional hierarchy levels
+        that have only a single value.
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the hierarchical collection
+    n_panels: int
+        number of flat panels in the hierarchical collection
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Hierarchical",
+        "name": None,  # any string
+        "name_python": None,  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": None,
+    }
+
+    def __init__(
+        self,
+        is_univariate=None,
+        is_equally_spaced=None,
+        is_equal_length=None,
+        is_empty=None,
+        is_one_series=None,
+        is_one_panel=None,
+        has_nans=None,
+        n_instances=None,
+        n_panels=None,
+        n_features=None,
+        feature_names=None,
+        dtypekind_dfip=None,
+        feature_kind=None,
+    ):
+        self.is_univariate = is_univariate
+        self.is_equally_spaced = is_equally_spaced
+        self.is_equal_length = is_equal_length
+        self.is_empty = is_empty
+        self.is_one_series = is_one_series
+        self.is_one_panel = is_one_panel
+        self.has_nans = has_nans
+        self.n_instances = n_instances
+        self.n_panels = n_panels
+        self.n_features = n_features
+        self.feature_names = feature_names
+        self.dtypekind_dfip = dtypekind_dfip
+        self.feature_kind = feature_kind
+
+        super().__init__()
diff --git a/sktime/datatypes/_hierarchical/_check.py b/sktime/datatypes/_hierarchical/_check.py
index d6321676a..32f9e7ea0 100644
--- a/sktime/datatypes/_hierarchical/_check.py
+++ b/sktime/datatypes/_hierarchical/_check.py
@@ -40,14 +40,9 @@ metadata: dict - metadata about obj if valid, otherwise None
         "feature_names": list of int or object, names of variables in series
 """
 
-__author__ = ["fkiraly"]
-
-__all__ = ["check_dict"]
-
 import numpy as np
 
-from sktime.datatypes._panel._check import check_pdmultiindex_panel
-from sktime.utils.dependencies import _check_soft_dependencies
+from sktime.datatypes._hierarchical._base import ScitypeHierarchical
 
 
 def _list_all_equal(obj):
@@ -67,24 +62,157 @@ def _list_all_equal(obj):
     return np.all([s == obj[0] for s in obj])
 
 
-check_dict = dict()
+class HierarchicalPdMultiIndex(ScitypeHierarchical):
+    """Data type: pandas.DataFrame based specification of hierarchical series.
 
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the hierarchical collection.
+    is_one_panel: bool
+        True iff there is only one flat panel in the hierarchical collection,
+        i.e., the collection has a flat hierarchy, plus additional hierarchy levels
+        that have only a single value.
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the hierarchical collection
+    n_panels: int
+        number of flat panels in the hierarchical collection
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Hierarchical",
+        "name": "pd_multiindex_hier",  # any string
+        "name_python": "hier_pd_df",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
 
-def check_pdmultiindex_hierarchical(obj, return_metadata=False, var_name="obj"):
-    ret = check_pdmultiindex_panel(
-        obj, return_metadata=return_metadata, var_name=var_name, panel=False
-    )
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
 
-    return ret
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
 
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._panel._check import _check_pdmultiindex_panel
 
-check_dict[("pd_multiindex_hier", "Hierarchical")] = check_pdmultiindex_hierarchical
+        ret = _check_pdmultiindex_panel(
+            obj, return_metadata=return_metadata, var_name=var_name, panel=False
+        )
 
+        return ret
+
+
+class HierarchicalDask(ScitypeHierarchical):
+    """Data type: dask frame based specification of hierarchical series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the hierarchical collection.
+    is_one_panel: bool
+        True iff there is only one flat panel in the hierarchical collection,
+        i.e., the collection has a flat hierarchy, plus additional hierarchy levels
+        that have only a single value.
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the hierarchical collection
+    n_panels: int
+        number of flat panels in the hierarchical collection
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-if _check_soft_dependencies("dask", severity="none"):
-    from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
+    _tags = {
+        "scitype": "Hierarchical",
+        "name": "dask_hierarchical",  # any string
+        "name_python": "hier_dask",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "dask",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
 
-    def check_dask_hierarchical(obj, return_metadata=False, var_name="obj"):
         return check_dask_frame(
             obj=obj,
             return_metadata=return_metadata,
@@ -92,17 +220,82 @@ if _check_soft_dependencies("dask", severity="none"):
             scitype="Hierarchical",
         )
 
-    check_dict[("dask_hierarchical", "Hierarchical")] = check_dask_hierarchical
 
-if _check_soft_dependencies("polars", severity="none"):
-    from sktime.datatypes._panel._check import check_polars_panel
+class HierarchicalPolarsEager(ScitypeHierarchical):
+    """Data type: polars DataFrame frame based specification of hierarchical series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the hierarchical collection.
+    is_one_panel: bool
+        True iff there is only one flat panel in the hierarchical collection,
+        i.e., the collection has a flat hierarchy, plus additional hierarchy levels
+        that have only a single value.
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the hierarchical collection
+    n_panels: int
+        number of flat panels in the hierarchical collection
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Hierarchical",
+        "name": "polars_hierarchical",  # any string
+        "name_python": "hier_polars_eager",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "polars",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
 
-    def check_polars_hierarchical(obj, return_metadata=False, var_name="obj"):
-        return check_polars_panel(
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._panel._check import _check_polars_panel
+
+        return _check_polars_panel(
             obj=obj,
             return_metadata=return_metadata,
             var_name=var_name,
             scitype="Hierarchical",
         )
-
-    check_dict[("polars_hierarchical", "Hierarchical")] = check_polars_hierarchical
diff --git a/sktime/datatypes/_panel/__init__.py b/sktime/datatypes/_panel/__init__.py
index c9fe90eea..6fc3dfe94 100644
--- a/sktime/datatypes/_panel/__init__.py
+++ b/sktime/datatypes/_panel/__init__.py
@@ -1,11 +1,9 @@
 """Module exports: Panel type checkers, converters and mtype inference."""
 
-from sktime.datatypes._panel._check import check_dict as check_dict_Panel
 from sktime.datatypes._panel._convert import convert_dict as convert_dict_Panel
 from sktime.datatypes._panel._registry import MTYPE_LIST_PANEL, MTYPE_REGISTER_PANEL
 
 __all__ = [
-    "check_dict_Panel",
     "convert_dict_Panel",
     "MTYPE_LIST_PANEL",
     "MTYPE_REGISTER_PANEL",
diff --git a/sktime/datatypes/_panel/_base.py b/sktime/datatypes/_panel/_base.py
new file mode 100644
index 000000000..58284aa90
--- /dev/null
+++ b/sktime/datatypes/_panel/_base.py
@@ -0,0 +1,75 @@
+# copyright: skpro developers, BSD-3-Clause License (see LICENSE file)
+"""Base class for data types."""
+
+__author__ = ["fkiraly"]
+
+from sktime.datatypes._base import BaseDatatype
+
+
+class ScitypePanel(BaseDatatype):
+    """Panel data type. Represents a panel (flat collection) of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": None,  # any string
+        "name_python": None,  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": None,
+    }
+
+    def __init__(
+        self,
+        is_univariate=None,
+        is_equally_spaced=None,
+        is_equal_length=None,
+        is_empty=None,
+        is_one_series=None,
+        has_nans=None,
+        n_instances=None,
+        n_features=None,
+        feature_names=None,
+        dtypekind_dfip=None,
+        feature_kind=None,
+    ):
+        self.is_univariate = is_univariate
+        self.is_equally_spaced = is_equally_spaced
+        self.is_equal_length = is_equal_length
+        self.is_empty = is_empty
+        self.is_one_series = is_one_series
+        self.has_nans = has_nans
+        self.n_instances = n_instances
+        self.n_features = n_features
+        self.feature_names = feature_names
+        self.dtypekind_dfip = dtypekind_dfip
+        self.feature_kind = feature_kind
+
+        super().__init__()
diff --git a/sktime/datatypes/_panel/_check.py b/sktime/datatypes/_panel/_check.py
index 2aa37f0e9..b91912aa1 100644
--- a/sktime/datatypes/_panel/_check.py
+++ b/sktime/datatypes/_panel/_check.py
@@ -38,25 +38,21 @@ metadata: dict - metadata about obj if valid, otherwise None
         "feature_names": list of int or object, names of variables in series
 """
 
-__author__ = ["fkiraly", "TonyBagnall"]
-
-__all__ = ["check_dict"]
-
 import numpy as np
 import pandas as pd
 from pandas.core.dtypes.cast import is_nested_object
 
-from sktime.datatypes._common import _req, _ret
+from sktime.datatypes._base._common import _req, _ret
 from sktime.datatypes._dtypekind import (
     _get_feature_kind,
     _get_panel_dtypekind,
     _pandas_dtype_to_kind,
 )
+from sktime.datatypes._panel._base import ScitypePanel
 from sktime.datatypes._series._check import (
+    _check_pddataframe_series,
     _index_equally_spaced,
-    check_pddataframe_series,
 )
-from sktime.utils.dependencies import _check_soft_dependencies
 from sktime.utils.validation.series import is_in_valid_index_types, is_integer_index
 
 VALID_MULTIINDEX_TYPES = (pd.RangeIndex, pd.Index)
@@ -85,10 +81,77 @@ def _list_all_equal(obj):
     return np.all([s == obj[0] for s in obj])
 
 
-check_dict = dict()
+class PanelDfList(ScitypePanel):
+    """Data type: list-of-pandas.DataFrame based specification of panel of time series.
 
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-def check_dflist_panel(obj, return_metadata=False, var_name="obj"):
+    _tags = {
+        "scitype": "Panel",
+        "name": "df-list",  # any string
+        "name_python": "panel_df_list",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_dflist_panel(
+            obj, return_metadata=return_metadata, var_name=var_name
+        )
+
+
+def _check_dflist_panel(obj, return_metadata=False, var_name="obj"):
+    """Check if obj is a list of pandas.DataFrame according to df-list specification."""
     if not isinstance(obj, list):
         msg = f"{var_name} must be list of pd.DataFrame, found {type(obj)}"
         return _ret(False, msg, None, return_metadata)
@@ -101,7 +164,7 @@ def check_dflist_panel(obj, return_metadata=False, var_name="obj"):
         msg = f"{var_name}[i] must pd.DataFrame, but found other types at i={bad_inds}"
         return _ret(False, msg, None, return_metadata)
 
-    check_res = [check_pddataframe_series(s, return_metadata=True) for s in obj]
+    check_res = [_check_pddataframe_series(s, return_metadata=True) for s in obj]
     bad_inds = [i for i in range(n) if not check_res[i][0]]
 
     if len(bad_inds) > 0:
@@ -144,10 +207,77 @@ def check_dflist_panel(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("df-list", "Panel")] = check_dflist_panel
+class PanelNp3D(ScitypePanel):
+    """Data type: 3D np.ndarray based specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "numpy3D",  # any string
+        "name_python": "panel_np_3d",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": False,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_numpy3d_panel(
+            obj, return_metadata=return_metadata, var_name=var_name
+        )
 
 
-def check_numpy3d_panel(obj, return_metadata=False, var_name="obj"):
+def _check_numpy3d_panel(obj, return_metadata=False, var_name="obj"):
+    """Check if obj is a numpy.ndarray according to numpy3D specification."""
     if not isinstance(obj, np.ndarray):
         msg = f"{var_name} must be a numpy.ndarray, found {type(obj)}"
         return _ret(False, msg, None, return_metadata)
@@ -193,10 +323,77 @@ def check_numpy3d_panel(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("numpy3D", "Panel")] = check_numpy3d_panel
+class PanelPdMultiIndex(ScitypePanel):
+    """Data type: MultiIndex-ed pd.DataFrame specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "pd-multiindex",  # any string
+        "name_python": "panel_pd_df",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_pdmultiindex_panel(
+            obj, return_metadata=return_metadata, var_name=var_name
+        )
 
 
-def check_pdmultiindex_panel(obj, return_metadata=False, var_name="obj", panel=True):
+def _check_pdmultiindex_panel(obj, return_metadata=False, var_name="obj", panel=True):
+    """Check if obj is a pandas.DataFrame according to pd-multiindex specification."""
     if not isinstance(obj, pd.DataFrame):
         msg = f"{var_name} must be a pd.DataFrame, found {type(obj)}"
         return _ret(False, msg, None, return_metadata)
@@ -329,9 +526,6 @@ def check_pdmultiindex_panel(obj, return_metadata=False, var_name="obj", panel=T
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("pd-multiindex", "Panel")] = check_pdmultiindex_panel
-
-
 def are_columns_nested(X):
     """Check whether any cells have nested structure in each DataFrame column.
 
@@ -400,7 +594,76 @@ def _nested_dataframe_has_nans(X: pd.DataFrame) -> bool:
     return False
 
 
-def is_nested_dataframe(obj, return_metadata=False, var_name="obj"):
+class PanelNestedDf(ScitypePanel):
+    """Data type: nested pandas.DataFrame based specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "nested_univ",  # any string
+        "name_python": "panel_pd_nested",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _is_nested_dataframe(
+            obj, return_metadata=return_metadata, var_name=var_name
+        )
+
+
+def _is_nested_dataframe(obj, return_metadata=False, var_name="obj"):
     """Check whether the input is a nested DataFrame.
 
     To allow for a mixture of nested and primitive columns types the
@@ -479,10 +742,77 @@ def is_nested_dataframe(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("nested_univ", "Panel")] = is_nested_dataframe
+class PanelNumpyFlat(ScitypePanel):
+    """Data type: flat 2D np.ndarray based specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "numpyflat",  # any string
+        "name_python": "panel_np_flat",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": False,
+        "capability:unequally_spaced": False,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_numpyflat_Panel(
+            obj, return_metadata=return_metadata, var_name=var_name
+        )
 
 
-def check_numpyflat_Panel(obj, return_metadata=False, var_name="obj"):
+def _check_numpyflat_Panel(obj, return_metadata=False, var_name="obj"):
+    """Check if obj is a numpy.ndarray according to numpyflat specification."""
     if not isinstance(obj, np.ndarray):
         msg = f"{var_name} must be a numpy.ndarray, found {type(obj)}"
         return _ret(False, msg, None, return_metadata)
@@ -525,12 +855,72 @@ def check_numpyflat_Panel(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("numpyflat", "Panel")] = check_numpyflat_Panel
+class PanelDask(ScitypePanel):
+    """Data type: dask data frame based specification of panel of time series.
 
-if _check_soft_dependencies("dask", severity="none"):
-    from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "dask_panel",  # any string
+        "name_python": "panel_dask",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "dask",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
 
-    def check_dask_panel(obj, return_metadata=False, var_name="obj"):
         return check_dask_frame(
             obj=obj,
             return_metadata=return_metadata,
@@ -538,87 +928,214 @@ if _check_soft_dependencies("dask", severity="none"):
             scitype="Panel",
         )
 
-    check_dict[("dask_panel", "Panel")] = check_dask_panel
 
-if _check_soft_dependencies("polars", severity="none"):
-    import polars as pl
+class PanelPolarsEager(ScitypePanel):
+    """Data type: polars.DataFrame based specification of panel of time series.
 
-    from sktime.datatypes._adapter.polars import check_polars_frame, get_mi_cols
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-    def check_polars_panel(obj, return_metadata=False, var_name="obj", scitype="Panel"):
-        metadict = check_polars_frame(
-            obj=obj,
-            return_metadata=return_metadata,
-            var_name=var_name,
-            scitype=scitype,
+    _tags = {
+        "scitype": "Panel",
+        "name": "polars_panel",  # any string
+        "name_python": "panel_polars",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "polars",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_polars_panel(
+            obj=obj, return_metadata=return_metadata, var_name=var_name, scitype="Panel"
         )
 
-        if isinstance(metadict, tuple) and metadict[0]:
-            requires_series_grps = [
-                "n_instances",
-                "is_one_series",
-                "is_equal_length",
-                "is_equally_spaced",
-            ]
 
-            if _req(requires_series_grps, return_metadata):
-                if isinstance(obj, pl.LazyFrame):
-                    for key in requires_series_grps:
-                        metadict[1][key] = "NA"
-                else:
-                    mi_cols = get_mi_cols(obj)
-                    levels = mi_cols[:-1]
-                    if len(mi_cols) == 1:
-                        levels = levels[0]
-                    series_groups = obj.group_by(levels).agg(
-                        [
-                            pl.col(mi_cols[-1]).alias(
-                                "level_values"
-                            ),  # index values in each level
-                            pl.len().alias("size"),  # Calculate the size of each group
-                        ]
+def _check_polars_panel(obj, return_metadata=False, var_name="obj", scitype="Panel"):
+    """Check if obj is a polars.DataFrame according to polars specification."""
+    import polars as pl
+
+    from sktime.datatypes._adapter.polars import check_polars_frame, get_mi_cols
+
+    metadict = check_polars_frame(
+        obj=obj,
+        return_metadata=return_metadata,
+        var_name=var_name,
+        scitype=scitype,
+    )
+
+    if isinstance(metadict, tuple) and metadict[0]:
+        requires_series_grps = [
+            "n_instances",
+            "is_one_series",
+            "is_equal_length",
+            "is_equally_spaced",
+        ]
+
+        if _req(requires_series_grps, return_metadata):
+            if isinstance(obj, pl.LazyFrame):
+                for key in requires_series_grps:
+                    metadict[1][key] = "NA"
+            else:
+                mi_cols = get_mi_cols(obj)
+                levels = mi_cols[:-1]
+                if len(mi_cols) == 1:
+                    levels = levels[0]
+                series_groups = obj.group_by(levels).agg(
+                    [
+                        pl.col(mi_cols[-1]).alias(
+                            "level_values"
+                        ),  # index values in each level
+                        pl.len().alias("size"),  # Calculate the size of each group
+                    ]
+                )
+                n_series = series_groups.shape[0]
+
+                if _req("n_instances", return_metadata):
+                    metadict[2]["n_instances"] = n_series
+                if _req("is_one_series", return_metadata):
+                    metadict[2]["is_one_series"] = n_series == 1
+                if _req("is_equal_length", return_metadata):
+                    metadict[2]["is_equal_length"] = _list_all_equal(
+                        series_groups["size"].to_numpy()
                     )
-                    n_series = series_groups.shape[0]
-
-                    if _req("n_instances", return_metadata):
-                        metadict[2]["n_instances"] = n_series
-                    if _req("is_one_series", return_metadata):
-                        metadict[2]["is_one_series"] = n_series == 1
-                    if _req("is_equal_length", return_metadata):
-                        metadict[2]["is_equal_length"] = _list_all_equal(
-                            series_groups["size"].to_numpy()
-                        )
-                    if _req("is_equally_spaced", return_metadata):
-                        metadict[2]["is_equally_spaced"] = "NA"
-
-            requires_panel_grps = ["n_panels", "is_one_panel"]
-            if _req(requires_panel_grps, return_metadata):
-                if isinstance(obj, pl.LazyFrame):
-                    for key in requires_panel_grps:
-                        metadict[1][key] = "NA"
+                if _req("is_equally_spaced", return_metadata):
+                    metadict[2]["is_equally_spaced"] = "NA"
+
+        requires_panel_grps = ["n_panels", "is_one_panel"]
+        if _req(requires_panel_grps, return_metadata):
+            if isinstance(obj, pl.LazyFrame):
+                for key in requires_panel_grps:
+                    metadict[1][key] = "NA"
+            else:
+                if scitype == "Panel":
+                    n_panels = 1
                 else:
-                    if scitype == "Panel":
-                        n_panels = 1
-                    else:
-                        mi_cols = get_mi_cols(obj)
-                        panel_groups = obj.group_by(mi_cols[:-2]).agg(
-                            [pl.col(mi_cols[-2])]
-                        )
-                        n_panels = panel_groups.shape[0]
+                    mi_cols = get_mi_cols(obj)
+                    panel_groups = obj.group_by(mi_cols[:-2]).agg([pl.col(mi_cols[-2])])
+                    n_panels = panel_groups.shape[0]
+
+                if _req("n_panels", return_metadata):
+                    metadict[2]["n_panels"] = n_panels
+                if _req("is_one_panel", return_metadata):
+                    metadict[2]["is_one_panel"] = n_panels == 1
 
-                    if _req("n_panels", return_metadata):
-                        metadict[2]["n_panels"] = n_panels
-                    if _req("is_one_panel", return_metadata):
-                        metadict[2]["is_one_panel"] = n_panels == 1
+    return metadict
 
-        return metadict
 
-    check_dict[("polars_panel", "Panel")] = check_polars_panel
+class PanelGluontsList(ScitypePanel):
+    """Data type: polars.DataFrame based specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-if _check_soft_dependencies("gluonts", severity="none"):
-    from sktime.datatypes._dtypekind import DtypeKind
+    _tags = {
+        "scitype": "Panel",
+        "name": "gluonts_ListDataset_panel",  # any string
+        "name_python": "panel_gluonts_list",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "gluonts",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._dtypekind import DtypeKind
 
-    def check_gluonTS_listDataset_panel(obj, return_metadata=False, var_name="obj"):
         metadata = dict()
 
         if (
@@ -702,9 +1219,71 @@ if _check_soft_dependencies("gluonts", severity="none"):
 
         return _ret(True, None, metadata, return_metadata)
 
-    check_dict[("gluonts_ListDataset_panel", "Panel")] = check_gluonTS_listDataset_panel
 
-    def check_gluonTS_pandasDataset_panel(obj, return_metadata=False, var_name="obj"):
+class PanelGluontsPandas(ScitypePanel):
+    """Data type: polars.DataFrame based specification of panel of time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_equal_length: bool
+        True iff all series in panel are of equal length
+    is_empty: bool
+        True iff table has no variables or no instances
+    is_one_series: bool
+        True iff there is only one series in the panel of time series
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances in the panel of time series
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Panel",
+        "name": "gluonts_PandasDataset_panel",  # any string
+        "name_python": "panel_gluonts_pandas",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "gluonts",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
         # Importing required libraries
         from gluonts.dataset.pandas import PandasDataset
 
@@ -767,7 +1346,3 @@ if _check_soft_dependencies("gluonts", severity="none"):
             metadata["has_nans"] = False
 
         return _ret(True, None, metadata, return_metadata)
-
-    check_dict[("gluonts_PandasDataset_panel", "Panel")] = (
-        check_gluonTS_pandasDataset_panel
-    )
diff --git a/sktime/datatypes/_proba/_check.py b/sktime/datatypes/_proba/_check.py
index b4aee3639..2adffc43a 100644
--- a/sktime/datatypes/_proba/_check.py
+++ b/sktime/datatypes/_proba/_check.py
@@ -40,8 +40,8 @@ import numpy as np
 import pandas as pd
 from pandas.api.types import is_numeric_dtype
 
-from sktime.datatypes._common import _req
-from sktime.datatypes._common import _ret as ret
+from sktime.datatypes._base._common import _req
+from sktime.datatypes._base._common import _ret as ret
 
 check_dict = dict()
 
diff --git a/sktime/datatypes/_series/__init__.py b/sktime/datatypes/_series/__init__.py
index c1c6d5901..5f6e59d94 100644
--- a/sktime/datatypes/_series/__init__.py
+++ b/sktime/datatypes/_series/__init__.py
@@ -1,11 +1,9 @@
 """Module exports: Series type checkers, converters and mtype inference."""
 
-from sktime.datatypes._series._check import check_dict as check_dict_Series
 from sktime.datatypes._series._convert import convert_dict as convert_dict_Series
 from sktime.datatypes._series._registry import MTYPE_LIST_SERIES, MTYPE_REGISTER_SERIES
 
 __all__ = [
-    "check_dict_Series",
     "convert_dict_Series",
     "MTYPE_LIST_SERIES",
     "MTYPE_REGISTER_SERIES",
diff --git a/sktime/datatypes/_series/_base.py b/sktime/datatypes/_series/_base.py
new file mode 100644
index 000000000..dd5aca899
--- /dev/null
+++ b/sktime/datatypes/_series/_base.py
@@ -0,0 +1,63 @@
+# copyright: skpro developers, BSD-3-Clause License (see LICENSE file)
+"""Base class for data types."""
+
+__author__ = ["fkiraly"]
+
+from sktime.datatypes._base import BaseDatatype
+
+
+class ScitypeSeries(BaseDatatype):
+    """Series data type. Represents a single time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_equally_spaced : bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": None,  # any string
+        "name_python": None,  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": None,
+    }
+
+    def __init__(
+        self,
+        is_univariate=None,
+        is_equally_spaced=None,
+        is_empty=None,
+        has_nans=None,
+        n_features=None,
+        feature_names=None,
+        dtypekind_dfip=None,
+        feature_kind=None,
+    ):
+        self.is_univariate = is_univariate
+        self.is_equally_spaced = is_equally_spaced
+        self.is_empty = is_empty
+        self.has_nans = has_nans
+        self.n_features = n_features
+        self.feature_names = feature_names
+        self.dtypekind_dfip = dtypekind_dfip
+        self.feature_kind = feature_kind
+
+        super().__init__()
diff --git a/sktime/datatypes/_series/_check.py b/sktime/datatypes/_series/_check.py
index c472fd923..2bc13c312 100644
--- a/sktime/datatypes/_series/_check.py
+++ b/sktime/datatypes/_series/_check.py
@@ -35,21 +35,17 @@ metadata: dict - metadata about obj if valid, otherwise None
         "feature_names": list of int or object, names of variables in series
 """
 
-__author__ = ["fkiraly"]
-
-__all__ = ["check_dict"]
-
 import numpy as np
 import pandas as pd
 
-from sktime.datatypes._common import _req
-from sktime.datatypes._common import _ret as ret
+from sktime.datatypes._base._common import _req
+from sktime.datatypes._base._common import _ret as ret
 from sktime.datatypes._dtypekind import (
     _get_feature_kind,
     _get_series_dtypekind,
     _pandas_dtype_to_kind,
 )
-from sktime.utils.dependencies import _check_soft_dependencies
+from sktime.datatypes._series._base import ScitypeSeries
 from sktime.utils.validation.series import is_in_valid_index_types
 
 VALID_INDEX_TYPES = (pd.RangeIndex, pd.PeriodIndex, pd.DatetimeIndex)
@@ -58,10 +54,69 @@ VALID_INDEX_TYPES = (pd.RangeIndex, pd.PeriodIndex, pd.DatetimeIndex)
 FREQ_SET_CHECK = False
 
 
-check_dict = dict()
+class SeriesPdDataFrame(ScitypeSeries):
+    """Data type: pandas.DataFrame based specification of single time series.
 
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-def check_pddataframe_series(obj, return_metadata=False, var_name="obj"):
+    _tags = {
+        "scitype": "Series",
+        "name": "pd.DataFrame",  # any string
+        "name_python": "series_pd_df",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_pddataframe_series(obj, return_metadata, var_name)
+
+
+def _check_pddataframe_series(obj, return_metadata=False, var_name="obj"):
+    """Check if obj is a pandas.DataFrame based specification of single time series."""
     metadata = dict()
 
     if not isinstance(obj, pd.DataFrame):
@@ -128,122 +183,230 @@ def check_pddataframe_series(obj, return_metadata=False, var_name="obj"):
     return ret(True, None, metadata, return_metadata)
 
 
-check_dict[("pd.DataFrame", "Series")] = check_pddataframe_series
-
-
-def check_pdseries_series(obj, return_metadata=False, var_name="obj"):
-    metadata = dict()
-
-    if not isinstance(obj, pd.Series):
-        msg = f"{var_name} must be a pandas.Series, found {type(obj)}"
-        return ret(False, msg, None, return_metadata)
-
-    # we now know obj is a pd.Series
-    index = obj.index
-    if _req("is_empty", return_metadata):
-        metadata["is_empty"] = len(index) < 1
-    if _req("is_univariate", return_metadata):
-        metadata["is_univariate"] = True
-    if _req("n_features", return_metadata):
-        metadata["n_features"] = 1
-    if _req("feature_names", return_metadata):
-        if not hasattr(obj, "name") or obj.name is None:
-            metadata["feature_names"] = [0]
-        else:
-            metadata["feature_names"] = [obj.name]
-    if _req("dtypekind_dfip", return_metadata):
-        metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "pd.Series")
-    if _req("feature_kind", return_metadata):
-        dtype_kind = _get_series_dtypekind(obj, "pd.Series")
-        metadata["feature_kind"] = _get_feature_kind(dtype_kind)
+class SeriesPdSeries(ScitypeSeries):
+    """Data type: pandas.Series based specification of single time series.
 
-    # check whether the time index is of valid type
-    if not is_in_valid_index_types(index):
-        msg = (
-            f"{type(index)} is not supported for {var_name}, use "
-            f"one of {VALID_INDEX_TYPES} or integer index instead."
-        )
-        return ret(False, msg, None, return_metadata)
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-    # Check time index is ordered in time
-    if not index.is_monotonic_increasing:
-        msg = (
-            f"The (time) index of {var_name} must be sorted monotonically increasing, "
-            f"but found: {index}"
-        )
-        return ret(False, msg, None, return_metadata)
+    _tags = {
+        "scitype": "Series",
+        "name": "pd.Series",  # any string
+        "name_python": "series_pd_sr",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": False,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        metadata = dict()
 
-    if FREQ_SET_CHECK and isinstance(index, pd.DatetimeIndex):
-        if index.freq is None:
-            msg = f"{var_name} has DatetimeIndex, but no freq attribute set."
+        if not isinstance(obj, pd.Series):
+            msg = f"{var_name} must be a pandas.Series, found {type(obj)}"
             return ret(False, msg, None, return_metadata)
 
-    # check whether index is equally spaced or if there are any nans
-    #   compute only if needed
-    if _req("is_equally_spaced", return_metadata):
-        metadata["is_equally_spaced"] = _index_equally_spaced(index)
-    if _req("has_nans", return_metadata):
-        metadata["has_nans"] = obj.isna().values.any()
-
-    return ret(True, None, metadata, return_metadata)
-
-
-check_dict[("pd.Series", "Series")] = check_pdseries_series
-
-
-def check_numpy_series(obj, return_metadata=False, var_name="obj"):
-    metadata = dict()
-
-    if not isinstance(obj, np.ndarray):
-        msg = f"{var_name} must be a numpy.ndarray, found {type(obj)}"
-        return ret(False, msg, None, return_metadata)
-
-    if len(obj.shape) == 2:
-        # we now know obj is a 2D np.ndarray
+        # we now know obj is a pd.Series
+        index = obj.index
         if _req("is_empty", return_metadata):
-            metadata["is_empty"] = len(obj) < 1 or obj.shape[1] < 1
-        if _req("is_univariate", return_metadata):
-            metadata["is_univariate"] = obj.shape[1] < 2
-        if _req("n_features", return_metadata):
-            metadata["n_features"] = obj.shape[1]
-        if _req("feature_names", return_metadata):
-            metadata["feature_names"] = list(range(obj.shape[1]))
-        if _req("dtypekind_dfip", return_metadata):
-            metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "numpy")
-        if _req("feature_kind", return_metadata):
-            dtype_kind = _get_series_dtypekind(obj, "numpy")
-            metadata["feature_kind"] = _get_feature_kind(dtype_kind)
-    elif len(obj.shape) == 1:
-        # we now know obj is a 1D np.ndarray
-        if _req("is_empty", return_metadata):
-            metadata["is_empty"] = len(obj) < 1
+            metadata["is_empty"] = len(index) < 1
         if _req("is_univariate", return_metadata):
             metadata["is_univariate"] = True
         if _req("n_features", return_metadata):
             metadata["n_features"] = 1
         if _req("feature_names", return_metadata):
-            metadata["feature_names"] = [0]
+            if not hasattr(obj, "name") or obj.name is None:
+                metadata["feature_names"] = [0]
+            else:
+                metadata["feature_names"] = [obj.name]
         if _req("dtypekind_dfip", return_metadata):
-            metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "numpy")
+            metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "pd.Series")
         if _req("feature_kind", return_metadata):
-            dtype_kind = _get_series_dtypekind(obj, "numpy")
+            dtype_kind = _get_series_dtypekind(obj, "pd.Series")
             metadata["feature_kind"] = _get_feature_kind(dtype_kind)
-    else:
-        msg = f"{var_name} must be 1D or 2D numpy.ndarray, but found {len(obj.shape)}D"
-        return ret(False, msg, None, return_metadata)
 
-    # np.arrays are considered equally spaced by assumption
-    if _req("is_equally_spaced", return_metadata):
-        metadata["is_equally_spaced"] = True
+        # check whether the time index is of valid type
+        if not is_in_valid_index_types(index):
+            msg = (
+                f"{type(index)} is not supported for {var_name}, use "
+                f"one of {VALID_INDEX_TYPES} or integer index instead."
+            )
+            return ret(False, msg, None, return_metadata)
 
-    # check whether there any nans; compute only if requested
-    if _req("has_nans", return_metadata):
-        metadata["has_nans"] = pd.isnull(obj).any()
+        # Check time index is ordered in time
+        if not index.is_monotonic_increasing:
+            msg = (
+                f"The (time) index of {var_name} must be sorted monotonically "
+                f"increasing, but found: {index}"
+            )
+            return ret(False, msg, None, return_metadata)
 
-    return ret(True, None, metadata, return_metadata)
+        if FREQ_SET_CHECK and isinstance(index, pd.DatetimeIndex):
+            if index.freq is None:
+                msg = f"{var_name} has DatetimeIndex, but no freq attribute set."
+                return ret(False, msg, None, return_metadata)
+
+        # check whether index is equally spaced or if there are any nans
+        #   compute only if needed
+        if _req("is_equally_spaced", return_metadata):
+            metadata["is_equally_spaced"] = _index_equally_spaced(index)
+        if _req("has_nans", return_metadata):
+            metadata["has_nans"] = obj.isna().values.any()
+
+        return ret(True, None, metadata, return_metadata)
 
 
-check_dict[("np.ndarray", "Series")] = check_numpy_series
+class SeriesNp2D(ScitypeSeries):
+    """Data type: 2D np.ndarray based specification of single time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": "np.ndarray",  # any string
+        "name_python": "series_pd_np",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": False,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        metadata = dict()
+
+        if not isinstance(obj, np.ndarray):
+            msg = f"{var_name} must be a numpy.ndarray, found {type(obj)}"
+            return ret(False, msg, None, return_metadata)
+
+        if len(obj.shape) == 2:
+            # we now know obj is a 2D np.ndarray
+            if _req("is_empty", return_metadata):
+                metadata["is_empty"] = len(obj) < 1 or obj.shape[1] < 1
+            if _req("is_univariate", return_metadata):
+                metadata["is_univariate"] = obj.shape[1] < 2
+            if _req("n_features", return_metadata):
+                metadata["n_features"] = obj.shape[1]
+            if _req("feature_names", return_metadata):
+                metadata["feature_names"] = list(range(obj.shape[1]))
+            if _req("dtypekind_dfip", return_metadata):
+                metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "numpy")
+            if _req("feature_kind", return_metadata):
+                dtype_kind = _get_series_dtypekind(obj, "numpy")
+                metadata["feature_kind"] = _get_feature_kind(dtype_kind)
+        elif len(obj.shape) == 1:
+            # we now know obj is a 1D np.ndarray
+            if _req("is_empty", return_metadata):
+                metadata["is_empty"] = len(obj) < 1
+            if _req("is_univariate", return_metadata):
+                metadata["is_univariate"] = True
+            if _req("n_features", return_metadata):
+                metadata["n_features"] = 1
+            if _req("feature_names", return_metadata):
+                metadata["feature_names"] = [0]
+            if _req("dtypekind_dfip", return_metadata):
+                metadata["dtypekind_dfip"] = _get_series_dtypekind(obj, "numpy")
+            if _req("feature_kind", return_metadata):
+                dtype_kind = _get_series_dtypekind(obj, "numpy")
+                metadata["feature_kind"] = _get_feature_kind(dtype_kind)
+        else:
+            msg = (
+                f"{var_name} must be 1D or 2D numpy.ndarray, "
+                f"but found {len(obj.shape)}D"
+            )
+            return ret(False, msg, None, return_metadata)
+
+        # np.arrays are considered equally spaced by assumption
+        if _req("is_equally_spaced", return_metadata):
+            metadata["is_equally_spaced"] = True
+
+        # check whether there any nans; compute only if requested
+        if _req("has_nans", return_metadata):
+            metadata["has_nans"] = pd.isnull(obj).any()
+
+        return ret(True, None, metadata, return_metadata)
 
 
 def _index_equally_spaced(index):
@@ -292,10 +455,66 @@ def _index_equally_spaced(index):
     return all_equal
 
 
-if _check_soft_dependencies("xarray", severity="none"):
-    import xarray as xr
+class SeriesXarray(ScitypeSeries):
+    """Data type: xarray based specification of single time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": "xr.DataArray",  # any string
+        "name_python": "series_xarray",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "xarray",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        import xarray as xr
 
-    def check_xrdataarray_series(obj, return_metadata=False, var_name="obj"):
         metadata = {}
 
         if not isinstance(obj, xr.DataArray):
@@ -367,13 +586,67 @@ if _check_soft_dependencies("xarray", severity="none"):
 
         return ret(True, None, metadata, return_metadata)
 
-    check_dict[("xr.DataArray", "Series")] = check_xrdataarray_series
 
+class SeriesDask(ScitypeSeries):
+    """Data type: dask.DataFrame based specification of single time series.
 
-if _check_soft_dependencies("dask", severity="none"):
-    from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": "dask_series",  # any string
+        "name_python": "series_dask",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "dask",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.dask_to_pd import check_dask_frame
 
-    def check_dask_series(obj, return_metadata=False, var_name="obj"):
         return check_dask_frame(
             obj=obj,
             return_metadata=return_metadata,
@@ -382,13 +655,67 @@ if _check_soft_dependencies("dask", severity="none"):
             scitype="Series",
         )
 
-    check_dict[("dask_series", "Series")] = check_dask_series
 
+class SeriesPolarsEager(ScitypeSeries):
+    """Data type: polars.DataFrame based specification of single time series.
 
-if _check_soft_dependencies("polars", severity="none"):
-    from sktime.datatypes._adapter.polars import check_polars_frame
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": "pl.DataFrame",  # any string
+        "name_python": "series_polars_eager",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "polars",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.polars import check_polars_frame
 
-    def check_polars_series(obj, return_metadata=False, var_name="obj"):
         metadict = check_polars_frame(
             obj=obj,
             return_metadata=return_metadata,
@@ -403,13 +730,67 @@ if _check_soft_dependencies("polars", severity="none"):
 
         return metadict
 
-    check_dict[("pl.DataFrame", "Series")] = check_polars_series
 
+class SeriesGluontsList(ScitypeSeries):
+    """Data type: gluonts ListDataset based specification of single time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
 
-if _check_soft_dependencies("gluonts", severity="none"):
-    from sktime.datatypes._dtypekind import DtypeKind
+    _tags = {
+        "scitype": "Series",
+        "name": "gluonts_ListDataset_series",  # any string
+        "name_python": "series_gluonts_listdataset",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "gluonts",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._dtypekind import DtypeKind
 
-    def check_gluonTS_listDataset_series(obj, return_metadata=False, var_name="obj"):
         metadata = dict()
 
         if (
@@ -484,7 +865,7 @@ if _check_soft_dependencies("gluonts", severity="none"):
 
         if _req("has_nans", return_metadata):
             for series in obj:
-                metadata["has_nans"] = pd.isnull(series["target"]).any()
+                metadata["has_nans"] = pd.isnull(ScitypeSeries["target"]).any()
 
                 # Break out if at least 1 time series has NaN values
                 if metadata["has_nans"]:
@@ -492,7 +873,65 @@ if _check_soft_dependencies("gluonts", severity="none"):
 
         return ret(True, None, metadata, return_metadata)
 
-    def check_gluonTS_pandasDataset_series(obj, return_metadata=False, var_name="obj"):
+
+class SeriesGluontsPandas(ScitypeSeries):
+    """Data type: gluonts PandasDataset based specification of single time series.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff series has one variable
+    is_equally_spaced: bool
+        True iff series index is equally spaced
+    is_empty: bool
+        True iff series has no variables or no instances
+    has_nans: bool
+        True iff the series contains NaN values
+    n_features: int
+        number of variables in series
+    feature_names: list of int or object
+        names of variables in series
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Series",
+        "name": "gluonts_PandasDataset_series",  # any string
+        "name_python": "series_gluonts_pandasdataset",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "gluonts",
+        "capability:multivariate": True,
+        "capability:unequally_spaced": True,
+        "capability:missing_values": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
         from gluonts.dataset.pandas import PandasDataset
 
         metadata = dict()
@@ -555,11 +994,3 @@ if _check_soft_dependencies("gluonts", severity="none"):
             metadata["feature_kind"] = _get_feature_kind(dtype_kind)
 
         return ret(True, None, metadata, return_metadata)
-
-    check_dict[("gluonts_ListDataset_series", "Series")] = (
-        check_gluonTS_listDataset_series
-    )
-
-    check_dict[("gluonts_PandasDataset_series", "Series")] = (
-        check_gluonTS_pandasDataset_series
-    )
diff --git a/sktime/datatypes/_series/_convert.py b/sktime/datatypes/_series/_convert.py
index e1ac407ee..3171a3f43 100644
--- a/sktime/datatypes/_series/_convert.py
+++ b/sktime/datatypes/_series/_convert.py
@@ -38,7 +38,7 @@ import pandas as pd
 ##############################################################
 from sktime.datatypes._convert_utils._coerce import _coerce_df_dtypes
 from sktime.datatypes._convert_utils._convert import _extend_conversions
-from sktime.datatypes._registry import MTYPE_LIST_SERIES
+from sktime.datatypes._series._registry import MTYPE_LIST_SERIES
 from sktime.utils.dependencies import _check_soft_dependencies
 
 convert_dict = dict()
diff --git a/sktime/datatypes/_table/__init__.py b/sktime/datatypes/_table/__init__.py
index 8c2c8f699..dbdfd021c 100644
--- a/sktime/datatypes/_table/__init__.py
+++ b/sktime/datatypes/_table/__init__.py
@@ -1,11 +1,9 @@
 """Module exports: Series type checkers, converters and mtype inference."""
 
-from sktime.datatypes._table._check import check_dict as check_dict_Table
 from sktime.datatypes._table._convert import convert_dict as convert_dict_Table
 from sktime.datatypes._table._registry import MTYPE_LIST_TABLE, MTYPE_REGISTER_TABLE
 
 __all__ = [
-    "check_dict_Table",
     "convert_dict_Table",
     "MTYPE_LIST_TABLE",
     "MTYPE_REGISTER_TABLE",
diff --git a/sktime/datatypes/_table/_base.py b/sktime/datatypes/_table/_base.py
new file mode 100644
index 000000000..0c12cfa7c
--- /dev/null
+++ b/sktime/datatypes/_table/_base.py
@@ -0,0 +1,63 @@
+# copyright: skpro developers, BSD-3-Clause License (see LICENSE file)
+"""Base class for data types."""
+
+__author__ = ["fkiraly"]
+
+from sktime.datatypes._base import BaseDatatype
+
+
+class BaseTable(BaseDatatype):
+    """Base class for Table data types.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": None,  # any string
+        "name_python": None,  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": None,
+    }
+
+    def __init__(
+        self,
+        is_univariate=None,
+        is_empty=None,
+        has_nans=None,
+        n_instances=None,
+        n_features=None,
+        feature_names=None,
+        dtypekind_dfip=None,
+        feature_kind=None,
+    ):
+        self.is_univariate = is_univariate
+        self.is_empty = is_empty
+        self.has_nans = has_nans
+        self.n_instances = n_instances
+        self.n_features = n_features
+        self.feature_names = feature_names
+        self.dtypekind_dfip = dtypekind_dfip
+        self.feature_kind = feature_kind
+
+        super().__init__()
diff --git a/sktime/datatypes/_table/_check.py b/sktime/datatypes/_table/_check.py
index 4a1a8a591..a6e7c7872 100644
--- a/sktime/datatypes/_table/_check.py
+++ b/sktime/datatypes/_table/_check.py
@@ -34,24 +34,81 @@ metadata: dict - metadata about obj if valid, otherwise None
         "feature_names": list of int or object, names of variables in table
 """
 
-__author__ = ["fkiraly"]
-
-__all__ = ["check_dict"]
-
 import numpy as np
 import pandas as pd
 
-from sktime.datatypes._common import _req, _ret
+from sktime.datatypes._base._common import _req, _ret
 from sktime.datatypes._dtypekind import _get_feature_kind, _get_table_dtypekind
-from sktime.utils.dependencies import _check_soft_dependencies
-
-check_dict = dict()
-
+from sktime.datatypes._table._base import BaseTable
 
 PRIMITIVE_TYPES = (float, int, str)
 
 
-def check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
+class TablePdDataFrame(BaseTable):
+    """Data type: pandas.DataFrame based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "pd_DataFrame_Table",  # any string
+        "name_python": "table_pd_df",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": True,
+        "capability:missing_values": True,
+        "capability:index": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_pddataframe_table(obj, return_metadata, var_name)
+
+
+def _check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
+    """Check if obj is a pandas.DataFrame based specification of single time series."""
     metadata = dict()
 
     if not isinstance(obj, pd.DataFrame):
@@ -81,10 +138,70 @@ def check_pddataframe_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("pd_DataFrame_Table", "Table")] = check_pddataframe_table
-
-
-def check_pdseries_table(obj, return_metadata=False, var_name="obj"):
+class TablePdSeries(BaseTable):
+    """Data type: pandas.Series based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "pd_Series_Table",  # any string
+        "name_python": "table_pd_series",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "pandas",
+        "capability:multivariate": False,
+        "capability:missing_values": True,
+        "capability:index": True,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_pdseries_table(obj, return_metadata, var_name)
+
+
+def _check_pdseries_table(obj, return_metadata=False, var_name="obj"):
     metadata = dict()
 
     if not isinstance(obj, pd.Series):
@@ -120,10 +237,70 @@ def check_pdseries_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("pd_Series_Table", "Table")] = check_pdseries_table
-
-
-def check_numpy1d_table(obj, return_metadata=False, var_name="obj"):
+class TableNp1D(BaseTable):
+    """Data type: 1D np.ndarray based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "numpy1D",  # any string
+        "name_python": "table_numpy1d",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": False,
+        "capability:missing_values": True,
+        "capability:index": False,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_numpy1d_table(obj, return_metadata, var_name)
+
+
+def _check_numpy1d_table(obj, return_metadata=False, var_name="obj"):
     metadata = dict()
 
     if not isinstance(obj, np.ndarray):
@@ -159,10 +336,70 @@ def check_numpy1d_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("numpy1D", "Table")] = check_numpy1d_table
-
-
-def check_numpy2d_table(obj, return_metadata=False, var_name="obj"):
+class TableNp2D(BaseTable):
+    """Data type: 2D np.ndarray based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "numpy2D",  # any string
+        "name_python": "table_numpy2d",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": True,
+        "capability:missing_values": True,
+        "capability:index": False,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_numpy2d_table(obj, return_metadata, var_name)
+
+
+def _check_numpy2d_table(obj, return_metadata=False, var_name="obj"):
     metadata = dict()
 
     if not isinstance(obj, np.ndarray):
@@ -197,10 +434,70 @@ def check_numpy2d_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("numpy2D", "Table")] = check_numpy2d_table
-
-
-def check_list_of_dict_table(obj, return_metadata=False, var_name="obj"):
+class TableListOfDict(BaseTable):
+    """Data type: list of dict based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "list_of_dict",  # any string
+        "name_python": "table_list_of_dict",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": "numpy",
+        "capability:multivariate": True,
+        "capability:missing_values": True,
+        "capability:index": False,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        return _check_list_of_dict_table(obj, return_metadata, var_name)
+
+
+def _check_list_of_dict_table(obj, return_metadata=False, var_name="obj"):
     metadata = dict()
 
     if not isinstance(obj, list):
@@ -258,28 +555,131 @@ def check_list_of_dict_table(obj, return_metadata=False, var_name="obj"):
     return _ret(True, None, metadata, return_metadata)
 
 
-check_dict[("list_of_dict", "Table")] = check_list_of_dict_table
-
-
-if _check_soft_dependencies(["polars", "pyarrow"], severity="none"):
-    from sktime.datatypes._adapter.polars import check_polars_frame
-
-    def check_polars_table(obj, return_metadata=False, var_name="obj"):
-        return check_polars_frame(
-            obj=obj,
-            return_metadata=return_metadata,
-            var_name=var_name,
-            lazy=False,
-        )
-
-    check_dict[("polars_eager_table", "Table")] = check_polars_table
-
-    def check_polars_table_lazy(obj, return_metadata=False, var_name="obj"):
-        return check_polars_frame(
-            obj=obj,
-            return_metadata=return_metadata,
-            var_name=var_name,
-            lazy=True,
-        )
-
-    check_dict[("polars_lazy_table", "Table")] = check_polars_table_lazy
+class TablePolarsEager(BaseTable):
+    """Data type: eager polars DataFrame based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "polars_eager_table",  # any string
+        "name_python": "table_polars_eager",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": ["polars", "pyarrow"],
+        "capability:multivariate": True,
+        "capability:missing_values": True,
+        "capability:index": False,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.polars import check_polars_frame
+
+        return check_polars_frame(obj, return_metadata, var_name, lazy=False)
+
+
+class TablePolarsLazy(BaseTable):
+    """Data type: lazy polars DataFrame based specification of data frame table.
+
+    Parameters are inferred by check.
+
+    Parameters
+    ----------
+    is_univariate: bool
+        True iff table has one variable
+    is_empty: bool
+        True iff table has no variables or no instances
+    has_nans: bool
+        True iff the table contains NaN values
+    n_instances: int
+        number of instances/rows in the table
+    n_features: int
+        number of variables in table
+    feature_names: list of int or object
+        names of variables in table
+    dtypekind_dfip: list of DtypeKind enum
+        list of DtypeKind enum values for each feature in the panel,
+        following the data frame interface protocol
+    feature_kind: list of str
+        list of feature kind strings for each feature in the panel,
+        coerced to FLOAT or CATEGORICAL type
+    """
+
+    _tags = {
+        "scitype": "Table",
+        "name": "polars_lazy_table",  # any string
+        "name_python": "table_polars_lazy",  # lower_snake_case
+        "name_aliases": [],
+        "python_version": None,
+        "python_dependencies": ["polars", "pyarrow"],
+        "capability:multivariate": True,
+        "capability:missing_values": True,
+        "capability:index": False,
+    }
+
+    def _check(self, obj, return_metadata=False, var_name="obj"):
+        """Check if obj is of this data type.
+
+        Parameters
+        ----------
+        obj : any
+            Object to check.
+        return_metadata : bool, optional (default=False)
+            Whether to return metadata.
+        var_name : str, optional (default="obj")
+            Name of the variable to check, for use in error messages.
+
+        Returns
+        -------
+        valid : bool
+            Whether obj is of this data type.
+        msg : str, only returned if return_metadata is True.
+            Error message if obj is not of this data type.
+        metadata : dict, only returned if return_metadata is True.
+            Metadata dictionary.
+        """
+        from sktime.datatypes._adapter.polars import check_polars_frame
+
+        return check_polars_frame(obj, return_metadata, var_name, lazy=True)
diff --git a/sktime/forecasting/chronos.py b/sktime/forecasting/chronos.py
new file mode 100644
index 000000000..e57ce5e75
--- /dev/null
+++ b/sktime/forecasting/chronos.py
@@ -0,0 +1,395 @@
+"""Implements Chronos forecaster."""
+
+__author__ = ["abdulfatir", "lostella", "Z-Fran", "benheid", "geetu040"]
+# abdulfatir and lostella for amazon-science/chronos-forecasting
+
+__all__ = ["ChronosForecaster"]
+
+from typing import Optional
+
+import numpy as np
+import pandas as pd
+from skbase.utils.dependencies import _check_soft_dependencies
+
+from sktime.forecasting.base import ForecastingHorizon, _BaseGlobalForecaster
+from sktime.utils.singleton import _multiton
+
+if _check_soft_dependencies("torch", severity="none"):
+    import torch
+else:
+
+    class torch:
+        """Dummy class if torch is unavailable."""
+
+        bfloat16 = None
+
+
+if _check_soft_dependencies("transformers", severity="none"):
+    import transformers
+
+
+class ChronosForecaster(_BaseGlobalForecaster):
+    """
+    Interface to the Chronos Zero-Shot Forecaster by Amazon Research.
+
+    Chronos is a pretrained time-series foundation model
+    developed by Amazon for time-series forecasting. This method has been
+    proposed in [2]_ and official code is given at [1]_.
+
+    Parameters
+    ----------
+    model_path : str
+        Path to the Chronos huggingface model.
+
+    config : dict, optional, default={}
+        A dictionary specifying the configuration settings for the model.
+        The available configuration options include hyperparameters that control
+        the prediction behavior, sampling, and hardware preferences. The dictionary
+        can include the following keys:
+
+        - "num_samples" : int, optional
+            The number of samples to generate during prediction. Median of these samples
+            is taken to get prediction for each timestamp.
+        - "temperature" : float, optional
+            Sampling temperature for prediction. A higher value increases the randomness
+            of predictions, while a lower value makes them more deterministic.
+        - "top_k" : int, optional
+            Limits the sampling pool to the top k predictions during sampling.
+        - "top_p" : float, optional
+            Cumulative probability threshold for nucleus sampling.
+            Controls the diversity of the predictions.
+        - "limit_prediction_length" : bool, default=False
+            If True, limits the length of the predictions to the model's context length.
+        - "torch_dtype" : torch.dtype, default=torch.bfloat16
+            Data type to use for model weights and operations (e.g., `torch.float32`,
+            `torch.float16`, or `torch.bfloat16`).
+        - "device_map" : str, default="cpu"
+            Specifies the device on which to run the model, e.g.,
+            "cpu" for CPU inference, "cuda" for GPU, or "mps" for Apple Silicon.
+
+        If not provided, the default values from the pretrained model or system
+        configuration are used.
+
+    seed: int, optional, default=None
+        Random seed for transformers.
+
+    use_source_package: bool, optional, default=False
+        If True, the model will be loaded directly from the source package ``chronos``.
+        This is useful if you want to bypass the local version of the package
+        or when working in an environment where the latest updates
+        from the source package are needed.
+        If False, the model will be loaded from the local version of package maintained
+        in sktime.
+        To install the source package, follow the instructions here [1]_.
+
+    ignore_deps: bool, optional, default=False
+        If True, dependency checks will be ignored, and the user is expected to handle
+        the installation of required packages manually. If False, the class will enforce
+        the default dependencies required for Chronos.
+
+    References
+    ----------
+    .. [1] https://github.com/amazon-science/chronos-forecasting
+    .. [2] Abdul Fatir Ansari, Lorenzo Stella, Caner Turkmen, and others (2024).
+    Chronos: Learning the Language of Time Series
+
+    Examples
+    --------
+    >>> from sktime.datasets import load_airline
+    >>> from sktime.forecasting.chronos import ChronosForecaster
+    >>> from sktime.split import temporal_train_test_split
+    >>> from sktime.forecasting.base import ForecastingHorizon
+    >>> y = load_airline()
+    >>> y_train, y_test = temporal_train_test_split(y)
+    >>> fh = ForecastingHorizon(y_test.index, is_relative=False)
+    >>> forecaster = ChronosForecaster("amazon/chronos-t5-tiny") # doctest: +SKIP
+    >>> forecaster.fit(y_train) # doctest: +SKIP
+    >>> y_pred = forecaster.predict(fh) # doctest: +SKIP
+    """
+
+    # tag values are "safe defaults" which can usually be left as-is
+    _tags = {
+        # packaging info
+        # --------------
+        "authors": [
+            "abdulfatir",
+            "lostella",
+            "Z-Fran",
+            "benheid",
+            "geetu040",
+            "rigvedmanoj",
+        ],
+        # abdulfatir and lostella for amazon-science/chronos-forecasting
+        "maintainers": ["geetu040"],
+        "python_dependencies": ["torch", "transformers", "accelerate"],
+        # estimator type
+        # --------------
+        "requires-fh-in-fit": False,
+        "X-y-must-have-same-index": True,
+        "enforce_index_type": None,
+        "handles-missing-data": False,
+        "capability:pred_int": False,
+        "X_inner_mtype": ["pd.DataFrame", "pd-multiindex", "pd_multiindex_hier"],
+        "y_inner_mtype": [
+            "pd.DataFrame",
+            "pd-multiindex",
+            "pd_multiindex_hier",
+        ],
+        "scitype:y": "univariate",
+        "capability:insample": False,
+        "capability:pred_int:insample": False,
+        "capability:global_forecasting": True,
+    }
+
+    _default_config = {
+        "num_samples": None,  # int, use value from pretrained model if None
+        "temperature": None,  # float, use value from pretrained model if None
+        "top_k": None,  # int, use value from pretrained model if None
+        "top_p": None,  # float, use value from pretrained model if None
+        "limit_prediction_length": False,  # bool
+        "torch_dtype": torch.bfloat16,  # torch.dtype
+        "device_map": "cpu",  # str, use "cpu" for CPU inference, "cuda" for gpu and "mps" for Apple Silicon # noqa
+    }
+
+    def __init__(
+        self,
+        model_path: str,
+        config: dict = None,
+        seed: Optional[int] = None,
+        use_source_package: bool = False,
+        ignore_deps: bool = False,
+    ):
+        # set random seed
+        self.seed = seed
+        self._seed = np.random.randint(0, 2**31) if seed is None else seed
+
+        # set config
+        self.config = config
+        _config = self._default_config.copy()
+        _config.update(config if config is not None else {})
+        self._config = _config
+
+        self.model_path = model_path
+        self.context = None
+        self.use_source_package = use_source_package
+        self.ignore_deps = ignore_deps
+
+        if self.ignore_deps:
+            self.set_tags(python_dependencies=[])
+        elif self.use_source_package:
+            self.set_tags(python_dependencies=["chronos"])
+        else:
+            self.set_tags(python_dependencies=["torch", "transformers", "accelerate"])
+
+        super().__init__()
+
+    def _fit(self, y, X=None, fh=None):
+        """Fit forecaster to training data.
+
+        private _fit containing the core logic, called from fit
+
+        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 predict.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous variables are ignored.
+
+        Returns
+        -------
+        self : reference to self
+        """
+        self.model_pipeline = _CachedChronos(
+            key=self._get_unique_chronos_key(),
+            chronos_kwargs=self._get_chronos_kwargs(),
+            use_source_package=self.use_source_package,
+        ).load_from_checkpoint()
+
+    def _get_chronos_kwargs(self):
+        """Get the kwargs for Chronos model."""
+        return {
+            "pretrained_model_name_or_path": self.model_path,
+            "torch_dtype": self._config["torch_dtype"],
+            "device_map": self._config["device_map"],
+        }
+
+    def _get_unique_chronos_key(self):
+        """Get unique key for Chronos model to use in multiton."""
+        model_path = self.model_path
+        use_source_package = self.use_source_package
+        kwargs = self._get_chronos_kwargs()
+        kwargs_plus_model_path = {
+            **kwargs,
+            "model_path": model_path,
+            "use_source_package": use_source_package,
+        }
+        return str(sorted(kwargs_plus_model_path.items()))
+
+    def _predict(self, fh, y=None, X=None):
+        """Forecast time series at future horizon.
+
+        private _predict containing the core logic, called from predict
+
+        Parameters
+        ----------
+        fh : guaranteed to be ForecastingHorizon or None, optional (default=None)
+            The forecasting horizon with the steps ahead to predict.
+        X : pd.DataFrame, optional (default=None)
+            Exogenous variables are ignored.
+
+        Returns
+        -------
+        y_pred : pd.DataFrame
+            Predicted forecasts.
+        """
+        transformers.set_seed(self._seed)
+        if fh is not None:
+            # needs to be integer not np.int64
+            prediction_length = int(max(fh.to_relative(self.cutoff)))
+        else:
+            prediction_length = 1
+
+        _y = self._y.copy()
+        if y is not None:
+            _y = y.copy()
+        _y_df = _y
+
+        index_names = _y.index.names
+        if isinstance(_y.index, pd.MultiIndex):
+            _y = _frame2numpy(_y)
+        else:
+            _y = _y.values.reshape(1, -1, 1)
+
+        results = []
+        for i in range(_y.shape[0]):
+            _y_i = _y[i, :, 0]
+            _y_i = _y_i[-self.model_pipeline.model.config.context_length :]
+            prediction_results = self.model_pipeline.predict(
+                torch.Tensor(_y_i),
+                prediction_length,
+                num_samples=self._config["num_samples"],
+                temperature=self._config["temperature"],
+                top_k=self._config["top_k"],
+                top_p=self._config["top_p"],
+                limit_prediction_length=False,
+            )
+
+            values = np.median(prediction_results[0].numpy(), axis=0)
+            results.append(values)
+
+        pred = np.stack(results, axis=1)
+        if isinstance(_y_df.index, pd.MultiIndex):
+            ins = np.array(
+                list(np.unique(_y_df.index.droplevel(-1)).repeat(pred.shape[0]))
+            )
+            ins = [ins[..., i] for i in range(ins.shape[-1])] if ins.ndim > 1 else [ins]
+
+            idx = (
+                ForecastingHorizon(range(1, pred.shape[0] + 1), freq=self.fh.freq)
+                .to_absolute(self._cutoff)
+                ._values.tolist()
+                * pred.shape[1]
+            )
+            index = pd.MultiIndex.from_arrays(
+                ins + [idx],
+                names=_y_df.index.names,
+            )
+        else:
+            index = (
+                ForecastingHorizon(range(1, pred.shape[0] + 1))
+                .to_absolute(self._cutoff)
+                ._values
+            )
+        pred_out = fh.get_expected_pred_idx(_y, cutoff=self.cutoff)
+
+        pred = pd.DataFrame(
+            pred.reshape(-1, 1),
+            index=index,
+            columns=_y_df.columns,
+        )
+        dateindex = pred.index.get_level_values(-1).map(lambda x: x in pred_out)
+        pred.index.names = index_names
+
+        return pred.loc[dateindex]
+
+    @classmethod
+    def get_test_params(cls, parameter_set="default"):
+        """Return testing parameter settings for the estimator.
+
+        Parameters
+        ----------
+        parameter_set : str, default="default"
+            Name of the set of test parameters to return, for use in tests. If no
+            special parameters are defined for a value, will return ``"default"`` set.
+
+        Returns
+        -------
+        params : dict or list of dict
+        """
+        test_params = []
+        test_params.append(
+            {
+                "model_path": "amazon/chronos-t5-tiny",
+            }
+        )
+        test_params.append(
+            {
+                "model_path": "amazon/chronos-t5-tiny",
+                "config": {
+                    "num_samples": 20,
+                },
+                "seed": 42,
+            }
+        )
+
+        return test_params
+
+
+def _same_index(data):
+    data = data.groupby(level=list(range(len(data.index.levels) - 1))).apply(
+        lambda x: x.index.get_level_values(-1)
+    )
+    assert data.map(
+        lambda x: x.equals(data.iloc[0])
+    ).all(), "All series must has the same index"
+    return data.iloc[0], len(data.iloc[0])
+
+
+def _frame2numpy(data):
+    idx, length = _same_index(data)
+    arr = np.array(data.values, dtype=np.float32).reshape(
+        (-1, length, len(data.columns))
+    )
+    return arr
+
+
+@_multiton
+class _CachedChronos:
+    """Cached Chronos model, to ensure only one instance exists in memory.
+
+    Chronos is a zero shot model and immutable, hence there will not be
+    any side effects of sharing the same instance across multiple uses.
+    """
+
+    def __init__(self, key, chronos_kwargs, use_source_package):
+        self.key = key
+        self.chronos_kwargs = chronos_kwargs
+        self.use_source_package = use_source_package
+        self.model_pipeline = None
+
+    def load_from_checkpoint(self):
+        if self.model_pipeline is not None:
+            return self.model_pipeline
+
+        if self.use_source_package:
+            from chronos import ChronosPipeline
+        else:
+            from sktime.libs.chronos import ChronosPipeline
+
+        self.model_pipeline = ChronosPipeline.from_pretrained(
+            **self.chronos_kwargs,
+        )
+
+        return self.model_pipeline
diff --git a/sktime/forecasting/darts.py b/sktime/forecasting/darts.py
index 3698e7d06..fa748096e 100644
--- a/sktime/forecasting/darts.py
+++ b/sktime/forecasting/darts.py
@@ -366,7 +366,7 @@ class DartsXGBModel(_DartsRegressionModelsAdapter):
         kwargs = self.kwargs or {}
         if self.quantiles is not None and self.multi_models:
             warn(
-                message=(
+                (
                     "Setting multi_models=True with quantile regression may"
                     " cause issues. Consider using multi_models=False."
                 ),
@@ -592,7 +592,7 @@ class DartsLinearRegressionModel(_DartsRegressionModelsAdapter):
         kwargs = self.kwargs or {}
         if self.quantiles is not None and self.multi_models:
             warn(
-                message=(
+                (
                     "Setting multi_models=True with quantile regression may"
                     " cause issues. Consider using multi_models=False."
                 ),
diff --git a/sktime/forecasting/squaring_residuals.py b/sktime/forecasting/squaring_residuals.py
index 8dae4e947..644cac43b 100644
--- a/sktime/forecasting/squaring_residuals.py
+++ b/sktime/forecasting/squaring_residuals.py
@@ -308,14 +308,17 @@ class SquaringResiduals(BaseForecaster):
             Entries are quantile forecasts, for var in col index,
                 at quantile probability in second col index, for the row index.
         """
-        eval(f"exec('from scipy.stats import {self.distr}')")
+        from scipy import stats
+
+        dist_fun = getattr(stats, self.distr)
+
         fh_abs = fh.to_absolute(self.cutoff)
         y_pred = self._forecaster_.predict(fh=fh_abs, X=X)
         pred_var = self._predict_var(fh=fh, X=X)
         if self.distr_kwargs is not None:
-            z_scores = eval(self.distr).ppf(alpha, **self.distr_kwargs)
+            z_scores = dist_fun.ppf(alpha, **self.distr_kwargs)
         else:
-            z_scores = eval(self.distr).ppf(alpha)
+            z_scores = dist_fun.ppf(alpha)
 
         errors = [pred_var * z for z in z_scores]
 
diff --git a/sktime/libs/chronos/README.md b/sktime/libs/chronos/README.md
new file mode 100644
index 000000000..f7009aa7b
--- /dev/null
+++ b/sktime/libs/chronos/README.md
@@ -0,0 +1,17 @@
+# Chronos: Learning the Language of Time Series
+
+Paper: https://arxiv.org/abs/2403.07815
+
+Original Source: https://github.com/amazon-science/chronos-forecasting
+
+Authors: Lorenzo Stella <stellalo@amazon.com>, Abdul Fatir Ansari <ansarnd@amazon.com>
+
+## Citation
+```
+@article{ansari2024chronos,
+  author  = {Ansari, Abdul Fatir and Stella, Lorenzo and Turkmen, Caner and Zhang, Xiyuan and Mercado, Pedro and Shen, Huibin and Shchur, Oleksandr and Rangapuram, Syama Syndar and Pineda Arango, Sebastian and Kapoor, Shubham and Zschiegner, Jasper and Maddix, Danielle C. and Wang, Hao and Mahoney, Michael W. and Torkkola, Kari and Gordon Wilson, Andrew and Bohlke-Schneider, Michael and Wang, Yuyang},
+  title   = {Chronos: Learning the Language of Time Series},
+  journal = {arXiv preprint arXiv:2403.07815},
+  year    = {2024}
+}
+```
diff --git a/sktime/libs/chronos/__init__.py b/sktime/libs/chronos/__init__.py
new file mode 100644
index 000000000..e528daf44
--- /dev/null
+++ b/sktime/libs/chronos/__init__.py
@@ -0,0 +1,5 @@
+"""Chronos."""
+
+from sktime.libs.chronos.chronos import ChronosPipeline
+
+__all__ = ["ChronosPipeline"]
diff --git a/sktime/libs/chronos/chronos.py b/sktime/libs/chronos/chronos.py
new file mode 100644
index 000000000..d9bf3c5a7
--- /dev/null
+++ b/sktime/libs/chronos/chronos.py
@@ -0,0 +1,575 @@
+"""Chronos: Time Series Forecasting with Transformers.
+
+Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+SPDX-License-Identifier: Apache-2.0
+
+Original Source: https://github.com/amazon-science/chronos-forecasting
+Authors: Lorenzo Stella <stellalo@amazon.com>, Abdul Fatir Ansari <ansarnd@amazon.com>
+"""
+
+import warnings
+from dataclasses import dataclass
+from typing import Any, Literal, Optional, Union
+
+from skbase.utils.dependencies import _check_soft_dependencies
+
+if _check_soft_dependencies("torch", severity="none"):
+    import torch
+    import torch.nn as nn
+else:
+
+    class torch:
+        """Dummy class if torch is unavailable."""
+
+        class Tensor:
+            """Dummy class if torch is unavailable."""
+
+    class nn:
+        """Dummy class if torch is unavailable."""
+
+        class Module:
+            """Dummy class if torch is unavailable."""
+
+
+if _check_soft_dependencies("transformers", severity="none"):
+    from transformers import (
+        AutoConfig,
+        AutoModelForCausalLM,
+        AutoModelForSeq2SeqLM,
+        GenerationConfig,
+        PreTrainedModel,
+    )
+else:
+
+    class PreTrainedModel:
+        """Dummy class if transformers is unavailable."""
+
+
+@dataclass
+class ChronosConfig:
+    """Holds all the configuration parameters."""
+
+    tokenizer_class: str
+    tokenizer_kwargs: dict[str, Any]
+    context_length: int
+    prediction_length: int
+    n_tokens: int
+    n_special_tokens: int
+    pad_token_id: int
+    eos_token_id: int
+    use_eos_token: bool
+    model_type: Literal["causal", "seq2seq"]
+    num_samples: int
+    temperature: float
+    top_k: int
+    top_p: float
+
+    def __post_init__(self):
+        """Check that tokens ids are within bounds."""
+        assert (
+            self.pad_token_id < self.n_special_tokens
+            and self.eos_token_id < self.n_special_tokens
+        ), f"Special token id's must be smaller than {self.n_special_tokens=}"
+
+    def create_tokenizer(self) -> "ChronosTokenizer":
+        """Create a tokenizer object."""
+        class_ = eval(self.tokenizer_class)
+        return class_(**self.tokenizer_kwargs, config=self)
+
+
+class ChronosTokenizer:
+    """
+    Definines how time series are mapped into token IDs and back.
+
+    For details, see the ``input_transform`` and ``output_transform`` methods,
+    which concrete classes must implement.
+    """
+
+    def context_input_transform(self, context):
+        """
+        Turn a batch of time series into token IDs, attention map, and tokenizer_state.
+
+        Parameters
+        ----------
+        context
+            A tensor shaped (batch_size, time_length), containing the
+            timeseries to forecast. Use left-padding with ``torch.nan``
+            to align time series of different lengths.
+
+        Returns
+        -------
+        token_ids
+            A tensor of integers, shaped (batch_size, time_length + 1)
+            if ``config.use_eos_token`` and (batch_size, time_length)
+            otherwise, containing token IDs for the input series.
+        attention_mask
+            A boolean tensor, same shape as ``token_ids``, indicating
+            which input observations are not ``torch.nan`` (i.e. not
+            missing nor padding).
+        tokenizer_state
+            An object that can be passed to ``label_input_transform``
+            and ``output_transform``. Contains the relevant information
+            to decode output samples into real values,
+            such as location and scale parameters.
+        """
+        raise NotImplementedError()
+
+    def label_input_transform(self, label, tokenizer_state):
+        """
+        Turn a batch of label slices of time series into token IDs and attention map.
+
+        Parameters
+        ----------
+        label
+            A tensor shaped (batch_size, time_length), containing the
+            timeseries to forecast. Use left-padding with ``torch.nan``
+            to align time series of different lengths.
+        tokenizer_state
+            An object returned by ``context_input_transform`` containing
+            relevant information to preprocess data, such as location and
+            scale. The nature of this depends on the specific tokenizer.
+            This is used for tokenizing the label, in order to use the same
+            scaling used to tokenize the context.
+
+        Returns
+        -------
+        token_ids
+            A tensor of integers, shaped (batch_size, time_length + 1)
+            if ``config.use_eos_token`` and (batch_size, time_length)
+            otherwise, containing token IDs for the input series.
+        attention_mask
+            A boolean tensor, same shape as ``token_ids``, indicating
+            which input observations are not ``torch.nan`` (i.e. not
+            missing nor padding).
+        """
+        raise NotImplementedError()
+
+    def output_transform(self, samples, tokenizer_state):
+        """
+        Turn a batch of sample token IDs into real values.
+
+        Parameters
+        ----------
+        samples
+            A tensor of integers, shaped (batch_size, num_samples, time_length),
+            containing token IDs of sample trajectories.
+        tokenizer_state
+            An object returned by ``input_transform`` containing
+            relevant context to decode samples, such as location and scale.
+            The nature of this depends on the specific tokenizer.
+
+        Returns
+        -------
+        forecasts
+            A real tensor, shaped (batch_size, num_samples, time_length),
+            containing forecasted sample paths.
+        """
+        raise NotImplementedError()
+
+
+class MeanScaleUniformBins(ChronosTokenizer):
+    """Scales the input by the mean and buckets it uniformly."""
+
+    def __init__(
+        self, low_limit: float, high_limit: float, config: ChronosConfig
+    ) -> None:
+        self.config = config
+        self.centers = torch.linspace(
+            low_limit,
+            high_limit,
+            config.n_tokens - config.n_special_tokens - 1,
+        )
+        self.boundaries = torch.concat(
+            (
+                torch.tensor([-1e20], device=self.centers.device),
+                (self.centers[1:] + self.centers[:-1]) / 2,
+                torch.tensor([1e20], device=self.centers.device),
+            )
+        )
+
+    def _input_transform(self, context, scale=None):
+        attention_mask = ~torch.isnan(context)
+
+        if scale is None:
+            scale = torch.nansum(
+                torch.abs(context) * attention_mask, dim=-1
+            ) / torch.nansum(attention_mask, dim=-1)
+            scale[~(scale > 0)] = 1.0
+
+        scaled_context = context / scale.unsqueeze(dim=-1)
+        token_ids = (
+            torch.bucketize(
+                input=scaled_context,
+                boundaries=self.boundaries,
+                # buckets are open to the right, see:
+                # https://pytorch.org/docs/2.1/generated/torch.bucketize.html#torch-bucketize
+                right=True,
+            )
+            + self.config.n_special_tokens
+        )
+        token_ids[~attention_mask] = self.config.pad_token_id
+
+        return token_ids, attention_mask, scale
+
+    def _append_eos_token(self, token_ids, attention_mask):
+        batch_size = token_ids.shape[0]
+        eos_tokens = torch.full((batch_size, 1), fill_value=self.config.eos_token_id)
+        token_ids = torch.concat((token_ids, eos_tokens), dim=1)
+        eos_mask = torch.full((batch_size, 1), fill_value=True)
+        attention_mask = torch.concat((attention_mask, eos_mask), dim=1)
+
+        return token_ids, attention_mask
+
+    def context_input_transform(self, context):
+        """Transform context."""
+        length = context.shape[-1]
+
+        if length > self.config.context_length:
+            context = context[..., -self.config.context_length :]
+
+        token_ids, attention_mask, scale = self._input_transform(context=context)
+
+        if self.config.use_eos_token and self.config.model_type == "seq2seq":
+            token_ids, attention_mask = self._append_eos_token(
+                token_ids=token_ids, attention_mask=attention_mask
+            )
+
+        return token_ids, attention_mask, scale
+
+    def label_input_transform(self, label, scale):
+        """Transform labels."""
+        length = label.shape[-1]
+
+        assert length == self.config.prediction_length
+        token_ids, attention_mask, _ = self._input_transform(context=label, scale=scale)
+
+        if self.config.use_eos_token:
+            token_ids, attention_mask = self._append_eos_token(
+                token_ids=token_ids, attention_mask=attention_mask
+            )
+
+        return token_ids, attention_mask
+
+    def output_transform(self, samples, scale):
+        """Transform samples."""
+        scale_unsqueezed = scale.unsqueeze(-1).unsqueeze(-1)
+        indices = torch.clamp(
+            samples - self.config.n_special_tokens - 1,
+            min=0,
+            max=len(self.centers) - 1,
+        )
+        return self.centers[indices] * scale_unsqueezed
+
+
+class ChronosModel(nn.Module):
+    """
+    Wraps a ``PreTrainedModel`` object from ``transformers``.
+
+    Parameters
+    ----------
+    config
+        The configuration to use.
+    model
+        The pretrained model to use.
+    """
+
+    def __init__(self, config: ChronosConfig, model: PreTrainedModel) -> None:
+        super().__init__()
+        self.config = config
+        self.model = model
+
+    @property
+    def device(self):
+        """The device where the model is stored."""
+        return self.model.device
+
+    def encode(
+        self,
+        input_ids: torch.Tensor,
+        attention_mask: torch.Tensor,
+    ):
+        """
+        Extract the encoder embedding for the given token sequences.
+
+        Parameters
+        ----------
+        input_ids
+            Tensor of indices of input sequence tokens in the vocabulary
+            with shape (batch_size, sequence_length).
+        attention_mask
+            A mask tensor of the same shape as input_ids to avoid attending
+            on padding or missing tokens.
+
+        Returns
+        -------
+        embedding
+            A tensor of encoder embeddings with shape
+            (batch_size, sequence_length, d_model).
+        """
+        assert (
+            self.config.model_type == "seq2seq"
+        ), "Encoder embeddings are only supported for encoder-decoder models"
+        return self.model.encoder(
+            input_ids=input_ids, attention_mask=attention_mask
+        ).last_hidden_state
+
+    def forward(
+        self,
+        input_ids: torch.Tensor,
+        attention_mask: torch.Tensor,
+        prediction_length: Optional[int] = None,
+        num_samples: Optional[int] = None,
+        temperature: Optional[float] = None,
+        top_k: Optional[int] = None,
+        top_p: Optional[float] = None,
+    ) -> torch.Tensor:
+        """
+        Predict future sample tokens for the given token sequences.
+
+        Arguments ``prediction_length``, ``num_samples``, ``temperature``,
+        ``top_k``, ``top_p`` can be used to customize the model inference,
+        and default to the corresponding attributes in ``self.config`` if
+        not provided.
+
+        Returns
+        -------
+        samples
+            A tensor of integers, shaped (batch_size, num_samples, time_length),
+            containing forecasted sample paths.
+        """
+        if prediction_length is None:
+            prediction_length = self.config.prediction_length
+        if num_samples is None:
+            num_samples = self.config.num_samples
+        if temperature is None:
+            temperature = self.config.temperature
+        if top_k is None:
+            top_k = self.config.top_k
+        if top_p is None:
+            top_p = self.config.top_p
+
+        preds = self.model.generate(
+            input_ids=input_ids,
+            attention_mask=attention_mask,
+            generation_config=GenerationConfig(
+                min_new_tokens=prediction_length,
+                max_new_tokens=prediction_length,
+                do_sample=True,
+                num_return_sequences=num_samples,
+                eos_token_id=self.config.eos_token_id,
+                pad_token_id=self.config.pad_token_id,
+                temperature=temperature,
+                top_k=top_k,
+                top_p=top_p,
+            ),
+        )
+
+        if self.config.model_type == "seq2seq":
+            preds = preds[..., 1:]  # remove the decoder start token
+        else:
+            assert self.config.model_type == "causal"
+            assert preds.size(-1) == input_ids.size(-1) + prediction_length
+            preds = preds[..., -prediction_length:]
+
+        return preds.reshape(input_ids.size(0), num_samples, -1)
+
+
+def left_pad_and_stack_1D(tensors: list):
+    """Pad a list of 1D tensors with ``torch.nan`` and stack them."""
+    max_len = max(len(c) for c in tensors)
+    padded = []
+    for c in tensors:
+        assert isinstance(c, torch.Tensor)
+        assert c.ndim == 1
+        padding = torch.full(
+            size=(max_len - len(c),), fill_value=torch.nan, device=c.device
+        )
+        padded.append(torch.concat((padding, c), dim=-1))
+    return torch.stack(padded)
+
+
+@dataclass
+class ChronosPipeline:
+    """
+    Uses the given tokenizer and model to forecast input time series.
+
+    Use the ``from_pretrained`` class method to load serialized models.
+    Use the ``predict`` method to get forecasts.
+
+    Parameters
+    ----------
+    tokenizer
+        The tokenizer object to use.
+    model
+        The model to use.
+    """
+
+    tokenizer: ChronosTokenizer
+    model: ChronosModel
+
+    def _prepare_and_validate_context(
+        self, context: Union[torch.Tensor, list[torch.Tensor]]
+    ):
+        if isinstance(context, list):
+            context = left_pad_and_stack_1D(context)
+        assert isinstance(context, torch.Tensor)
+        if context.ndim == 1:
+            context = context.unsqueeze(0)
+        assert context.ndim == 2
+
+        return context
+
+    def embed(
+        self, context: Union[torch.Tensor, list[torch.Tensor]]
+    ) -> tuple[torch.Tensor, Any]:
+        """
+        Get encoder embeddings for the given time series.
+
+        Parameters
+        ----------
+        context
+            Input series. This is either a 1D tensor, or a list
+            of 1D tensors, or a 2D tensor whose first dimension
+            is batch. In the latter case, use left-padding with
+            ``torch.nan`` to align series of different lengths.
+
+        Returns
+        -------
+        embeddings, tokenizer_state
+            A tuple of two tensors: the encoder embeddings and the tokenizer_state,
+            e.g., the scale of the time series in the case of mean scaling.
+            The encoder embeddings are shaped (batch_size, context_length, d_model)
+            or (batch_size, context_length + 1, d_model), where context_length
+            is the size of the context along the time axis if a 2D tensor was provided
+            or the length of the longest time series, if a list of 1D tensors was
+            provided, and the extra 1 is for EOS.
+        """
+        with torch.no_grad():
+            context_tensor = self._prepare_and_validate_context(context=context)
+            token_ids, attention_mask, tokenizer_state = (
+                self.tokenizer.context_input_transform(context_tensor)
+            )
+            embeddings = self.model.encode(
+                input_ids=token_ids.to(self.model.device),
+                attention_mask=attention_mask.to(self.model.device),
+            ).cpu()
+            return embeddings, tokenizer_state
+
+    def predict(
+        self,
+        context: Union[torch.Tensor, list[torch.Tensor]],
+        prediction_length: Optional[int] = None,
+        num_samples: Optional[int] = None,
+        temperature: Optional[float] = None,
+        top_k: Optional[int] = None,
+        top_p: Optional[float] = None,
+        limit_prediction_length: bool = True,
+    ) -> torch.Tensor:
+        """
+        Get forecasts for the given time series.
+
+        Parameters
+        ----------
+        context
+            Input series. This is either a 1D tensor, or a list
+            of 1D tensors, or a 2D tensor whose first dimension
+            is batch. In the latter case, use left-padding with
+            ``torch.nan`` to align series of different lengths.
+        prediction_length
+            Time steps to predict. Defaults to what specified
+            in ``self.model.config``.
+        num_samples
+            Number of sample paths to predict. Defaults to what
+            specified in ``self.model.config``.
+        temperature
+            Temperature to use for generating sample tokens.
+            Defaults to what specified in ``self.model.config``.
+        top_k
+            Top-k parameter to use for generating sample tokens.
+            Defaults to what specified in ``self.model.config``.
+        top_p
+            Top-p parameter to use for generating sample tokens.
+            Defaults to what specified in ``self.model.config``.
+        limit_prediction_length
+            Force prediction length smaller or equal than the
+            built-in prediction length from the model. True by
+            default. When true, fail loudly if longer predictions
+            are requested, otherwise longer predictions are allowed.
+
+        Returns
+        -------
+        samples
+            Tensor of sample forecasts, of shape
+            (batch_size, num_samples, prediction_length).
+        """
+        context_tensor = self._prepare_and_validate_context(context=context)
+
+        if prediction_length is None:
+            prediction_length = self.model.config.prediction_length
+
+        if prediction_length > self.model.config.prediction_length:
+            msg = (
+                f"We recommend keeping prediction length <= {self.model.config.prediction_length}. "  # noqa: E501
+                "The quality of longer predictions may degrade since the model is not optimized for it. "  # noqa: E501
+            )
+            if limit_prediction_length:
+                msg += "You can turn off this check by setting `limit_prediction_length=False`."  # noqa: E501
+                raise ValueError(msg)
+            warnings.warn(msg)
+
+        predictions = []
+        remaining = prediction_length
+
+        while remaining > 0:
+            token_ids, attention_mask, scale = self.tokenizer.context_input_transform(
+                context_tensor
+            )
+            samples = self.model(
+                token_ids.to(self.model.device),
+                attention_mask.to(self.model.device),
+                min(remaining, self.model.config.prediction_length),
+                num_samples,
+                temperature,
+                top_k,
+                top_p,
+            )
+            prediction = self.tokenizer.output_transform(
+                samples.to(scale.device), scale
+            )
+
+            predictions.append(prediction)
+            remaining -= prediction.shape[-1]
+
+            if remaining <= 0:
+                break
+
+            context_tensor = torch.cat(
+                [context_tensor, prediction.median(dim=1).values], dim=-1
+            )
+
+        return torch.cat(predictions, dim=-1)
+
+    @classmethod
+    def from_pretrained(cls, *args, **kwargs):
+        """
+        Load the model, either from a local path or from the HuggingFace Hub.
+
+        Supports the same arguments as ``AutoConfig`` and ``AutoModel``
+        from ``transformers``.
+        """
+        config = AutoConfig.from_pretrained(*args, **kwargs)
+
+        assert hasattr(config, "chronos_config"), "Not a Chronos config file"
+
+        chronos_config = ChronosConfig(**config.chronos_config)
+
+        if chronos_config.model_type == "seq2seq":
+            inner_model = AutoModelForSeq2SeqLM.from_pretrained(*args, **kwargs)
+        else:
+            assert chronos_config.model_type == "causal"
+            inner_model = AutoModelForCausalLM.from_pretrained(*args, **kwargs)
+
+        return cls(
+            tokenizer=chronos_config.create_tokenizer(),
+            model=ChronosModel(config=chronos_config, model=inner_model),
+        )
diff --git a/sktime/registry/_craft.py b/sktime/registry/_craft.py
index 3580b4fc3..779ea2297 100644
--- a/sktime/registry/_craft.py
+++ b/sktime/registry/_craft.py
@@ -70,11 +70,8 @@ def craft(spec):
     """
     register = dict(all_estimators())  # noqa: F841
 
-    for x in _extract_class_names(spec):
-        exec(f"{x} = register['{x}']")
-
     try:
-        obj = eval(spec)
+        obj = eval(spec, globals(), register)
     except Exception:
         from textwrap import indent
 
@@ -85,8 +82,9 @@ def build_obj():
         """
             + spec_fun
         )
-        exec(spec_fun, locals())
-        obj = eval("build_obj()")
+
+        exec(spec_fun, register, register)
+        obj = eval("build_obj()", register, register)
 
     return obj
 
diff --git a/sktime/utils/validation/panel.py b/sktime/utils/validation/panel.py
index 642c1c4ca..8257c7535 100644
--- a/sktime/utils/validation/panel.py
+++ b/sktime/utils/validation/panel.py
@@ -11,7 +11,7 @@ import numpy as np
 import pandas as pd
 from sklearn.utils.validation import check_consistent_length
 
-from sktime.datatypes._panel._check import is_nested_dataframe
+from sktime.datatypes._panel._check import _is_nested_dataframe
 from sktime.datatypes._panel._convert import (
     from_3d_numpy_to_nested,
     from_nested_to_3d_numpy,
@@ -102,7 +102,7 @@ def check_X(
 
     # check pd.DataFrame
     if isinstance(X, pd.DataFrame):
-        if not is_nested_dataframe(X):
+        if not _is_nested_dataframe(X):
             raise ValueError(
                 "If passed as a pd.DataFrame, X must be a nested "
                 "pd.DataFrame, with pd.Series or np.arrays inside cells."


Test patch:
diff --git a/sktime/datatypes/_adapter/tests/test_dask_pd.py b/sktime/datatypes/_adapter/tests/test_dask_pd.py
index b07aa0179..f0af88448 100644
--- a/sktime/datatypes/_adapter/tests/test_dask_pd.py
+++ b/sktime/datatypes/_adapter/tests/test_dask_pd.py
@@ -7,6 +7,7 @@ import pandas as pd
 import pytest
 
 from sktime.datatypes._adapter.dask_to_pd import (
+    check_dask_frame,
     convert_dask_to_pandas,
     convert_pandas_to_dask,
 )
@@ -27,6 +28,23 @@ pd_fixture_multiindex.columns = ["a", "foo"]
 PANDAS_FIXTURES = [pd_fixture_simple, pd_fixture_multiindex]
 
 
+@pytest.mark.skipif(
+    not _check_soft_dependencies("dask", severity="none"),
+    reason="skip test if required soft dependency for dask not available",
+)
+def test_check_dask_frame():
+    """Tests that check_dask_frame does not fail when given a pandas DataFrame.
+
+    Failure case in bug #7250.
+    """
+
+    # Create a regular pandas DataFrame
+    invalid_df = pd.DataFrame({"A": [1, 2, 3]})
+
+    # Call the function and expect it to run successfully
+    check_dask_frame(invalid_df)
+
+
 @pytest.mark.skipif(
     not _check_soft_dependencies("dask", severity="none"),
     reason="skip test if required soft dependency for dask not available",
diff --git a/sktime/datatypes/tests/test_check.py b/sktime/datatypes/tests/test_check.py
index d748aa49c..cde3e542d 100644
--- a/sktime/datatypes/tests/test_check.py
+++ b/sktime/datatypes/tests/test_check.py
@@ -8,10 +8,10 @@ import pytest
 
 from sktime.datatypes._check import (
     AMBIGUOUS_MTYPES,
-    check_dict,
     check_is_mtype,
     check_is_scitype,
     check_raise,
+    generate_check_dict,
 )
 from sktime.datatypes._check import mtype as infer_mtype
 from sktime.datatypes._check import scitype as infer_scitype
@@ -131,6 +131,7 @@ def test_check_positive(scitype, mtype, fixture_index):
     fixture = get_examples(mtype=mtype, as_scitype=scitype).get(fixture_index)
 
     # todo: possibly remove this once all checks are defined
+    check_dict = generate_check_dict()
     check_is_defined = (mtype, scitype) in check_dict.keys()
 
     # check fixtures that exist against checks that exist, when full metadata is queried
@@ -186,6 +187,7 @@ def test_check_positive_check_scitype(scitype, mtype, fixture_index):
     fixture = get_examples(mtype=mtype, as_scitype=scitype).get(fixture_index)
 
     # todo: possibly remove this once all checks are defined
+    check_dict = generate_check_dict()
     check_is_defined = (mtype, scitype) in check_dict.keys()
 
     # check fixtures that exist against checks that exist, when full metadata is queried
@@ -238,6 +240,7 @@ def test_check_metadata_inference(scitype, mtype, fixture_index):
     ).get(fixture_index)
 
     # todo: possibly remove this once all checks are defined
+    check_dict = generate_check_dict()
     check_is_defined = (mtype, scitype) in check_dict.keys()
     # if the examples have no metadata to them, don't test
     metadata_provided = expected_metadata is not None
@@ -362,6 +365,7 @@ def test_check_negative(scitype, mtype):
             fixture_wrong_type = fixtures[wrong_mtype].get(i)
 
             # todo: possibly remove this once all checks are defined
+            check_dict = generate_check_dict()
             check_is_defined = (mtype, scitype) in check_dict.keys()
 
             # check fixtures that exist against checks that exist
@@ -415,6 +419,7 @@ def test_mtype_infer(scitype, mtype, fixture_index):
     fixture = get_examples(mtype=mtype, as_scitype=scitype).get(fixture_index)
 
     # todo: possibly remove this once all checks are defined
+    check_dict = generate_check_dict()
     check_is_defined = (mtype, scitype) in check_dict.keys()
 
     # check fixtures that exist against checks that exist
@@ -467,6 +472,7 @@ def test_scitype_infer(scitype, mtype, fixture_index):
     fixture = get_examples(mtype=mtype, as_scitype=scitype).get(fixture_index)
 
     # todo: possibly remove this once all checks are defined
+    check_dict = generate_check_dict()
     check_is_defined = (mtype, scitype) in check_dict.keys()
 
     # check fixtures that exist against checks that exist
diff --git a/sktime/datatypes/tests/test_panel_converters.py b/sktime/datatypes/tests/test_panel_converters.py
index 3871ae559..bfc470621 100644
--- a/sktime/datatypes/tests/test_panel_converters.py
+++ b/sktime/datatypes/tests/test_panel_converters.py
@@ -6,7 +6,7 @@ import pytest
 
 from sktime.datasets import generate_example_long_table, make_multi_index_dataframe
 from sktime.datatypes._adapter import convert_from_multiindex_to_listdataset
-from sktime.datatypes._panel._check import are_columns_nested, is_nested_dataframe
+from sktime.datatypes._panel._check import _is_nested_dataframe, are_columns_nested
 from sktime.datatypes._panel._convert import (
     from_2d_array_to_nested,
     from_3d_numpy_to_2d_array,
@@ -83,7 +83,7 @@ def test_from_3d_numpy_to_nested(n_instances, n_columns, n_timepoints):
     nested = from_3d_numpy_to_nested(array)
 
     # check types and shapes
-    assert is_nested_dataframe(nested)
+    assert _is_nested_dataframe(nested)
     assert nested.shape == (n_instances, n_columns)
     assert nested.iloc[0, 0].shape[0] == n_timepoints
 
@@ -186,7 +186,7 @@ def test_from_multi_index_to_nested(n_instances, n_columns, n_timepoints):
         mi_df, instance_index="case_id", cells_as_numpy=False
     )
 
-    assert is_nested_dataframe(nested_df)
+    assert _is_nested_dataframe(nested_df)
     assert nested_df.shape == (n_instances, n_columns)
     assert (nested_df.columns == mi_df.columns).all()
 
@@ -220,7 +220,7 @@ def test_from_nested_to_multi_index(n_instances, n_columns, n_timepoints):
 @pytest.mark.parametrize("n_columns", N_COLUMNS)
 @pytest.mark.parametrize("n_timepoints", N_TIMEPOINTS)
 def test_is_nested_dataframe(n_instances, n_columns, n_timepoints):
-    """Test is_nested_dataframe for correctness."""
+    """Test _is_nested_dataframe for correctness."""
     array = np.random.normal(size=(n_instances, n_columns, n_timepoints))
     nested, _ = make_classification_problem(n_instances, n_columns, n_timepoints)
     zero_df = pd.DataFrame(np.zeros_like(nested))
@@ -230,10 +230,10 @@ def test_is_nested_dataframe(n_instances, n_columns, n_timepoints):
         n_instances=n_instances, n_timepoints=n_timepoints, n_columns=n_columns
     )
 
-    assert not is_nested_dataframe(array)
-    assert not is_nested_dataframe(mi_df)
-    assert is_nested_dataframe(nested)
-    assert is_nested_dataframe(nested_heterogenous)
+    assert not _is_nested_dataframe(array)
+    assert not _is_nested_dataframe(mi_df)
+    assert _is_nested_dataframe(nested)
+    assert _is_nested_dataframe(nested_heterogenous)
 
 
 @pytest.mark.skipif(
@@ -249,7 +249,7 @@ def test_from_2d_array_to_nested(n_instances, n_columns, n_timepoints):
     X_2d = rng.standard_normal((n_instances, n_timepoints))
     nested_df = from_2d_array_to_nested(X_2d)
 
-    assert is_nested_dataframe(nested_df)
+    assert _is_nested_dataframe(nested_df)
     assert nested_df.shape == (n_instances, 1)
 
 
@@ -267,7 +267,7 @@ def test_from_long_to_nested(n_instances, n_columns, n_timepoints):
     )
     nested_df = from_long_to_nested(X_long)
 
-    assert is_nested_dataframe(nested_df)
+    assert _is_nested_dataframe(nested_df)
     assert nested_df.shape == (n_instances, n_columns)
 
 
diff --git a/sktime/registry/tests/test_craft.py b/sktime/registry/tests/test_craft.py
index f34107385..b9b6e4dc7 100644
--- a/sktime/registry/tests/test_craft.py
+++ b/sktime/registry/tests/test_craft.py
@@ -11,7 +11,31 @@ from sktime.utils.dependencies import _check_soft_dependencies
 simple_spec = "NaiveForecaster()"
 simple_spec_with_dep = "VAR(trend='ct')"
 
-pipe_spec = """
+pipe_spec_no_deps = """
+pipe = TransformedTargetForecaster(steps=[
+    ("imputer", Imputer()),
+    ("forecaster", NaiveForecaster())])
+cv = ExpandingWindowSplitter(
+    initial_window=24,
+    step_length=12,
+    fh=[1, 2, 3])
+
+return ForecastingGridSearchCV(
+    forecaster=pipe,
+    param_grid=[{
+        "forecaster": [NaiveForecaster(sp=12)],
+        "forecaster__strategy": ["drift", "last", "mean"],
+    },
+    {
+        "imputer__method": ["mean", "drift"],
+        "forecaster": [NaiveForecaster(sp=12)],
+    },
+    ],
+    cv=cv,
+    )
+"""
+
+pipe_spec_with_deps = """
 pipe = TransformedTargetForecaster(steps=[
     ("imputer", Imputer()),
     ("forecaster", NaiveForecaster())])
@@ -40,15 +64,16 @@ return ForecastingGridSearchCV(
     )
 """
 
-dunder_spec = "Detrender(ExponentialSmoothing(sp=12)) * ARIMA()"
+dunder_spec_no_deps = "Imputer() * NaiveForecaster()"
+dunder_spec_with_deps = "Detrender(ExponentialSmoothing(sp=12)) * ARIMA()"
+
+specs = [simple_spec, pipe_spec_no_deps, dunder_spec_no_deps]
+
 
-specs = [simple_spec, simple_spec_with_dep, pipe_spec, dunder_spec]
+if _check_soft_dependencies(["statsmodels", "pmdarima"], severity="none"):
+    specs += [simple_spec_with_dep, pipe_spec_with_deps, dunder_spec_with_deps]
 
 
-@pytest.mark.skipif(
-    not _check_soft_dependencies(["statsmodels", "pmdarima"], severity="none"),
-    reason="skip test if required soft dependencies not available",
-)
 @pytest.mark.parametrize("spec", specs)
 def test_craft(spec):
     """Check that crafting works and is inverse to str coercion."""
@@ -66,16 +91,18 @@ def test_deps(spec):
     """Check that deps retrieves the correct requirement sets."""
     # should return length 0 list since has no deps
     assert deps(simple_spec) == []
+    assert deps(pipe_spec_no_deps) == []
+    assert deps(dunder_spec_no_deps) == []
 
     # should correctly find the single dependency
     assert deps(simple_spec_with_dep) == ["statsmodels"]
 
     # has multiple estimators with "statsmodels",
     # this should be returned like this and not as ["statsmodels", "statsmodels"]
-    assert deps(pipe_spec) == ["statsmodels"]
+    assert deps(pipe_spec_with_deps) == ["statsmodels"]
 
     # example with two dependencies, should be identified, order does not matter
-    assert set(deps(dunder_spec)) == {"statsmodels", "pmdarima"}
+    assert set(deps(dunder_spec_with_deps)) == {"statsmodels", "pmdarima"}
 
 
 def test_imports():
@@ -93,4 +120,4 @@ def test_imports():
         "ExpandingWindowSplitter\nfrom sktime.transformations.series.impute import "
         "Imputer"
     )
-    assert imports(pipe_spec) == pipe_imports
+    assert imports(pipe_spec_with_deps) == pipe_imports
diff --git a/sktime/tests/_config.py b/sktime/tests/_config.py
index a91cef9e0..721a57713 100644
--- a/sktime/tests/_config.py
+++ b/sktime/tests/_config.py
@@ -60,6 +60,7 @@ EXCLUDE_ESTIMATORS = [
     "SARIMAX",
     "StatsModelsARIMA",
     "ShapeletLearningClassifierTslearn",
+    "DartsXGBModel",
 ]
 
 
@@ -244,6 +245,11 @@ EXCLUDED_TESTS = {
         "test_fit_idempotent",
     ],
     "TSRGridSearchCV": ["test_multioutput"],  # see 6708
+    # pickling problem
+    "ChronosForecaster": [
+        "test_persistence_via_pickle",
+        "test_save_estimators_to_file",
+    ],
 }
 
 # exclude tests but keyed by test name
diff --git a/sktime/utils/_testing/estimator_checks.py b/sktime/utils/_testing/estimator_checks.py
index f84e24951..31e5685da 100644
--- a/sktime/utils/_testing/estimator_checks.py
+++ b/sktime/utils/_testing/estimator_checks.py
@@ -15,7 +15,7 @@ from sklearn.utils.validation import check_random_state
 from sktime.classification.base import BaseClassifier
 from sktime.classification.early_classification import BaseEarlyClassifier
 from sktime.clustering.base import BaseClusterer
-from sktime.datatypes._panel._check import is_nested_dataframe
+from sktime.datatypes._panel._check import _is_nested_dataframe
 from sktime.registry import is_scitype
 
 
@@ -115,7 +115,7 @@ def _compare_nested_frame(func, x, y, **kwargs):
     if x.empty:
         assert_frame_equal(x, y)
 
-    elif is_nested_dataframe(x):
+    elif _is_nested_dataframe(x):
         # Check if both inputs have the same shape
         if not x.shape == y.shape:
             raise ValueError("Found inputs with different shapes")