Repository: sktime/sktime
Pull request #7342 (2024-10-27 20:30:01)

[ENH] homogenization of `sktime` and `skchange` detection API - part 1 - base class and `y` argument
This carries out the most substantial parts of issue https://github.com/sktime/sktime/issues/7323 to homogenize the `sktime` and `skchange` detection interface, with deprecation & change schedule to ensure downwards compatibility and user warnings.

* `BaseSeriesAnnotator` is changed to `BaseDetector` in the `sktime.detection` module, and in its downwards use. The `BaseSeriesAnnotator`, in its current export locations `sktime.annotation.base` and `sktime.detection.base` remains, but is changed to a child of `BaseDetector` with an added warning.
* signature of `fit` and fit-like methods is changed to take `y` instead of `Y`. As `y` takes the place of `Y`, making positional argument calls downwards compatible. To ensure keyword calls are also compatible, the argument `Y` is patched into `y` internally if passed, such a call raises a warning. To ensure extension contracts remain compatible, internally, we check which inner argument of `_fit` we need to pass `y` to.

fkiraly: FYI @mtveten, @Alex-JG3.

@Alex-JG3, it would be great if you could comment how to wrap up your PR to avoid merge conflicts.
fkiraly: FYI @mtveten, @Alex-JG3, @shivamj07, I am also adding clarification to the docstring that `predict` outputs are `iloc` references. This is how it is consistent with most of `sktime` and `skchange` afaik,
Tveten: I've compared the sktime detector with the skchange detector and made the following notes

- I agree on the `iloc` references as outputs.
- In skchange, checks include allow_index_names = True because I had issues with allow_index_names = False (the default) having the side effect of removing the index from X outside the class. I guess the best solution is to run checks with defaults, but make sure it doesn't have side effects. I should probably have opened an issue on this before.
- X input type across methods: Should only DataFrames be allowed? In `skchange` both series, data frame and numpy arrays are allowed. I don't have a strong opinion on this.
- We need to agree on the output content of `transform`. In `sktime`, the output depends on the `task`, while in `skchange`, the output is always integer labels.

   * Point anomaly detection outputs 0s at the normal ilocs and 1s at anomaly ilocs. To be consistent with the collective anomalies, each anomaly could get a separate integer label. Not sure if this is necessary.
   * Collective anomaly detection outputs 0s at the normal ilocs and labels 1, ..., K for ilocs inside each of the collective anomaleis.
   * Changepoint detection ouputs labels according to the segmentation provided by the changepoints. That is, labels k = 0, ..., K for ilocs inside each of the segments (cpt[k-1], cpt[k]]. I don't see the need for the 0-1-version of changepoint detection where 1 corresponds to the iloc of a changepoint. But I'm open to be convinced otherwise!

- Should it be transform_scores or predict_score and what should the output contract be? For several of the algorithms in `skchange`, the scores can be both multidimensional and doesn't need to be of the same length as the input X. So I suggest allowing a loose contract, maybe only that it needs to be a pd.DataFrame.

Docs:

- Go over and remove occurces of annotations. For example in .predict:
```
        X : pd.DataFrame
            Data to annotate (time series).
```
to something like (from `skchange`)
```
        X : pd.Series, pd.DataFrame or np.ndarray
            Data to detect events in (time series).
```

I think you mean to tag @Tveten and not Mtveten, btw :)
fkiraly: Thanks a lot for your detailed review, @Tveten!

May I kindly ask to add a post that converts the above in recommendations of concrete actions, and cluster them in blocking (you think this is critical/crucial), strong opinion, or weak/non-blocking.
fkiraly: > I think you mean to tag @Tveten and not Mtveten, btw :)

Yes, did you change your GH name at some point, by the way? I have tagged mtveten a lot...

Or am I confused because your discord name is mtveten, and your GH name has always been @Tveten?
Tveten: > > I think you mean to tag @Tveten and not Mtveten, btw :)
> 
> Yes, did you change your GH name at some point, by the way? I have tagged mtveten a lot...
> 
> Or am I confused because your discord name is mtveten, and your GH name has always been @Tveten?

The confusion is due to the Discord name, I think (which I changed now).
fkiraly: > The confusion is due to the Discord name, I think (which I changed now).

That's very kind, although I suspect/fear that will just confuse me more. But thanks 😁 
Tveten: Block decisions:

- Make sure check_series(allow_index_names = False) doesn't have side effects. It currently removed the index from the input data X in place.
- Agree on the output content of `transform`. In `sktime`, the output depends on the `task`, while in `skchange`, the output is always integer labels. In `skchange`:

   * Point anomaly detection outputs 0s at the normal ilocs and 1s at anomaly ilocs. To be consistent with the collective anomalies, each anomaly could get a separate integer label. Not sure if this is necessary.
   * Collective anomaly detection outputs 0s at the normal ilocs and labels 1, ..., K for ilocs inside each of the collective anomaleis.
   * Changepoint detection ouputs labels according to the segmentation provided by the changepoints. That is, labels k = 0, ..., K for ilocs inside each of the segments (cpt[k-1], cpt[k]]. I don't see the need for the 0-1-version of changepoint detection where 1 corresponds to the iloc of a changepoint. But I'm open to be convinced otherwise!

- Should it be transform_scores or predict_score and what should the output contract be? For several of the algorithms in `skchange`, the scores can be both multidimensional and doesn't need to be of the same length as the input X. So I suggest allowing a loose contract, maybe only that it needs to be a pd.DataFrame.

Non-block decisions:

- X input type across methods: Should only DataFrames be allowed? In skchange both series, data frame and numpy arrays are allowed.
- Go over and remove occurces of annotations. For example in .predict:
```
        X : pd.DataFrame
            Data to annotate (time series).
```
to something like (from `skchange`)
```
        X : pd.Series, pd.DataFrame or np.ndarray
            Data to detect events in (time series).
```

Patch:
diff --git a/.all-contributorsrc b/.all-contributorsrc
index 325456df5..153782caa 100644
--- a/.all-contributorsrc
+++ b/.all-contributorsrc
@@ -3156,6 +3156,15 @@
         "tutorial"
       ]
     },
+    {
+      "login": "VectorNd",
+      "name": "Rishabh Kamboj",
+      "avatar_url": "https://avatars.githubusercontent.com/u/111004091?v=4",
+      "profile": "https://github.com/VectorNd",
+      "contributions": [
+        "code"
+      ]
+    },
     {
       "login": "jusssch",
       "name": "Julius Schmid",
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index f9353d1a2..05ab17acd 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -6,7 +6,7 @@ Contributors
 <!-- Please add your badges to .all-contibutorsrc -->
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-310-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-312-orange.svg)](#contributors)
 <!-- ALL-CONTRIBUTORS-BADGE:END -->
 
 This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
@@ -211,12 +211,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/lmmentel"><img src="https://avatars.githubusercontent.com/u/8989838?v=4?s=100" width="100px;" alt="Lukasz Mentel"/><br /><sub><b>Lukasz Mentel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Documentation">📖</a> <a href="#infra-lmmentel" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/sktime/sktime/commits?author=lmmentel" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Almmentel" title="Bug reports">🐛</a> <a href="#maintenance-lmmentel" title="Maintenance">🚧</a> <a href="#mentoring-lmmentel" title="Mentoring">🧑‍🏫</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/madhuri-agarwal-166080209/"><img src="https://avatars.githubusercontent.com/u/108001973?v=4&size=64?s=100" width="100px;" alt="Madhuri"/><br /><sub><b>Madhuri</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=madhuri723" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/manuel-munoz-aguirre"><img src="https://avatars.githubusercontent.com/u/5576458?v=4?s=100" width="100px;" alt="Manuel Muñoz Aguirre"/><br /><sub><b>Manuel Muñoz Aguirre</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manuel-munoz-aguirre" title="Documentation">📖</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/manolotis"><img src="https://avatars.githubusercontent.com/manolotis?s=100" width="100px;" alt="Manuel Muñoz Sánchez"/><br /><sub><b>Manuel Muñoz Sánchez</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=manolotis" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/marrov"><img src="https://avatars.githubusercontent.com/u/54272586?v=4?s=100" width="100px;" alt="Marc Rovira"/><br /><sub><b>Marc Rovira</b></sub></a><br /><a href="#design-marrov" title="Design">🎨</a> <a href="https://github.com/sktime/sktime/commits?author=marrov" title="Documentation">📖</a> <a href="#ideas-marrov" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-marrov" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-marrov" title="Project Management">📆</a> <a href="#talk-marrov" title="Talks">📢</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://marcelotryle.com"><img src="https://avatars3.githubusercontent.com/u/7353520?v=4?s=100" width="100px;" alt="Marcelo Trylesinski"/><br /><sub><b>Marcelo Trylesinski</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Kludex" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MarcoGorelli"><img src="https://avatars2.githubusercontent.com/u/33491632?v=4?s=100" width="100px;" alt="Marco Gorelli"/><br /><sub><b>Marco Gorelli</b></sub></a><br /><a href="#infra-MarcoGorelli" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/margaret-gorlin/"><img src="?s=100" width="100px;" alt="Margaret Gorlin"/><br /><sub><b>Margaret Gorlin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Code">💻</a> <a href="#example-mgorlin" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/margaret-gorlin/"><img src="?s=100" width="100px;" alt="Margaret Gorlin"/><br /><sub><b>Margaret Gorlin</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Code">💻</a> <a href="#example-mgorlin" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=mgorlin" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mariamjabara"><img src="?s=100" width="100px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mariamjabara" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://twitter.com/marielli"><img src="https://avatars2.githubusercontent.com/u/13499809?v=4?s=100" width="100px;" alt="Marielle"/><br /><sub><b>Marielle</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=marielledado" title="Code">💻</a> <a href="#ideas-marielledado" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mloning"><img src="https://avatars3.githubusercontent.com/u/21020482?v=4?s=100" width="100px;" alt="Markus Löning"/><br /><sub><b>Markus Löning</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mloning" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Tests">⚠️</a> <a href="#maintenance-mloning" title="Maintenance">🚧</a> <a href="#platform-mloning" title="Packaging/porting to new platform">📦</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3Amloning" title="Reviewed Pull Requests">👀</a> <a href="#infra-mloning" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#example-mloning" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amloning" title="Bug reports">🐛</a> <a href="#tutorial-mloning" title="Tutorials">✅</a> <a href="#business-mloning" title="Business development">💼</a> <a href="https://github.com/sktime/sktime/commits?author=mloning" title="Documentation">📖</a> <a href="#design-mloning" title="Design">🎨</a> <a href="#eventOrganizing-mloning" title="Event Organizing">📋</a> <a href="#fundingFinding-mloning" title="Funding Finding">🔍</a> <a href="#ideas-mloning" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-mloning" title="Project Management">📆</a> <a href="#question-mloning" title="Answering Questions">💬</a> <a href="#talk-mloning" title="Talks">📢</a> <a href="#mentoring-mloning" title="Mentoring">🧑‍🏫</a> <a href="#video-mloning" title="Videos">📹</a></td>
@@ -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/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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars0.githubusercontent.com/u/25731235?v=4?s=100" width="100px;" alt="Matthew Middlehurst"/><br /><sub><b>Matthew Middlehurst</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MatthewMiddlehurst" title="Tests">⚠️</a> <a href="#tutorial-MatthewMiddlehurst" title="Tutorials">✅</a> <a href="https://github.com/sktime/sktime/pulls?q=is%3Apr+reviewed-by%3AMatthewMiddlehurst" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/sktime/sktime/issues?q=author%3AMatthewMiddlehurst" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/tvdboom"><img src="https://avatars.githubusercontent.com/u/32366550?v=4?s=100" width="100px;" alt="Mavs"/><br /><sub><b>Mavs</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=tvdboom" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/maxfrohlich/"><img src="https://avatars.githubusercontent.com/u/16393653?v=4?s=100" width="100px;" alt="Max Frohlich"/><br /><sub><b>Max Frohlich</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ninedigits" title="Code">💻</a> <a href="#ideas-ninedigits" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-ninedigits" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/solen0id"><img src="https://avatars.githubusercontent.com/u/20767606?v=4?s=100" width="100px;" alt="Max Patzelt"/><br /><sub><b>Max Patzelt</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=solen0id" title="Code">💻</a></td>
@@ -236,9 +237,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/MichalChromcak"><img src="https://avatars1.githubusercontent.com/u/12393430?v=4?s=100" width="100px;" alt="Michal Chromcak"/><br /><sub><b>Michal Chromcak</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MichalChromcak" title="Tests">⚠️</a> <a href="#tutorial-MichalChromcak" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/mk406"><img src="https://avatars.githubusercontent.com/u/78024411?v=4?s=100" width="100px;" alt="Miguel Krause"/><br /><sub><b>Miguel Krause</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=mk406" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/miraep8"><img src="https://avatars.githubusercontent.com/u/10511777?s=400&u=10a774fd4be767fa3b23a82a98bbfe102c17f0f3&v=4?s=100" width="100px;" alt="Mirae Parker"/><br /><sub><b>Mirae Parker</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=miraep8" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MBristle"><img src="https://avatars.githubusercontent.com/MBristle?s=100" width="100px;" alt="Mirko Bristle"/><br /><sub><b>Mirko Bristle</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AMBristle" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=MBristle" title="Tests">⚠️</a></td>
@@ -247,9 +248,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/Dehelaan"><img src="https://avatars.githubusercontent.com/u/120308161?s=400&v=4?s=100" width="100px;" alt="Nihal Chaudhary"/><br /><sub><b>Nihal Chaudhary</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Dehelaan" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=100" width="100px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ngupta23" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/nshahpazov/"><img src="https://avatars.githubusercontent.com/nshahpazov?s=100" width="100px;" alt="Nikola Shahpazov"/><br /><sub><b>Nikola Shahpazov</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nshahpazov" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/nilesh05apr"><img src="https://avatars.githubusercontent.com/u/65773314?v=4?s=100" width="100px;" alt="Nilesh Kumar"/><br /><sub><b>Nilesh Kumar</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=nilesh05apr" title="Code">💻</a></td>
@@ -258,9 +259,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=100" width="100px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Code">💻</a> <a href="#design-prockenschaub" title="Design">🎨</a> <a href="#ideas-prockenschaub" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=prockenschaub" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=100" width="100px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://ber.gp"><img src="https://avatars1.githubusercontent.com/u/9824244?v=4?s=100" width="100px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Pangoraw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/paulyim97/"><img src="https://avatars.githubusercontent.com/pyyim?s=100" width="100px;" alt="Paul Yim"/><br /><sub><b>Paul Yim</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Code">💻</a> <a href="#example-pyyim" title="Examples">💡</a> <a href="https://github.com/sktime/sktime/commits?author=pyyim" title="Tests">⚠️</a></td>
@@ -269,9 +270,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rahulporuri"><img src="https://avatars.githubusercontent.com/u/1926457?v=4?s=100" width="100px;" alt="Poruri Sai Rahul"/><br /><sub><b>Poruri Sai Rahul</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rahulporuri" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/pranav-prajapati-a5b413226/"><img src="https://avatars.githubusercontent.com/u/94780581?v=4?s=100" width="100px;" alt="Pranav Prajapati"/><br /><sub><b>Pranav Prajapati</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=pranavvp16" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Apranavvp16" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Prtm2110"><img src="https://avatars.githubusercontent.com/u/139000226?s=400&u=a2ef29514ad2780d1263ba9d724898132c8d18fb&v=4?s=100" width="100px;" alt="Pratham Hole"/><br /><sub><b>Pratham Hole</b></sub></a><br /><a href="#maintenance-Prtm2110" title="Maintenance">🚧</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=100" width="100px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=pul95" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=100" width="100px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=100" width="100px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=rakshitha123" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ram0nB"><img src="https://avatars.githubusercontent.com/u/45173421?s=100" width="100px;" alt="Ramon Bussing"/><br /><sub><b>Ramon Bussing</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Documentation">📖</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Code">💻</a> <a href="https://github.com/sktime/sktime/issues?q=author%3ARam0nB" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Ram0nB" title="Tests">⚠️</a></td>
@@ -279,10 +280,11 @@ 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/wolph"><img src="?s=100" width="100px;" alt="Rick van Hattem"/><br /><sub><b>Rick van Hattem</b></sub></a><br /><a href="#infra-wolph" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/RigvedManoj"><img src="https://avatars.githubusercontent.com/u/28307990?v=4?s=100" width="100px;" alt="Rigved Manoj"/><br /><sub><b>Rigved Manoj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=RigvedManoj" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Ris-Bali"><img src="https://avatars.githubusercontent.com/u/81592570?v=4?s=100" width="100px;" alt="Rishabh Bali"/><br /><sub><b>Rishabh Bali</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Ris-Bali" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/RishiKumarRay"><img src="https://avatars.githubusercontent.com/u/87641376?v=4?s=100" width="100px;" alt="Rishi Kumar Ray"/><br /><sub><b>Rishi Kumar Ray</b></sub></a><br /><a href="#infra-RishiKumarRay" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="11.11%"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a></td>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/VectorNd"><img src="https://avatars.githubusercontent.com/u/111004091?v=4?s=100" width="100px;" alt="Rishabh Kamboj"/><br /><sub><b>Rishabh Kamboj</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=VectorNd" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/RishiKumarRay"><img src="https://avatars.githubusercontent.com/u/87641376?v=4?s=100" width="100px;" alt="Rishi Kumar Ray"/><br /><sub><b>Rishi Kumar Ray</b></sub></a><br /><a href="#infra-RishiKumarRay" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
+      <td align="center" valign="top" width="11.11%"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/Riyabelle25"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=100" width="100px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Tests">⚠️</a> <a href="https://github.com/sktime/sktime/commits?author=Riyabelle25" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://linkedin.com/in/robert-kuebler"><img src="https://avatars.githubusercontent.com/u/932327?v=4?s=100" width="100px;" alt="Robert Kübler"/><br /><sub><b>Robert Kübler</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AGarve" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=Garve" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/romanlutz/"><img src="https://avatars.githubusercontent.com/u/10245648?v=4?s=100" width="100px;" alt="Roman Lutz"/><br /><sub><b>Roman Lutz</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=romanlutz" title="Documentation">📖</a></td>
@@ -290,10 +292,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <td align="center" valign="top" width="11.11%"><a href="https://sajay.online"><img src="https://avatars2.githubusercontent.com/u/25329624?v=4?s=100" width="100px;" alt="Sajaysurya Ganesh"/><br /><sub><b>Sajaysurya Ganesh</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Documentation">📖</a> <a href="#design-sajaysurya" title="Design">🎨</a> <a href="#example-sajaysurya" title="Examples">💡</a> <a href="#ideas-sajaysurya" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/sktime/sktime/commits?author=sajaysurya" title="Tests">⚠️</a> <a href="#tutorial-sajaysurya" title="Tutorials">✅</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/SamiAlavi"><img src="https://avatars.githubusercontent.com/u/32700289?v=4?s=100" width="100px;" alt="Sami Alavi"/><br /><sub><b>Sami Alavi</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SamiAlavi" title="Code">💻</a> <a href="#maintenance-SamiAlavi" title="Maintenance">🚧</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://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>
       <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>
@@ -301,10 +303,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/dasgupsa"><img src="https://avatars2.githubusercontent.com/u/10398956?v=4?s=100" width="100px;" alt="Saurabh Dasgupta"/><br /><sub><b>Saurabh Dasgupta</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=dasgupsa" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/SebasKoel"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=100" width="100px;" alt="Sebastiaan Koel"/><br /><sub><b>Sebastiaan Koel</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=SebasKoel" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
       <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>
@@ -312,10 +314,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><img src="https://gravatar.com/avatar/cbdbaac712ae282d730cd3028e862d45?s=400&d=robohash&r=x?s=100" width="100px;" alt="Shlok Sabarwal"/><br /><sub><b>Shlok Sabarwal</b></sub><br /><a href="https://github.com/sktime/sktime/commits?author=ssabarwal" title="Code">💻</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/ShreeshaM07"><img src="https://avatars.githubusercontent.com/u/120820143?s=400&v=4?s=100" width="100px;" alt="Shreesha M"/><br /><sub><b>Shreesha M</b></sub></a><br /><a href="https://github.com/sktime/sktime/issues?q=author%3AShreeshaM07" title="Bug reports">🐛</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=ShreeshaM07" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/sbuse"><img src="https://avatars.githubusercontent.com/u/24408707?v=4?s=100" width="100px;" alt="Simon B."/><br /><sub><b>Simon B.</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=sbuse" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/slavik57"><img src="https://avatars.githubusercontent.com/u/6184997?v=4?s=100" width="100px;" alt="Slava Shpitalny"/><br /><sub><b>Slava Shpitalny</b></sub></a><br /><a href="#maintenance-slavik57" title="Maintenance">🚧</a></td>
-      <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>
     </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>
       <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>
@@ -323,10 +325,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <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>
     </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>
       <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>
@@ -334,10 +336,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <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>
     </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>
       <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>
@@ -345,10 +347,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/wayneadams"><img src="https://avatars.githubusercontent.com/u/15034841?s=400&u=d717e9945910bcc844c5e64cd56d570c6cc4e8e6&v=4?s=100" width="100px;" alt="Wayne Adams"/><br /><sub><b>Wayne Adams</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=wayneadams" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/fr1ll"><img src="https://avatars.githubusercontent.com/u/29168593?v=4?s=100" width="100px;" alt="Will Sanger"/><br /><sub><b>Will Sanger</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=fr1ll" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://www.linkedin.com/in/templierw/"><img src="https://github.com/templierw.png?s=100" width="100px;" alt="William Templier"/><br /><sub><b>William Templier</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=templierw" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/magittan"><img src="https://avatars0.githubusercontent.com/u/14024202?v=4?s=100" width="100px;" alt="William Zheng"/><br /><sub><b>William Zheng</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=magittan" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=magittan" title="Tests">⚠️</a></td>
-      <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>
     </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>
       <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>
@@ -356,10 +358,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/MEMEO-PRO"><img src="https://avatars.githubusercontent.com/memeo-pro?s=100" width="100px;" alt="Yash Edake"/><br /><sub><b>Yash Edake</b></sub></a><br /><a href="#maintenance-memeo-pro" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/issues?q=author%3Amemeo-pro" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/YashKhare20"><img src="https://avatars.githubusercontent.com/u/92680366?s=400?s=100" width="100px;" alt="Yash Khare"/><br /><sub><b>Yash Khare</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=YashKhare20" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/yashlamba"><img src="https://avatars.githubusercontent.com/u/44164398?v=4?s=100" width="100px;" alt="Yash Lamba"/><br /><sub><b>Yash Lamba</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=yashlamba" title="Code">💻</a></td>
-      <td align="center" valign="top" width="11.11%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=100" width="100px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/sktime/sktime/commits?author=xuyxu" title="Documentation">📖</a></td>
-      <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>
     </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>
       <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>
@@ -367,10 +369,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <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>
     </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>
       <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>
@@ -378,10 +380,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <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>
     </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>
       <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>
@@ -389,10 +391,10 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="11.11%"><a href="https://github.com/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>
-      <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>
     </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>
       <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>
diff --git a/docs/source/api_reference.rst b/docs/source/api_reference.rst
index ca950aa60..1a6a10fb1 100644
--- a/docs/source/api_reference.rst
+++ b/docs/source/api_reference.rst
@@ -18,7 +18,7 @@ For a list of object and estimator tags, see :ref:`tags_ref`.
 .. toctree::
     :maxdepth: 1
 
-    api_reference/base
+    api_reference/data_format
     api_reference/forecasting
     api_reference/transformations
     api_reference/classification
@@ -31,9 +31,9 @@ For a list of object and estimator tags, see :ref:`tags_ref`.
     api_reference/alignment
     api_reference/detection
     api_reference/datasets
-    api_reference/data_format
     api_reference/deployment
     api_reference/utils
+    api_reference/base
     api_reference/exceptions
     api_reference/tags
     api_reference/pipeline
diff --git a/docs/source/api_reference/clustering.rst b/docs/source/api_reference/clustering.rst
index 013499ec4..df71ad238 100644
--- a/docs/source/api_reference/clustering.rst
+++ b/docs/source/api_reference/clustering.rst
@@ -15,8 +15,8 @@ A full table with tag based search is also available on the
 (select "clustering" in the "Estimator type" dropdown).
 
 
-Clustering models
------------------
+Partitioning based
+------------------
 
 .. currentmodule:: sktime.clustering.k_means
 
@@ -43,6 +43,9 @@ Clustering models
 
     TimeSeriesKShapes
 
+Spectral and kernel clustering
+------------------------------
+
 .. currentmodule:: sktime.clustering.kernel_k_means
 
 .. autosummary::
@@ -51,6 +54,17 @@ Clustering models
 
     TimeSeriesKernelKMeans
 
+Density-based
+-------------
+
+.. currentmodule:: sktime.clustering.dbscan
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    TimeSeriesDBSCAN
+
 Base
 ----
 
diff --git a/docs/source/api_reference/data_format.rst b/docs/source/api_reference/data_format.rst
index 078398ef6..6d42cd3a6 100644
--- a/docs/source/api_reference/data_format.rst
+++ b/docs/source/api_reference/data_format.rst
@@ -1,10 +1,143 @@
 .. _data_format:
 
-File Format Specifications
+Data Format Specifications
 ==========================
 
-The File Format Specifications provides a technical manual for understanding and writing
-different file formats found in ``sktime``.
+This section provides specifications for:
+
+* python in-memory data containers used in ``sktime`` (e.g., time series, panel data, etc.)
+* serialized file formats used by ``sktime`` (e.g., ts)
+
+For utilities to check and convert data formats, see the API reference on :ref:`utils_ref`.
+
+
+In-memory Data Specifications
+-----------------------------
+
+``sktime`` uses a variety of in-memory data containers to represent time series data.
+
+The in-memory specifications are listed by abstract data type, also referred to
+as data :term:`scitype` (scientific type) throughout the documentation.
+
+The core scitypes in ``sktime`` are:
+
+- ``Series``: a single time series
+- ``Panel``: a flat collection of time series, also called panel of time series, or panel data
+- ``Hierarchical``: a hierarchical collection of time series
+- ``Table``: a data frame table, as implemented for instance by ``pandas.DataFrame``
+
+Each scitype is sub-typed with property fields such as ``is_univariate``
+(the time series is univariate yes/no),
+``n_instances`` (number of instances in a panel or hierarchical collection), etc.
+
+Concerete data types in ``sktime`` are implementations of these abstract data types,
+also referred to as data :term:`mtype` (machine type) throughout the documentation.
+
+Full specifications of the abstract data types,
+with their subtypes, can be accessed below:
+
+.. currentmodule:: sktime.datatypes._series._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeSeries
+
+.. currentmodule:: sktime.datatypes._panel._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypePanel
+
+.. currentmodule:: sktime.datatypes._hierarchical._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeHierarchical
+
+.. currentmodule:: sktime.datatypes._table._base
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    ScitypeTable
+
+
+``Series`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Series`` mtype represents a single time series.
+
+.. currentmodule:: sktime.datatypes._series._check
+
+    SeriesPdDataFrame
+    SeriesPdSeries
+    SeriesNp2D
+    SeriesXArray
+    SeriesDask
+    SeriesPolarsEager
+    SeriesGluontsList
+    SeriesGluontsPandas
+
+
+``Panel`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Panel`` mtype represents a flat collection of time series.
+
+.. currentmodule:: sktime.datatypes._panel._check
+
+    PanelPdMultiIndex
+    PanelNp3D
+    PanelDfList
+    PanelDask
+    PanelPolarsEager
+    PanelGluontsList
+    PanelGluontsPandas
+
+
+``Hierarchical`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Hierarchical`` mtype represents a hierarchical collection of time series.
+
+.. currentmodule:: sktime.datatypes._hierarchical._check
+
+    HierarchicalPdMultiIndex
+    HierarchicalDask
+    HierarchicalPolarsEager
+
+
+``Table`` mtype specifications
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The ``Table`` mtype represents a (non-temporal) data frame table.
+
+.. currentmodule:: sktime.datatypes._table._check
+
+    TablePdDataFrame
+    TablePdSeries
+    TableNp1D
+    TableNp2D
+    TableListOfDict
+    TablePolarsEager
+    TableGluontsList
+    TableGluontsPandas
+
+
+Serialized File Format Specifications
+-------------------------------------
+
+``sktime`` supports a variety of file formats for serialized data,
+specific to storing time series data.
+
+Specifications for file formats specific to ``sktime`` are provided below:
 
 .. toctree::
     :maxdepth: 1
diff --git a/docs/source/api_reference/transformations.rst b/docs/source/api_reference/transformations.rst
index b9e8bc21d..07d7473ce 100644
--- a/docs/source/api_reference/transformations.rst
+++ b/docs/source/api_reference/transformations.rst
@@ -241,6 +241,14 @@ Auto-correlation-based features
 Moment-based features
 ~~~~~~~~~~~~~~~~~~~~~
 
+.. currentmodule:: sktime.transformations.series.signature
+
+.. autosummary::
+    :toctree: auto_generated/
+    :template: class.rst
+
+    SignatureMoments
+
 .. currentmodule:: sktime.transformations.panel.signature_based
 
 .. autosummary::
diff --git a/docs/source/developer_guide/git_workflow.rst b/docs/source/developer_guide/git_workflow.rst
index e3519d8c0..82bd7118e 100644
--- a/docs/source/developer_guide/git_workflow.rst
+++ b/docs/source/developer_guide/git_workflow.rst
@@ -10,15 +10,16 @@ GitHub, clone, and develop on a new branch.
 
 The workflow consists of two main parts:
 
-* **Creating a fork**: This sets up your own copy of the ``sktime`` repository on GitHub.
-  This needs to be done only once, when you start contributing to ``sktime``.
+* **Creating a fork and cloning the repository**: This section will help you set up your own forked copy of the ``sktime``
+repository on GitHub and a local copy of the forked repository on your machine. This needs to be done only once, when you
+start contributing to ``sktime``.
 * **Developing a feature**: This is the process of developing a new feature, e.g.,
   a bugfix or new estimator.
   This is done every time you want to contribute a new feature.
 
 
-Creating a fork - Initial one time setup
-----------------------------------------
+Creating a fork and cloning the repository - initial one time setup
+-------------------------------------------------------------------
 
 1.  Fork the `project
     repository <https://github.com/sktime/sktime>`__ by
@@ -57,8 +58,8 @@ Creating a fork - Initial one time setup
        > upstream  https://github.com/sktime/sktime.git (push)
 
 
-Contributing a feature - for every new feature
-----------------------------------------------
+Developing a feature - repeat for every new feature
+---------------------------------------------------
 
 1.  `Sync <https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork>`_
     the ``main`` branch of your fork with the upstream repository:
diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
index 500a440b3..4614913d3 100644
--- a/docs/source/glossary.rst
+++ b/docs/source/glossary.rst
@@ -26,7 +26,8 @@ sktime.
         ``Panel`` scitype. Data containers can be checked for compliance with
         a given mtype using the :func:`sktime.datatypes.check_is_mtype` function;
         all mtypes can be listed in ``sktime.datatypes.MTYPE_REGISTER``.
-        For more details on the general concept, see
+        For more details on the general concept, and precise specifications, see the
+        :ref:`data_format` and
         `the datatypes and datasets user guide :doc:</examples/AA_datatypes_and_datasets>`.
 
     scitype
@@ -48,6 +49,7 @@ sktime.
         the ``sktime.datatypes.check_is_scitype`` utility; for estimators, compliance
         is checked using ``sktime.utils.check_estimator``.
         For more details on data scitpyes, see :term:`mtype`.
+        For exact specifications of scitypes, see the :ref:`data_format`.
         For more details on estimator scitypes, see the user guides on individual
         learning tasks.
 
diff --git a/docs/source/installation.rst b/docs/source/installation.rst
index 09983e154..44c5af048 100644
--- a/docs/source/installation.rst
+++ b/docs/source/installation.rst
@@ -13,18 +13,23 @@ See here for a `full list of precompiled wheels available on PyPI <https://pypi.
 .. contents::
    :local:
 
-For frequent issues with installation, consult the `Release versions - troubleshooting`_ section.
+For frequent issues with installation, consult the `Troubleshooting`_ section.
 
-There are three different installation types:
+There are three different installation types, depending on your use case:
 
-* Installing sktime releases
-* Installing the latest sktime development version
-* For developers of sktime and 3rd party extensions: Developer setup
+* Installing stable ``sktime`` releases - for most users, for production environments
+* Installing the latest unstable ``sktime`` development version - for pre-release tests
+* For developers of ``sktime`` and 3rd party extensions: Developer setup for extensions and contributions
 
 Each of these three setups are explained below.
 
-Release versions
-----------------
+Installing release versions
+---------------------------
+
+For:
+
+* Most users
+* Use in production environments
 
 Installing sktime from PyPI
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -83,16 +88,23 @@ Note: not all soft dependencies of ``sktime`` are also available on ``conda-forg
 The other soft dependencies can be installed via ``pip``, after ``conda install pip``.
 
 
-Development version install
----------------------------
+Installing latest unstable development version
+----------------------------------------------
+
+For:
 
-Development versions of ``sktime`` are installs from static snapshots of the ``sktime`` repository.
+* pre-release tests, e.g., early testing of new features
+* not for reliable production use
+* not for contributors or extenders
 
-Installing development versions is useful for testing, but not recommended
-for development and contribution. For development and contribution, see the next section
-on full developer setup.
+This type of ``sktime`` installation obtains a latest static snapshot of the repository.
+It is intended for developers that wish to build or test code using a version of the library
+that contains the all of the latest and current updates.
 
-To install the latest development version of ``sktime``,
+.. note::
+    For an full editible developer setup, please read the section "Full developer setup for contributors and extension developers" below.
+
+To install the latest version of ``sktime`` directly from the repository,
 you can use the ``pip`` package manager to install directly from the GitHub repository:
 
 .. code-block:: bash
@@ -106,9 +118,11 @@ To install from a specific branch, use the following command:
 
     pip install git+https://github.com/sktime/sktime.git@<branch_name>
 
-Alternatively, a developer install can be obtained from a local clone of the repository.
+Alternatively, a latest version install can be obtained from a local clone of the repository.
+
+For steps on how to obtain a local clone of the repository, please follow the steps described here:
+:ref:`Creating a fork and cloning the repository <Creating a fork and cloning the repository - initial one time setup>`
 
-For this, follow Step 1 of the `full developer setup`_ below, and then install the package with:
 
 .. code-block:: bash
 
@@ -120,6 +134,12 @@ Alternatively, the ``.`` may be replaced with a full or relative path to the roo
 Full developer setup for contributors and extension developers
 --------------------------------------------------------------
 
+For whom:
+
+* contributors to the ``sktime`` project
+* developers of extensions in closed code bases
+* developers of 3rd party extensions released as open source
+
 To develop ``sktime`` locally, or to contribute to the project, you need to set up:
 
 * a local clone of the ``sktime`` repository.
@@ -127,16 +147,16 @@ To develop ``sktime`` locally, or to contribute to the project, you need to set
 
 The following steps guide you through the process:
 
-1. Follow the Git workflow: Fork and clone the repository as described in [Git and GitHub workflow](https://www.sktime.net/en/stable/developer_guide/git_workflow.html)
+1. Follow the Git workflow: :ref:`Creating a fork and cloning the repository <Creating a fork and cloning the repository - initial one time setup>`
 
-2. Set up a new virtual environment. Our instructions will go through the commands to set up a ``conda`` environment which is recommended for sktime development.
+2. Set up a new virtual environment. Our instructions will go through the commands to set up a ``conda`` environment, which tends to be beginner friendly.
 The process will be similar for ``venv`` or other virtual environment managers.
 
-  .. warning::
-       Using ``conda`` via one of the commercial distributions such as Anaconda
-       is in general not free for commercial use and may incur significant costs or liabilities.
-       Consider using free distributions and channels for package management,
-       and be aware of applicable terms and conditions.
+.. warning::
+    Using ``conda`` via one of the commercial distributions such as Anaconda
+    is in general not free for commercial use and may incur significant costs or liabilities.
+    Consider using free distributions and channels for package management,
+    and be aware of applicable terms and conditions.
 
 In the ``conda`` terminal:
 
diff --git a/extension_templates/detection.py b/extension_templates/detection.py
index 47106fcdd..b056e55e6 100644
--- a/extension_templates/detection.py
+++ b/extension_templates/detection.py
@@ -18,11 +18,11 @@ How to use this implementation template to implement a new estimator:
   https://www.sktime.net/en/stable/developer_guide/add_estimators.html
 
 Mandatory implements:
-    fitting         - _fit(self, X, Y=None)
+    fitting         - _fit(self, X, y=None)
     annotating     - _predict(self, X)
 
 Optional implements:
-    updating        - _update(self, X, Y=None)
+    updating        - _update(self, X, y=None)
 
 Testing - required for sktime test framework and check_estimator usage:
     get default parameters for test instance(s) - get_test_params()
@@ -30,13 +30,13 @@ Testing - required for sktime test framework and check_estimator usage:
 copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 # todo: add any necessary imports here
 
 
-class MySeriesAnnotator(BaseSeriesAnnotator):
-    """Custom series annotator.
+class MyDetector(BaseDetector):
+    """Custom time series detector for anomalies, change points, or segments.
 
     todo: write docstring, describing your custom forecaster
 
@@ -106,7 +106,7 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         #   self.clone_tags(est2, ["enforce_index_type", "handles-missing-data"])
 
     # todo: implement this, mandatory
-    def _fit(self, X, Y=None):
+    def _fit(self, X, y=None):
         """Fit to training data.
 
         core logic
@@ -114,13 +114,14 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            training data to fit model to, time series
-        Y : pd.Series, optional
-            ground truth annotations for training if annotator is supervised
+            Training data to fit model to time series.
+        y : pd.Series, optional
+            Ground truth labels for training, if detector is supervised.
 
         Returns
         -------
-        self : returns a reference to self
+        self :
+            Reference to self.
 
         State change
         ------------
@@ -138,12 +139,18 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
-        Y : pd.Series - annotations for sequence X
-            exact format depends on annotation type
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
         """
 
         # implement here
@@ -151,8 +158,8 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
 
     # todo: consider implementing this, optional
     # if not implementing, delete the _update method
-    def _update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
+    def _update(self, X, y=None):
+        """Update model with new data and optional ground truth labels.
 
         core logic
 
@@ -160,8 +167,8 @@ class MySeriesAnnotator(BaseSeriesAnnotator):
         ----------
         X : pd.DataFrame
             training data to update model with, time series
-        Y : pd.Series, optional
-            ground truth annotations for training if annotator is supervised
+        y : pd.Series, optional
+            ground truth detection labels for training, if detector is supervised
 
         Returns
         -------
diff --git a/pyproject.toml b/pyproject.toml
index 91cce55d2..af356b9a0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -93,7 +93,7 @@ all_extras = [
   'matplotlib!=3.9.1,>=3.3.2; python_version < "3.13"',
   'mne; python_version < "3.13"',
   'numba<0.61,>=0.53; python_version < "3.13"',
-  'optuna<4.1; python_version < "3.13"',
+  'optuna<4.2',
   'pmdarima!=1.8.1,<3.0.0,>=1.8; python_version < "3.12"',
   'polars[pandas]>=0.20,<2.0; python_version < "3.13"',
   'prophet>=1.1; python_version < "3.12"',
@@ -124,7 +124,7 @@ all_extras_pandas2 = [
   'autots<0.7,>=0.6.1; python_version < "3.13"',
   'cloudpickle; python_version < "3.13"',
   'dash!=2.9.0; python_version < "3.13"',
-  "dask<2024.10.1; extra == 'dataframe'",
+  "dask<2024.11.3; extra == 'dataframe'",
   'dtaidistance<2.4; python_version < "3.13"',
   'dtw-python; python_version < "3.13"',
   'esig==0.9.7; python_version < "3.10"',
@@ -137,7 +137,7 @@ all_extras_pandas2 = [
   'matplotlib!=3.9.1,>=3.3.2; python_version < "3.13"',
   'mne; python_version < "3.13"',
   'numba<0.61,>=0.53; python_version < "3.13"',
-  'optuna<4.1; python_version < "3.13"',
+  'optuna<4.2',
   'pmdarima!=1.8.1,<3.0.0,>=1.8; python_version < "3.12"',
   'polars[pandas]>=0.20,<2.0; python_version < "3.13"',
   'prophet>=1.1; python_version < "3.12"',
diff --git a/sktime/annotation/adapters/_pyod.py b/sktime/annotation/adapters/_pyod.py
index 68d749ea2..f59fb5e0a 100644
--- a/sktime/annotation/adapters/_pyod.py
+++ b/sktime/annotation/adapters/_pyod.py
@@ -5,7 +5,7 @@
 import numpy as np
 from sklearn.base import clone
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 from sktime.utils.dependencies import _check_soft_dependencies
 
 __author__ = ["mloning", "satya-pattnaik", "fkiraly"]
@@ -13,7 +13,7 @@ __author__ = ["mloning", "satya-pattnaik", "fkiraly"]
 import pandas as pd
 
 
-class PyODAnnotator(BaseSeriesAnnotator):
+class PyODAnnotator(BaseDetector):
     """Transformer that applies outlier detector from pyOD.
 
     Parameters
@@ -82,7 +82,8 @@ class PyODAnnotator(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/base/__init__.py b/sktime/annotation/base/__init__.py
index 2c6052ee4..3e1f6ec31 100644
--- a/sktime/annotation/base/__init__.py
+++ b/sktime/annotation/base/__init__.py
@@ -4,4 +4,4 @@
 
 __all__ = ["BaseSeriesAnnotator"]
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base._base import BaseSeriesAnnotator
diff --git a/sktime/annotation/base/_base.py b/sktime/annotation/base/_base.py
deleted file mode 100644
index fdb02dea6..000000000
--- a/sktime/annotation/base/_base.py
+++ /dev/null
@@ -1,733 +0,0 @@
-#!/usr/bin/env python3 -u
-# copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
-"""Base class template for annotator base type for time series stream.
-
-    class name: BaseSeriesAnnotator
-
-Scitype defining methods:
-    fitting              - fit(self, X, Y=None)
-    annotating           - predict(self, X)
-    updating (temporal)  - update(self, X, Y=None)
-    update&annotate      - update_predict(self, X)
-
-Inspection methods:
-    hyper-parameter inspection  - get_params()
-    fitted parameter inspection - get_fitted_params()
-
-State:
-    fitted model/strategy   - by convention, any attributes ending in "_"
-    fitted state flag       - check_is_fitted()
-"""
-
-__author__ = ["satya-pattnaik ", "fkiraly"]
-__all__ = ["BaseSeriesAnnotator"]
-
-import numpy as np
-import pandas as pd
-
-from sktime.base import BaseEstimator
-from sktime.utils.validation.series import check_series
-
-
-class BaseSeriesAnnotator(BaseEstimator):
-    """Base series annotator.
-
-    Developers should set the task and learning_type tags in the derived class.
-
-    task : str {"segmentation", "change_point_detection", "anomaly_detection"}
-        The main annotation task:
-        * If ``segmentation``, the annotator divides timeseries into discrete chunks
-        based on certain criteria. The same label can be applied at multiple
-        disconnected regions of the timeseries.
-        * If ``change_point_detection``, the annotator finds points where the
-        statistical properties of the timeseries change significantly.
-        * If ``anomaly_detection``, the annotator finds points that differ significantly
-        from the normal statistical properties of the timeseries.
-
-    learning_type : str {"supervised", "unsupervised"}
-        Annotation learning type:
-        * If ``supervised``, the annotator learns from labelled data.
-        * If ``unsupervised``, the annotator learns from unlabelled data.
-
-    Notes
-    -----
-    Assumes "predict" data is temporal future of "fit"
-    Single time series in both, no meta-data.
-
-    The base series annotator specifies the methods and method
-    signatures that all annotators have to implement.
-
-    Specific implementations of these methods is deferred to concrete
-    annotators.
-    """
-
-    _tags = {
-        "object_type": "series-annotator",  # type of object
-        "learning_type": "None",  # Tag to determine test in test_all_annotators
-        "task": "None",  # Tag to determine test in test_all_annotators
-        #
-        # todo: distribution_type? we may have to refactor this, seems very soecufuc
-        "distribution_type": "None",  # Tag to determine test in test_all_annotators
-    }  # for unit test cases
-
-    def __init__(self):
-        self._is_fitted = False
-
-        self._X = None
-        self._Y = None
-
-        task = self.get_tag("task")
-        learning_type = self.get_tag("learning_type")
-
-        super().__init__()
-
-        self.set_tags(**{"task": task, "learning_type": learning_type})
-
-    def __rmul__(self, other):
-        """Magic * method, return (left) concatenated AnnotatorPipeline.
-
-        Implemented for ``other`` being a transformer, otherwise returns
-        ``NotImplemented``.
-
-        Parameters
-        ----------
-        other: ``sktime`` transformer, must inherit from BaseTransformer
-            otherwise, ``NotImplemented`` is returned
-
-        Returns
-        -------
-        AnnotatorPipeline object,
-            concatenation of ``other`` (first) with ``self`` (last).
-            not nested, contains only non-AnnotatorPipeline ``sktime`` steps
-        """
-        from sktime.annotation.compose import AnnotatorPipeline
-        from sktime.transformations.base import BaseTransformer
-        from sktime.transformations.series.adapt import TabularToSeriesAdaptor
-        from sktime.utils.sklearn import is_sklearn_transformer
-
-        # we wrap self in a pipeline, and concatenate with the other
-        #   the TransformedTargetForecaster does the rest, e.g., dispatch on other
-        if isinstance(other, BaseTransformer):
-            self_as_pipeline = AnnotatorPipeline(steps=[self])
-            return other * self_as_pipeline
-        elif is_sklearn_transformer(other):
-            return TabularToSeriesAdaptor(other) * self
-        else:
-            return NotImplemented
-
-    def fit(self, X, Y=None):
-        """Fit to training data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to fit model to (time series).
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Creates fitted model that updates attributes ending in "_". Sets
-        _is_fitted flag to True.
-        """
-        X = check_series(X)
-
-        if Y is not None:
-            Y = check_series(Y)
-
-        self._X = X
-        self._Y = Y
-
-        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
-
-        self._fit(X=X, Y=Y)
-
-        # this should happen last
-        self._is_fitted = True
-
-        return self
-
-    def predict(self, X):
-        """Create annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        self.check_is_fitted()
-
-        X = check_series(X)
-
-        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
-
-        Y = self._predict(X=X)
-
-        return Y
-
-    def transform(self, X):
-        """Create annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X. The returned annotations will be in the dense
-            format.
-        """
-        Y = self.predict(X)
-        return self.sparse_to_dense(Y, X.index)
-
-    def predict_scores(self, X):
-        """Return scores for predicted annotations on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate (time series).
-
-        Returns
-        -------
-        Y : pd.Series
-            Scores for sequence X exact format depends on annotation type.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-        return self._predict_scores(X)
-
-    def update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with (time series).
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        self.check_is_fitted()
-
-        X = check_series(X)
-
-        if Y is not None:
-            Y = check_series(Y)
-
-        self._X = X.combine_first(self._X)
-
-        if Y is not None:
-            self._Y = Y.combine_first(self._Y)
-
-        self._update(X=X, Y=Y)
-
-        return self
-
-    def update_predict(self, X):
-        """Update model with new data and create annotations for it.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        X = check_series(X)
-
-        self.update(X=X)
-        Y = self.predict(X=X)
-
-        return Y
-
-    def fit_predict(self, X, Y=None):
-        """Fit to data, then predict it.
-
-        Fits model to X and Y with given annotation parameters
-        and returns the annotations made by the model.
-
-        Parameters
-        ----------
-        X : pd.DataFrame, pd.Series or np.ndarray
-            Data to be transformed
-        Y : pd.Series or np.ndarray, optional (default=None)
-            Target values of data to be predicted.
-
-        Returns
-        -------
-        self : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        # Non-optimized default implementation; override when a better
-        # method is possible for a given algorithm.
-        return self.fit(X, Y).predict(X)
-
-    def fit_transform(self, X, Y=None):
-        """Fit to data, then transform it.
-
-        Fits model to X and Y with given annotation parameters
-        and returns the annotations made by the model.
-
-        Parameters
-        ----------
-        X : pd.DataFrame, pd.Series or np.ndarray
-            Data to be transformed
-        Y : pd.Series or np.ndarray, optional (default=None)
-            Target values of data to be predicted.
-
-        Returns
-        -------
-        self : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        Y = self.fit_predict(X)
-        return self.sparse_to_dense(Y, index=X.index)
-
-    def _fit(self, X, Y=None):
-        """Fit to training data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to fit model to time series.
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        raise NotImplementedError("abstract method")
-
-    def _predict(self, X):
-        """Create annotations on test/deployment data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        raise NotImplementedError("abstract method")
-
-    def _predict_scores(self, X):
-        """Return scores for predicted annotations on test/deployment data.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            Annotations for sequence X exact format depends on annotation type.
-        """
-        raise NotImplementedError("abstract method")
-
-    def _update(self, X, Y=None):
-        """Update model with new data and optional ground truth annotations.
-
-        core logic
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Training data to update model with time series
-        Y : pd.Series, optional
-            Ground truth annotations for training if annotator is supervised.
-
-        Returns
-        -------
-        self :
-            Reference to self.
-
-        Notes
-        -----
-        Updates fitted model that updates attributes ending in "_".
-        """
-        # default/fallback: re-fit to all data
-        self._fit(self._X, self._Y)
-
-        return self
-
-    def predict_segments(self, X):
-        """Predict segments on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series with an index of intervals. Each interval is the range of a
-            segment and the corresponding value is the label of the segment.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-
-        task = self.get_tag("task")
-        if task in ["anomaly_detection", "change_point_detection"]:
-            return self.change_points_to_segments(
-                self.predict_points(X), start=X.index.min(), end=X.index.max()
-            )
-        elif task == "segmentation":
-            return self._predict_segments(X)
-
-    def predict_points(self, X):
-        """Predict changepoints/anomalies on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series whose values are the changepoints/anomalies in X.
-        """
-        self.check_is_fitted()
-        X = check_series(X)
-
-        task = self.get_tag("task")
-        if task in ["anomaly_detection", "change_point_detection"]:
-            return self._predict_points(X)
-        elif task == "segmentation":
-            return self.segments_to_change_points(self.predict_segments(X))
-
-    def _predict_segments(self, X):
-        """Predict segments on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series with an index of intervals. Each interval is the range of a
-            segment and the corresponding value is the label of the segment.
-        """
-        return self._predict(X)
-
-    def _predict_points(self, X):
-        """Predict changepoints/anomalies on test/deployment data.
-
-        Parameters
-        ----------
-        X : pd.DataFrame
-            Data to annotate, time series.
-
-        Returns
-        -------
-        Y : pd.Series
-            A series whose values are the changepoints/anomalies in X.
-        """
-        return self._predict(X)
-
-    @staticmethod
-    def sparse_to_dense(y_sparse, index):
-        """Convert the sparse output from an annotator to a dense format.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            * If ``y_sparse`` is a series with an index of intervals, it should
-              represent segments where each value of the series is label of a segment.
-              Unclassified intervals should be labelled -1. Segments must never have
-              the label 0.
-            * If the index of ``y_sparse`` is not a set of intervals, the values of the
-              series should represent the indexes of changepoints/anomalies.
-        index : array-like
-            Indices that are to be annotated according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with an index of ``index`` is returned.
-            * If ``y_sparse`` is a series of changepoints/anomalies then the returned
-              series is labelled 0 and 1 dependendy on whether the index is associated
-              with an anomaly/changepoint. Where 1 means anomaly/changepoint.
-            * If ``y_sparse`` is a series of segments then the returned series is
-              labelled depending on the segment its indexes fall into. Indexes that
-              fall into no segments are labelled -1.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> y_sparse = pd.Series([2, 5, 7])  # Indices of changepoints/anomalies
-        >>> index = range(0, 8)
-        >>> BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
-        0    0
-        1    0
-        2    1
-        3    0
-        4    0
-        5    1
-        6    0
-        7    1
-        dtype: int64
-        >>> y_sparse = pd.Series(
-        ...     [1, 2, 1],
-        ...     index=pd.IntervalIndex.from_arrays(
-        ...         [0, 4, 6], [4, 6, 10], closed="left"
-        ...     )
-        ... )
-        >>> index = range(10)
-        >>> BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
-        0    1
-        1    1
-        2    1
-        3    1
-        4    2
-        5    2
-        6    1
-        7    1
-        8    1
-        9    1
-        dtype: int64
-        """
-        if isinstance(y_sparse.index.dtype, pd.IntervalDtype):
-            # Segmentation case
-            y_dense = BaseSeriesAnnotator._sparse_segments_to_dense(y_sparse, index)
-            return y_dense
-        else:
-            # Anomaly/changepoint detection case
-            y_dense = BaseSeriesAnnotator._sparse_points_to_dense(y_sparse, index)
-            return y_dense
-
-    @staticmethod
-    def _sparse_points_to_dense(y_sparse, index):
-        """Label the indexes in ``index`` if they are in ``y_sparse``.
-
-        Parameters
-        ----------
-        y_sparse: pd.Series
-            The values of the series must be the indexes of changepoints/anomalies.
-        index: array-like
-            Array of indexes that are to be labelled according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with an index of ``index``. Its values are 1 if the index is in
-            y_sparse and 0 otherwise.
-        """
-        y_dense = pd.Series(np.zeros(len(index)), index=index, dtype="int64")
-        y_dense[y_sparse.values] = 1
-        return y_dense
-
-    @staticmethod
-    def _sparse_segments_to_dense(y_sparse, index):
-        """Find the label for each index in ``index`` from sparse segments.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            A sparse representation of segments. The index must be the pandas interval
-            datatype and the values must be the integer labels of the segments.
-        index : array-like
-            List of indexes that are to be labelled according to ``y_sparse``.
-
-        Returns
-        -------
-        pd.Series
-            A series with the same index as ``index`` where each index is labelled
-            according to ``y_sparse``. Indexes that do not fall within any index are
-            labelled -1.
-        """
-        if y_sparse.index.is_overlapping:
-            raise NotImplementedError(
-                "Cannot convert overlapping segments to a dense format yet."
-            )
-
-        interval_indexes = y_sparse.index.get_indexer(index)
-
-        # Negative indexes do not fall within any interval so they are ignored
-        interval_labels = y_sparse.iloc[
-            interval_indexes[interval_indexes >= 0]
-        ].to_numpy()
-
-        # -1 is used to represent points do not fall within a segment
-        labels_dense = interval_indexes.copy()
-        labels_dense[labels_dense >= 0] = interval_labels
-
-        y_dense = pd.Series(labels_dense, index=index)
-        return y_dense
-
-    @staticmethod
-    def dense_to_sparse(y_dense):
-        """Convert the dense output from an annotator to a sparse format.
-
-        Parameters
-        ----------
-        y_dense : pd.Series
-            * If ``y_sparse`` contains only 1's and 0's, the 1's represent change
-              points or anomalies.
-            * If ``y_sparse`` contains only contains integers greater than 0, it is an
-              an array of segments.
-
-        Returns
-        -------
-        pd.Series
-            * If ``y_sparse`` is a series of changepoints/anomalies, a pandas series
-              will be returned containing the indexes of the changepoints/anomalies
-            * If ``y_sparse`` is a series of segments, a series with an interval
-              datatype index will be returned. The values of the series will be the
-              labels of segments.
-        """
-        if 0 in y_dense.values:
-            # y_dense is a series of change points
-            change_points = np.where(y_dense.values != 0)[0]
-            return pd.Series(change_points)
-        else:
-            segment_start_indexes = np.where(y_dense.diff() != 0)[0]
-            segment_end_indexes = np.roll(segment_start_indexes, -1)
-
-            # The final index is always the end of a segment
-            segment_end_indexes[-1] = y_dense.index[-1]
-
-            segment_labels = y_dense.iloc[segment_start_indexes].to_numpy()
-            interval_index = pd.IntervalIndex.from_arrays(
-                segment_start_indexes, segment_end_indexes, closed="left"
-            )
-            y_sparse = pd.Series(segment_labels, index=interval_index)
-
-            # -1 represents unclassified regions so we remove them
-            y_sparse = y_sparse.loc[y_sparse != -1]
-            return y_sparse
-
-    @staticmethod
-    def change_points_to_segments(y_sparse, start=None, end=None):
-        """Convert an series of change point indexes to segments.
-
-        Parameters
-        ----------
-        y_sparse : pd.Series
-            A series containing the indexes of change points.
-        start : optional
-            Starting point of the first segment.
-        end : optional
-            Ending point of the last segment
-
-        Returns
-        -------
-        pd.Series
-            A series with an interval index indicating the start and end points of the
-            segments. The values of the series are the labels of the segments.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> change_points = pd.Series([1, 2, 5])
-        >>> BaseSeriesAnnotator.change_points_to_segments(change_points, 0, 7)
-        [0, 1)   -1
-        [1, 2)    1
-        [2, 5)    2
-        [5, 7)    3
-        dtype: int64
-        """
-        breaks = y_sparse.values
-
-        if start > breaks.min():
-            raise ValueError(
-                "The starting index must be before the first change point."
-            )
-        first_change_point = breaks.min()
-
-        if start is not None:
-            breaks = np.insert(breaks, 0, start)
-        if end is not None:
-            breaks = np.append(breaks, end)
-
-        index = pd.IntervalIndex.from_breaks(breaks, copy=True, closed="left")
-        segments = pd.Series(0, index=index)
-
-        in_range = index.left >= first_change_point
-
-        number_of_segments = in_range.sum()
-        segments.loc[in_range] = range(1, number_of_segments + 1)
-        segments.loc[~in_range] = -1
-
-        return segments
-
-    @staticmethod
-    def segments_to_change_points(y_sparse):
-        """Convert segments to change points.
-
-        Parameters
-        ----------
-        y_sparse : pd.DataFrame
-            A series of segments. The index must be the interval data type and the
-            values should be the integer labels of the segments.
-
-        Returns
-        -------
-        pd.Series
-            A series containing the indexes of the start of each segment.
-
-        Examples
-        --------
-        >>> import pandas as pd
-        >>> from sktime.annotation.base._base import BaseSeriesAnnotator
-        >>> segments = pd.Series(
-        ...     [3, -1, 2],
-        ...     index=pd.IntervalIndex.from_breaks([2, 5, 7, 9], closed="left")
-        ... )
-        >>> BaseSeriesAnnotator.segments_to_change_points(segments)
-        0    2
-        1    5
-        2    7
-        dtype: int64
-        """
-        change_points = pd.Series(y_sparse.index.left)
-        return change_points
diff --git a/sktime/annotation/bs.py b/sktime/annotation/bs.py
index ec9b339b8..0812021a9 100644
--- a/sktime/annotation/bs.py
+++ b/sktime/annotation/bs.py
@@ -5,12 +5,12 @@ from collections import deque
 import numpy as np
 import pandas as pd
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["Alex-JG3"]
 
 
-class BinarySegmentation(BaseSeriesAnnotator):
+class BinarySegmentation(BaseDetector):
     """Binary segmentation change point detector.
 
     This method finds change points by fitting piecewise constant functions to a
diff --git a/sktime/annotation/clasp.py b/sktime/annotation/clasp.py
index cc1bb4c61..738edc329 100644
--- a/sktime/annotation/clasp.py
+++ b/sktime/annotation/clasp.py
@@ -11,7 +11,7 @@ As described in
 }
 """
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["ermshaua", "patrickzib"]
 __all__ = ["ClaSPSegmentation", "find_dominant_window_sizes"]
@@ -175,7 +175,7 @@ def _segmentation(X, clasp, n_change_points=None, exclusion_radius=0.05):
     return np.array(change_points), np.array(profiles, dtype=object), np.array(scores)
 
 
-class ClaSPSegmentation(BaseSeriesAnnotator):
+class ClaSPSegmentation(BaseDetector):
     """ClaSP (Classification Score Profile) Segmentation.
 
     Using ClaSP for the CPD problem is straightforward: We first compute the profile
@@ -253,7 +253,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -273,7 +273,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -289,7 +289,7 @@ class ClaSPSegmentation(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/clust.py b/sktime/annotation/clust.py
index 76b4b7abd..abd1bbe6c 100644
--- a/sktime/annotation/clust.py
+++ b/sktime/annotation/clust.py
@@ -8,13 +8,13 @@ import pandas as pd
 from sklearn.base import clone
 from sklearn.cluster import KMeans
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["Ankit-1204"]
 __all__ = ["ClusterSegmenter"]
 
 
-class ClusterSegmenter(BaseSeriesAnnotator):
+class ClusterSegmenter(BaseDetector):
     """Cluster-based Time Series Segmentation.
 
     time series segmentation using clustering is simple task. This annotator
@@ -88,7 +88,8 @@ class ClusterSegmenter(BaseSeriesAnnotator):
 
         Parameters
         ----------
-        X : pd.DataFrame - data to annotate, time series
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/compose/_as_transform.py b/sktime/annotation/compose/_as_transform.py
index 1d107ca31..1fac78c13 100644
--- a/sktime/annotation/compose/_as_transform.py
+++ b/sktime/annotation/compose/_as_transform.py
@@ -22,11 +22,11 @@ class AnnotatorAsTransformer(BaseTransformer):
     into its cluster assignment.
 
     The adapter dispatches ``BaseTransformer.transform`` to
-    ``BaseSeriesAnnotator.transform``.
+    ``BaseDetector.transform``.
 
     Parameters
     ----------
-    estimator : sktime annotator, i.e., estimator inheriting from BaseSeriesAnnotator
+    estimator : sktime annotator, i.e., estimator inheriting from BaseDetector
         this is a "blueprint" clusterer, state does not change when ``fit`` is called
 
     Attributes
diff --git a/sktime/annotation/compose/_pipeline.py b/sktime/annotation/compose/_pipeline.py
index 0fa3c43f9..78097f613 100644
--- a/sktime/annotation/compose/_pipeline.py
+++ b/sktime/annotation/compose/_pipeline.py
@@ -1,11 +1,11 @@
 """Pipeline for time series annotators."""
 
-from sktime.annotation.base import BaseSeriesAnnotator
 from sktime.base import _HeterogenousMetaEstimator
+from sktime.detection.base import BaseDetector
 from sktime.registry import scitype
 
 
-class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
+class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseDetector):
     """Pipeline for time series anomaly, changepoint detection, segmentation.
 
     Parameters
@@ -302,7 +302,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -319,7 +319,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
@@ -336,7 +336,7 @@ class AnnotatorPipeline(_HeterogenousMetaEstimator, BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate, time series.
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/annotation/ggs.py b/sktime/annotation/ggs.py
index 3a1212526..679910444 100644
--- a/sktime/annotation/ggs.py
+++ b/sktime/annotation/ggs.py
@@ -41,7 +41,7 @@ import numpy.typing as npt
 import pandas as pd
 from sklearn.utils.validation import check_random_state
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 from sktime.utils.dependencies import _check_estimator_deps
 
 logger = logging.getLogger(__name__)
@@ -367,7 +367,7 @@ class GGS:
         return change_points
 
 
-class GreedyGaussianSegmentation(BaseSeriesAnnotator):
+class GreedyGaussianSegmentation(BaseDetector):
     """Greedy Gaussian Segmentation Estimator.
 
     The method approximates solutions for the problem of breaking a
diff --git a/sktime/annotation/hmm.py b/sktime/annotation/hmm.py
index 082e78e7a..a53c5a3d2 100644
--- a/sktime/annotation/hmm.py
+++ b/sktime/annotation/hmm.py
@@ -10,13 +10,13 @@ import warnings
 import numpy as np
 from scipy.stats import norm
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["miraep8"]
 __all__ = ["HMM"]
 
 
-class HMM(BaseSeriesAnnotator):
+class HMM(BaseDetector):
     """Implements a simple HMM fitted with Viterbi algorithm.
 
     The HMM annotation estimator uses the
diff --git a/sktime/annotation/hmm_learn/base.py b/sktime/annotation/hmm_learn/base.py
index 15dae8e89..29c537ce2 100644
--- a/sktime/annotation/hmm_learn/base.py
+++ b/sktime/annotation/hmm_learn/base.py
@@ -10,13 +10,13 @@ Please see the original library
 import numpy as np
 import pandas as pd
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 __author__ = ["miraep8"]
 __all__ = ["BaseHMMLearn"]
 
 
-class BaseHMMLearn(BaseSeriesAnnotator):
+class BaseHMMLearn(BaseDetector):
     """Base class for all HMM wrappers, handles required overlap between packages."""
 
     _tags = {
diff --git a/sktime/annotation/lof.py b/sktime/annotation/lof.py
index 909b5b76f..3b3acef56 100644
--- a/sktime/annotation/lof.py
+++ b/sktime/annotation/lof.py
@@ -8,10 +8,10 @@ import math
 import pandas as pd
 from sklearn.neighbors import LocalOutlierFactor
 
-from sktime.annotation.base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 
-class SubLOF(BaseSeriesAnnotator):
+class SubLOF(BaseDetector):
     """Timeseries version of local outlier factor.
 
     The LOF models are fit to windows timeseries data.
@@ -210,7 +210,7 @@ class SubLOF(BaseSeriesAnnotator):
         Parameters
         ----------
         X : pd.DataFrame
-            Data to annotate (time series).
+            Time series subject to detection, which will be assigned labels or scores.
 
         Returns
         -------
diff --git a/sktime/datatypes/_hierarchical/_check.py b/sktime/datatypes/_hierarchical/_check.py
index 32f9e7ea0..6305baa13 100644
--- a/sktime/datatypes/_hierarchical/_check.py
+++ b/sktime/datatypes/_hierarchical/_check.py
@@ -65,6 +65,45 @@ def _list_all_equal(obj):
 class HierarchicalPdMultiIndex(ScitypeHierarchical):
     """Data type: pandas.DataFrame based specification of hierarchical series.
 
+    Name: ``"pd_multiindex_hier"``
+
+    Short description:
+    a ``pandas.DataFrame``, with row multi-index,
+    last level interpreted as time, others as hierarchy, cols = variables
+
+    Long description:
+
+    The ``"pd_multiindex_hier"`` :term:`mtype` is a concrete specification
+    that implements the ``Hierarchical`` :term:`scitype`, i.e., the abstract
+    type of a hierarchically indexed collection of time series.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be a 3 or more level multi-index of type
+      ``(Index, ..., Index, t)``, where ``t`` is one of ``Int64Index``, ``RangeIndex``,
+      ``DatetimeIndex``, ``PeriodIndex`` and monotonic.
+      We call the last index the "time-like" index.
+    * hierarchy level: rows with the same non-time-like index values correspond to the
+      same hierarchy unit; rows with different non-time-like index combination
+      correspond to different hierarchy unit.
+    * hierarchy: the non-time-like indices in ``obj.index`` are interpreted as a
+      hierarchy identifying index.
+    * time index: the last element of tuples in ``obj.index`` is interpreted
+      as a time index.
+    * time points: rows of ``obj`` with the same ``"timepoints"`` index correspond
+      to the same time point; rows of ``obj`` with different ``"timepoints"`` index
+      correspond to the different time points.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+
+    Capabilities:
+
+    * can represent multivariate hierarchical series
+    * can represent unequally spaced hierarchical series
+    * can represent unequally supported hierarchical series
+    * cannot represent hierarchical series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_panel/_base.py b/sktime/datatypes/_panel/_base.py
index 58284aa90..db0d1642d 100644
--- a/sktime/datatypes/_panel/_base.py
+++ b/sktime/datatypes/_panel/_base.py
@@ -7,7 +7,39 @@ from sktime.datatypes._base import BaseDatatype
 
 
 class ScitypePanel(BaseDatatype):
-    """Panel data type. Represents a panel (flat collection) of time series.
+    r"""Panel data type. Represents a panel (flat collection) of time series.
+
+    The ``Panel`` data type is an abstract data type (= :term:`scitype`).
+
+    It represents an indexed collection of many single monotonously indexed sequences,
+    that is, an indexed collection of objects that follow the ``Series`` data type.
+
+    This including the sub-case of a panel of "time series" if the index is interpreted
+    as time.
+
+    Formally, an abstract ``Panel`` object that contains :math:`N` time series has:
+
+    * an index :math:`s_1, \dots, s_N`, with :math:`s_i` being an integer or
+      a categorical type, representing the series identifier, also called
+      "instance index" or "case index"
+    * individual time series :math:`S_i` for :math:`i = 1, \dots, N`, each being an
+      object of abstract ``Series`` type
+
+    The object :math:`S_i` is interpreted as the time series (or sequence) at
+    the instance index :math:`s_i`.
+
+    The indices :math:`s_i` are assumed distinct, but not necessarily ordered.
+
+    Concrete types implementing the ``Panel`` data type must specify:
+
+    * instances: how the different instances are represented
+    * instance names: optional, names of the instance dimensions
+    * variables: how the dimensions of the individual time series are represented
+    * variable names: optional, names of the variable dimensions
+    * time points: how time points are represented in the individual time series
+    * time index: how the time index is represented
+
+    Concrete implementations may implement only sub-cases of the full abstract type.
 
     Parameters
     ----------
diff --git a/sktime/datatypes/_panel/_check.py b/sktime/datatypes/_panel/_check.py
index b91912aa1..16cbb10a9 100644
--- a/sktime/datatypes/_panel/_check.py
+++ b/sktime/datatypes/_panel/_check.py
@@ -84,6 +84,45 @@ def _list_all_equal(obj):
 class PanelDfList(ScitypePanel):
     """Data type: list-of-pandas.DataFrame based specification of panel of time series.
 
+    Name: ``"df-list"``
+
+    Short description:
+
+    a ``list`` of ``pandas.DataFrame``,
+    with list index = instances, data frame rows = time points,
+    data frame cols = variables
+
+    Long description:
+
+    The ``"df-list"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: list`` follows the specification iff:
+
+    * structure convention: ``obj`` must be a list of ``pandas.DataFrames``.
+      Individual list elements of `obj` must follow the ``"pd.DataFrame"``
+      mtype convention for the ``"Series"`` scitype.
+    * instances: instances correspond to different list elements of ``obj``.
+    * instance index: the instance index of an instance is the list index at which
+      it is located in ``obj``. That is, the data at ``obj[i]``
+      correspond to observations of the instance with index ``i``.
+    * time points: rows of ``obj[i]`` correspond to different, distinct time points,
+      at which instance ``i`` is observed.
+    * time index: ``obj[i].index`` is interpreted as the time index for instance ``i``.
+    * variables: columns of ``obj[i]`` correspond to different variables available
+      for instance ``i``.
+    * variable names: column names ``obj[i].columns`` are the names of variables
+      available for instance ``i``.
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * can represent unequally spaced series
+    * can represent panels of unequally supported series
+    * can represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -210,6 +249,41 @@ def _check_dflist_panel(obj, return_metadata=False, var_name="obj"):
 class PanelNp3D(ScitypePanel):
     """Data type: 3D np.ndarray based specification of panel of time series.
 
+    Name: ``"numpy3D"``
+
+    Short description:
+
+    a 3D ``numpy.ndarray``,
+    with axis 0 = instances, axis 1 = variables, axis 2 = time points
+
+    Long description:
+
+    The ``"numpy3D"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: numpy.ndarray`` follows the specification iff:
+
+    * structure convention: ``obj`` must be 3D, i.e., ``obj.shape`` must have length 3.
+    * instances: instances correspond to axis 0 elements of ``obj``.
+    * instance index: the instance index is implicit and by-convention.
+      The ``i``-th element of axis 0 (for an integer ``i``) is interpreted as indicative
+      of observing instance `i`.
+    * variables: variables correspond to axis 1 elements of ``obj``.
+    * variable names: the ``"numpy3D"`` mtype cannot represent variable names.
+    * time points: time points correspond to axis 2 elements of ``obj``.
+    * time index: the time index is implicit and by-convention.
+      The ``i``-th element of axis 2 (for an integer ``i``) is interpreted
+      as an observation at the time point ``i``.
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * cannot represent unequally spaced series
+    * cannot represent panels of unequally supported series
+    * cannot represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -326,6 +400,45 @@ def _check_numpy3d_panel(obj, return_metadata=False, var_name="obj"):
 class PanelPdMultiIndex(ScitypePanel):
     """Data type: MultiIndex-ed pd.DataFrame specification of panel of time series.
 
+    Name: ``"pd-multiindex"``
+
+    Short description:
+
+    a ``pandas.DataFrame``, with row multi-index (instances, time), cols = variables
+
+    Long description:
+
+    The ``"pd-multiindex"`` :term:`mtype` is a concrete specification
+    that implements the ``Panel`` :term:`scitype`, i.e., the abstract
+    type of a collection of time series.
+
+    An object ``obj: pd.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be a pair multi-index of
+      type ``(Index, t)``, where ``t`` is one of ``Int64Index``, ``RangeIndex``,
+      ``DatetimeIndex``, ``PeriodIndex`` and monotonic.
+      ``obj.index`` must have two levels (can be named or not).
+    * instance index: the first element of pairs in ``obj.index`` (0-th level value)
+      is interpreted as an instance index, we call it "instance index" below.
+    * instances: rows with the same "instance index" index value correspond to the same
+      instance; rows with different "instance index" values correspond
+      to different instances.
+    * time index: the second element of pairs in ``obj.index`` (1-st level value)
+      is interpreted as a time index, we call it "time index" below.
+    * time points: rows of ``obj`` with the same "time index" value correspond
+      correspond to the same time point; rows of `obj` with different "time index"
+      index correspond correspond to the different time points.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+
+    Capabilities:
+
+    * can represent panels of multivariate series
+    * can represent unequally spaced series
+    * can represent panels of unequally supported series
+    * cannot represent panels of series with different sets of variables
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/datatypes/_series/_base.py b/sktime/datatypes/_series/_base.py
index dd5aca899..4469a6e3d 100644
--- a/sktime/datatypes/_series/_base.py
+++ b/sktime/datatypes/_series/_base.py
@@ -7,7 +7,35 @@ from sktime.datatypes._base import BaseDatatype
 
 
 class ScitypeSeries(BaseDatatype):
-    """Series data type. Represents a single time series.
+    r"""Series data type. Represents a single time series.
+
+    The ``Series`` data type is an abstract data type (= :term:`scitype`).
+
+    It represents a single monotonously indexed sequence, including the sub-case of
+    "time series" if the index is interpreted as time.
+
+    Formally, an abstract ``Series`` object has:
+
+    * an index :math:`t_1, \dots, t_T`, with :math:`t_i` being an integer or
+      an orderable datetime-like type, representing the time point (or index)
+    * values :math:`y_1, \dots, y_T`, with :math:`y_i`, taking values in
+      an abstract typed data frame row domain :math:`\mathcal{Y}`,
+      i.e., vectors with entries being numbers
+      (float, integer) or categorical, always the same type at the same entry
+
+    The value :math:`y_i` is interpreted to be "observed at time point" :math:`t_i`.
+
+    The indices are assumed distinct and ordered, i.e., `:math:t_{i-1} < t_i`
+    for all :math:`i`.
+
+    Concrete types implementing the ``Series`` data type must specify:
+
+    * variables: how the dimensions of :math:`\mathcal{Y}` are represented
+    * variable names: optional, names of the variable dimensions
+    * time points: how the value "observed at" a given time point is represented
+    * time index: how the time index is represented
+
+    Concrete implementations may implement only sub-cases of the full abstract type.
 
     Parameters
     ----------
diff --git a/sktime/datatypes/_series/_check.py b/sktime/datatypes/_series/_check.py
index 2bc13c312..101129a21 100644
--- a/sktime/datatypes/_series/_check.py
+++ b/sktime/datatypes/_series/_check.py
@@ -57,6 +57,34 @@ FREQ_SET_CHECK = False
 class SeriesPdDataFrame(ScitypeSeries):
     """Data type: pandas.DataFrame based specification of single time series.
 
+    Name: ``"pd.DataFrame"``
+
+    Short description:
+
+    a uni- or multivariate ``pandas.DataFrame``,
+    with rows = time points, cols = variables
+
+    Long description:
+
+    The ``"pd.DataFrame"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: pandas.DataFrame`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be monotonic,
+      and one of ``Int64Index``, ``RangeIndex``, ``DatetimeIndex``, ``PeriodIndex``.
+    * variables: columns of ``obj`` correspond to different variables
+    * variable names: column names ``obj.columns``
+    * time points: rows of ``obj`` correspond to different, distinct time points
+    * time index: ``obj.index`` is interpreted as the time index.
+
+    Capabilities:
+
+    * cannot represent multivariate series
+    * can represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -186,6 +214,36 @@ def _check_pddataframe_series(obj, return_metadata=False, var_name="obj"):
 class SeriesPdSeries(ScitypeSeries):
     """Data type: pandas.Series based specification of single time series.
 
+    Name: ``"pd.Series"``
+
+    Short description:
+
+    a (univariate) ``pandas.Series``,
+    with entries corresponding to different time points
+
+    Long description:
+
+    The ``"pd.Series"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: pandas.Series`` follows the specification iff:
+
+    * structure convention: ``obj.index`` must be monotonic,
+      and one of ``Int64Index``, ``RangeIndex``, ``DatetimeIndex``, ``PeriodIndex``.
+    * variables: there is a single variable, corresponding to the values of ``obj``.
+      Only univariate series can be represented.
+    * variable names: by default, there is no column name.
+      If needed, a variable name can be provided as ``obj.name``.
+    * time points: entries of ``obj`` correspond to different, distinct time points
+    * time index: ``obj.index`` is interpreted as a time index.
+
+    Capabilities:
+
+    * cannot represent multivariate series
+    * can represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
@@ -300,6 +358,36 @@ class SeriesPdSeries(ScitypeSeries):
 class SeriesNp2D(ScitypeSeries):
     """Data type: 2D np.ndarray based specification of single time series.
 
+    Name: ``"np.ndarray"``
+
+    Short description:
+
+    a 2D ``numpy.ndarray``, with rows = time points, cols = variables
+
+    Long description:
+
+    The ``"np.ndarray"`` :term:`mtype` is a concrete specification
+    that implements the ``Series`` :term:`scitype`, i.e., the abstract
+    type of a single time series.
+
+    An object ``obj: numpy.ndarray`` follows the specification iff:
+
+    * structure convention: ``obj`` must be 2D, i.e., ``obj.shape`` must have length 2.
+      This is also true for univariate time series.
+    * variables: variables correspond to columns of ``obj``.
+    * variable names: the ``"np.ndarray"`` mtype cannot represent variable names.
+    * time points: the rows of ``obj`` correspond to different, distinct time points.
+    * time index: The time index is implicit and by-convention.
+      The ``i``-th row (for an integer ``i``) is interpreted as an observation
+      at the time point ``i``. That is, the index is always interpreted as zero-indexed
+      integer.
+
+    Capabilities:
+
+    * can represent multivariate series
+    * cannot represent unequally spaced series
+    * can represent missing values
+
     Parameters
     ----------
     is_univariate: bool
diff --git a/sktime/detection/base/__init__.py b/sktime/detection/base/__init__.py
index 220fa717e..f38ab92b3 100644
--- a/sktime/detection/base/__init__.py
+++ b/sktime/detection/base/__init__.py
@@ -2,6 +2,6 @@
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
 """Implements base classes for detection tasks in sktime."""
 
-__all__ = ["BaseSeriesAnnotator"]
+__all__ = ["BaseDetector", "BaseSeriesAnnotator"]
 
-from sktime.detection.base._base import BaseSeriesAnnotator
+from sktime.detection.base._base import BaseDetector, BaseSeriesAnnotator
diff --git a/sktime/detection/base/_base.py b/sktime/detection/base/_base.py
index c063e1e52..a85d441c1 100644
--- a/sktime/detection/base/_base.py
+++ b/sktime/detection/base/_base.py
@@ -1,6 +1,905 @@
 #!/usr/bin/env python3 -u
 # copyright: sktime developers, BSD-3-Clause License (see LICENSE file)
+"""Base class template for detector base type for time series streams.
 
-__all__ = ["BaseSeriesAnnotator"]
+    class name: BaseDetector
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+Scitype defining methods:
+    fitting              - fit(self, X, y=None)
+    annotating           - predict(self, X)
+    updating (temporal)  - update(self, X, y=None)
+    update&annotate      - update_predict(self, X, y=None)
+
+Inspection methods:
+    hyper-parameter inspection  - get_params()
+    fitted parameter inspection - get_fitted_params()
+
+State:
+    fitted model/strategy   - by convention, any attributes ending in "_"
+    fitted state flag       - check_is_fitted()
+"""
+
+# todo 0.37.0: remove BaseSeriesAnnotator
+__author__ = ["fkiraly", "tveten", "alex-jg3", "satya-pattnaik"]
+__all__ = ["BaseDetector", "BaseSeriesAnnotator"]
+
+import numpy as np
+import pandas as pd
+
+from sktime.base import BaseEstimator
+from sktime.utils.validation.series import check_series
+from sktime.utils.warnings import warn
+
+
+class BaseDetector(BaseEstimator):
+    """Base class for time series detectors.
+
+    Developers should set the task and learning_type tags in the derived class.
+
+    task : str {"segmentation", "change_point_detection", "anomaly_detection"}
+        The main detection task:
+
+        * If ``segmentation``, the detector divides timeseries into discrete chunks
+        based on certain criteria. The same label can be applied at multiple
+        disconnected regions of the timeseries.
+        * If ``change_point_detection``, the detector finds points where the
+        statistical properties of the timeseries change significantly.
+        * If ``anomaly_detection``, the detector finds points that differ significantly
+        from the normal statistical properties of the timeseries.
+
+    learning_type : str {"supervised", "unsupervised"}
+        Detection learning type:
+
+        * If ``supervised``, the detector learns from labelled data.
+        * If ``unsupervised``, the detector learns from unlabelled data.
+
+    Notes
+    -----
+    Assumes "predict" data is temporal future of "fit"
+    Single time series in both, no meta-data.
+
+    The base series detector specifies the methods and method
+    signatures that all detectors have to implement.
+
+    Specific implementations of these methods is deferred to concrete detectors.
+    """
+
+    _tags = {
+        "object_type": "series-annotator",  # type of object
+        "learning_type": "None",  # Tag to determine test in test_all_annotators
+        "task": "None",  # Tag to determine test in test_all_annotators
+        #
+        # todo: distribution_type? we may have to refactor this, seems very soecufuc
+        "distribution_type": "None",  # Tag to determine test in test_all_annotators
+        "X_inner_mtype": "pd.DataFrame",  # Tag to determine test in test_all_annotators
+    }
+
+    def __init__(self):
+        self._is_fitted = False
+
+        self._X = None
+        self._Y = None
+
+        task = self.get_tag("task")
+        learning_type = self.get_tag("learning_type")
+
+        super().__init__()
+
+        self.set_tags(**{"task": task, "learning_type": learning_type})
+
+    def __rmul__(self, other):
+        """Magic * method, return (left) concatenated AnnotatorPipeline.
+
+        Implemented for ``other`` being a transformer, otherwise returns
+        ``NotImplemented``.
+
+        Parameters
+        ----------
+        other: ``sktime`` transformer, must inherit from BaseTransformer
+            otherwise, ``NotImplemented`` is returned
+
+        Returns
+        -------
+        AnnotatorPipeline object,
+            concatenation of ``other`` (first) with ``self`` (last).
+            not nested, contains only non-AnnotatorPipeline ``sktime`` steps
+        """
+        from sktime.annotation.compose import AnnotatorPipeline
+        from sktime.transformations.base import BaseTransformer
+        from sktime.transformations.series.adapt import TabularToSeriesAdaptor
+        from sktime.utils.sklearn import is_sklearn_transformer
+
+        # we wrap self in a pipeline, and concatenate with the other
+        #   the TransformedTargetForecaster does the rest, e.g., dispatch on other
+        if isinstance(other, BaseTransformer):
+            self_as_pipeline = AnnotatorPipeline(steps=[self])
+            return other * self_as_pipeline
+        elif is_sklearn_transformer(other):
+            return TabularToSeriesAdaptor(other) * self
+        else:
+            return NotImplemented
+
+    # todo 0.37.0: remove the Y parameter and related handling
+    def fit(self, X, y=None, Y=None):
+        """Fit to training data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to fit model to (time series).
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Creates fitted model that updates attributes ending in "_". Sets
+        _is_fitted flag to True.
+        """
+        X_inner = self._check_X(X)
+
+        if Y is not None:
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                "Until the 0.37.0 release, the Y parameter will be used if "
+                "no y parameter is provided, ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+
+        if Y is not None and y is None:
+            y = Y
+
+        self._X = X
+        self._y = y
+
+        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
+
+        if _method_has_arg(self._fit, "y"):
+            self._fit(X=X, y=y)
+        elif _method_has_arg(self._fit, "Y"):
+            self._fit(X=X, Y=y)
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                f"The class {self.__class__.__name__} uses the Y parameter "
+                "internally in _fit, this should be replaced with y by a maintainer. "
+                f"Until the 0.37.0 release, this will raise no exceptions, "
+                "ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+        else:
+            self._fit(X=X_inner)
+
+        # this should happen last
+        self._is_fitted = True
+
+        return self
+
+    def predict(self, X):
+        """Create labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        # fkiraly: insert checks/conversions here, after PR #1012 I suggest
+
+        y = self._predict(X=X_inner)
+
+        return y
+
+    def transform(self, X):
+        """Create labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.DataFrame with same index as X
+            Labels for sequence ``X``.
+
+            * If ``task`` is ``"anomaly_detection"``, the values are integer labels.
+              A value of 0 indicatesthat ``X``, at the same time index, has no anomaly.
+              Other values indicate an anomaly.
+              Most detectors will return 0 or 1, but some may return more values,
+              if they can detect different types of anomalies.
+              indicating whether ``X``, at the same
+              index, is an anomaly, 0 for no, 1 for yes.
+            * If ``task`` is ``"changepoint_detection"``, the values are integer labels,
+              indicating labels for segments between changepoints.
+              Possible labels are integers starting from 0.
+            * If ``task`` is "segmentation", the values are integer labels of the
+              segments. Possible labels are integers starting from 0.
+        """
+        y = self.predict(X)
+        return self.sparse_to_dense(y, X.index)
+
+    def transform_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to label (time series).
+
+        Returns
+        -------
+        scores : pd.DataFrame with same index as X
+            Scores for sequence ``X``.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        return self._transform_scores(X_inner)
+
+    def predict_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to label (time series).
+
+        Returns
+        -------
+        scores : pd.DataFrame with same index as return of predict
+            Scores for prediction of sequence ``X``.
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        return self._predict_scores(X_inner)
+
+    def update(self, X, y=None, Y=None):
+        """Update model with new data and optional ground truth labels.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to update model with (time series).
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        self.check_is_fitted()
+
+        X_inner = self._check_X(X)
+
+        if Y is not None:
+            warn(
+                "Warning: the Y parameter in detection/annotation algorithms "
+                "is deprecated and will be removed in the 0.37.0 release. "
+                "Users should use the y parameter instead. "
+                "Until the 0.37.0 release, the Y parameter will be used if "
+                "no y parameter is provided, ensuring backwards compatibility.",
+                stacklevel=2,
+            )
+
+        if y is None and Y is not None:
+            y = Y
+
+        self._X = X_inner.combine_first(self._X)
+
+        if y is not None:
+            self._y = y.combine_first(self._y)
+
+        if _method_has_arg(self._update, "y"):
+            self._update(X=X_inner, y=y)
+        elif _method_has_arg(self._update, "Y"):
+            self._update(X=X_inner, Y=y)
+        else:
+            self._update(X=X_inner)
+
+        return self
+
+    def update_predict(self, X, y=None):
+        """Update model with new data and create labels for it.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Training data to update model with, time series.
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        X_inner = self._check_X(X)
+
+        self.update(X=X, y=y)
+        y = self.predict(X=X_inner)
+
+        return y
+
+    # todo 0.37.0: remove Y argument
+    def fit_predict(self, X, y=None, Y=None):
+        """Fit to data, then predict it.
+
+        Fits model to X and Y with given detection parameters
+        and returns the detection labels produced by the model.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+        y : pd.Series or np.ndarray, optional (default=None)
+            Target values of data to be predicted.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are ``pd.Interval`` objects.
+        """
+        # Non-optimized default implementation; override when a better
+        # method is possible for a given algorithm.
+        return self.fit(X, y=y, Y=Y).predict(X)
+
+    # todo 0.37.0: remove Y argument
+    def fit_transform(self, X, y=None, Y=None):
+        """Fit to data, then transform it.
+
+        Fits model to X and Y with given detection parameters
+        and returns the detection labels made by the model.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+        Y : pd.Series or np.ndarray, optional (default=None)
+            Target values of data to be predicted.
+
+        Returns
+        -------
+        y : pd.DataFrame with same index as X
+            Labels for sequence ``X``.
+
+            * If ``task`` is ``"anomaly_detection"``, the values are integer labels.
+              A value of 0 indicatesthat ``X``, at the same time index, has no anomaly.
+              Other values indicate an anomaly.
+              Most detectors will return 0 or 1, but some may return more values,
+              if they can detect different types of anomalies.
+              indicating whether ``X``, at the same
+              index, is an anomaly, 0 for no, 1 for yes.
+            * If ``task`` is ``"changepoint_detection"``, the values are integer labels,
+              indicating labels for segments between changepoints.
+              Possible labels are integers starting from 0.
+            * If ``task`` is "segmentation", the values are integer labels of the
+              segments. Possible labels are integers starting from 0.
+        """
+        y = self.fit_predict(X, y=y, Y=Y)
+        return self.sparse_to_dense(y, index=X.index)
+
+    def _check_X(self, X):
+        """Check input data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame, pd.Series or np.ndarray
+            Data to be transformed
+
+        Returns
+        -------
+        X : X_inner_mtype
+            Data to be transformed
+        """
+        return X
+        # this causes errors, we need to investigate
+        # X_inner_mtype = self.get_tag("X_inner_mtype")
+        # X_inner = convert_to(X, X_inner_mtype)
+        # return X_inner
+
+    def _fit(self, X, y=None):
+        """Fit to training data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Training data to fit model to time series.
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        raise NotImplementedError("abstract method")
+
+    def _predict(self, X):
+        """Create labels on test/deployment data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+        """
+        raise NotImplementedError("abstract method")
+
+    def _predict_scores(self, X):
+        """Return scores for predicted labels on test/deployment data.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            Labels for sequence X exact format depends on detection type.
+        """
+        raise NotImplementedError("abstract method")
+
+    def _update(self, X, y=None):
+        """Update model with new data and optional ground truth labels.
+
+        core logic
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Training data to update model with time series
+        y : pd.Series, optional
+            Ground truth labels for training if detector is supervised.
+
+        Returns
+        -------
+        self :
+            Reference to self.
+
+        Notes
+        -----
+        Updates fitted model that updates attributes ending in "_".
+        """
+        # default/fallback: re-fit to all data
+        self._fit(self._X, self._y)
+
+        return self
+
+    def predict_segments(self, X):
+        """Predict segments on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with IntervalIndex
+            A series with an index of intervals. Each interval is the range of a
+            segment and the corresponding value is the label of the segment.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the intervals are intervals between changepoints/anomalies, and
+              the labels are consecutive integers starting from 0.
+            * If ``task`` is "segmentation", the values are segmentation labels.
+        """
+        self.check_is_fitted()
+        X = check_series(X)
+
+        task = self.get_tag("task")
+        if task in ["anomaly_detection", "change_point_detection"]:
+            return self.change_points_to_segments(
+                self.predict_points(X), start=X.index.min(), end=X.index.max()
+            )
+        elif task == "segmentation":
+            return self._predict_segments(X)
+
+    def predict_points(self, X):
+        """Predict changepoints/anomalies on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        y : pd.Series with RangeIndex
+            Labels for sequence ``X``, in sparse format.
+            Values are ``iloc`` references to indices of ``X``.
+
+            * If ``task`` is ``"anomaly_detection"`` or ``"change_point_detection"``,
+              the values are integer indices of the changepoints/anomalies.
+            * If ``task`` is "segmentation", the values are consecutive
+              segment boundaries.
+        """
+        self.check_is_fitted()
+        X = check_series(X)
+
+        task = self.get_tag("task")
+        if task in ["anomaly_detection", "change_point_detection"]:
+            return self._predict_points(X)
+        elif task == "segmentation":
+            return self.segments_to_change_points(self.predict_segments(X))
+
+    def _predict_segments(self, X):
+        """Predict segments on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            A series with an index of intervals. Each interval is the range of a
+            segment and the corresponding value is the label of the segment.
+        """
+        return self._predict(X)
+
+    def _predict_points(self, X):
+        """Predict changepoints/anomalies on test/deployment data.
+
+        Parameters
+        ----------
+        X : pd.DataFrame
+            Time series subject to detection, which will be assigned labels or scores.
+
+        Returns
+        -------
+        Y : pd.Series
+            A series whose values are the changepoints/anomalies in X.
+        """
+        return self._predict(X)
+
+    @staticmethod
+    def sparse_to_dense(y_sparse, index):
+        """Convert the sparse output from an detector to a dense format.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            * If ``y_sparse`` is a series with an index of intervals, it should
+              represent segments where each value of the series is label of a segment.
+              Unclassified intervals should be labelled -1. Segments must never have
+              the label 0.
+            * If the index of ``y_sparse`` is not a set of intervals, the values of the
+              series should represent the indexes of changepoints/anomalies.
+        index : array-like
+            Indices that are to be annotated according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with an index of ``index`` is returned.
+            * If ``y_sparse`` is a series of changepoints/anomalies then the returned
+              series is labelled 0 and 1 dependendy on whether the index is associated
+              with an anomaly/changepoint. Where 1 means anomaly/changepoint.
+            * If ``y_sparse`` is a series of segments then the returned series is
+              labelled depending on the segment its indexes fall into. Indexes that
+              fall into no segments are labelled -1.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> y_sparse = pd.Series([2, 5, 7])  # Indices of changepoints/anomalies
+        >>> index = range(0, 8)
+        >>> BaseDetector.sparse_to_dense(y_sparse, index=index)
+        0    0
+        1    0
+        2    1
+        3    0
+        4    0
+        5    1
+        6    0
+        7    1
+        dtype: int64
+        >>> y_sparse = pd.Series(
+        ...     [1, 2, 1],
+        ...     index=pd.IntervalIndex.from_arrays(
+        ...         [0, 4, 6], [4, 6, 10], closed="left"
+        ...     )
+        ... )
+        >>> index = range(10)
+        >>> BaseDetector.sparse_to_dense(y_sparse, index=index)
+        0    1
+        1    1
+        2    1
+        3    1
+        4    2
+        5    2
+        6    1
+        7    1
+        8    1
+        9    1
+        dtype: int64
+        """
+        if isinstance(y_sparse.index.dtype, pd.IntervalDtype):
+            # Segmentation case
+            y_dense = BaseDetector._sparse_segments_to_dense(y_sparse, index)
+            return y_dense
+        else:
+            # Anomaly/changepoint detection case
+            y_dense = BaseDetector._sparse_points_to_dense(y_sparse, index)
+            return y_dense
+
+    @staticmethod
+    def _sparse_points_to_dense(y_sparse, index):
+        """Label the indexes in ``index`` if they are in ``y_sparse``.
+
+        Parameters
+        ----------
+        y_sparse: pd.Series
+            The values of the series must be the indexes of changepoints/anomalies.
+        index: array-like
+            Array of indexes that are to be labelled according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with an index of ``index``. Its values are 1 if the index is in
+            y_sparse and 0 otherwise.
+        """
+        y_dense = pd.Series(np.zeros(len(index)), index=index, dtype="int64")
+        y_dense[y_sparse.values] = 1
+        return y_dense
+
+    @staticmethod
+    def _sparse_segments_to_dense(y_sparse, index):
+        """Find the label for each index in ``index`` from sparse segments.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            A sparse representation of segments. The index must be the pandas interval
+            datatype and the values must be the integer labels of the segments.
+        index : array-like
+            List of indexes that are to be labelled according to ``y_sparse``.
+
+        Returns
+        -------
+        pd.Series
+            A series with the same index as ``index`` where each index is labelled
+            according to ``y_sparse``. Indexes that do not fall within any index are
+            labelled -1.
+        """
+        if y_sparse.index.is_overlapping:
+            raise NotImplementedError(
+                "Cannot convert overlapping segments to a dense format yet."
+            )
+
+        interval_indexes = y_sparse.index.get_indexer(index)
+
+        # Negative indexes do not fall within any interval so they are ignored
+        interval_labels = y_sparse.iloc[
+            interval_indexes[interval_indexes >= 0]
+        ].to_numpy()
+
+        # -1 is used to represent points do not fall within a segment
+        labels_dense = interval_indexes.copy()
+        labels_dense[labels_dense >= 0] = interval_labels
+
+        y_dense = pd.Series(labels_dense, index=index)
+        return y_dense
+
+    @staticmethod
+    def dense_to_sparse(y_dense):
+        """Convert the dense output from an detector to a sparse format.
+
+        Parameters
+        ----------
+        y_dense : pd.Series
+            * If ``y_sparse`` contains only 1's and 0's, the 1's represent change
+              points or anomalies.
+            * If ``y_sparse`` contains only contains integers greater than 0, it is an
+              an array of segments.
+
+        Returns
+        -------
+        pd.Series
+            * If ``y_sparse`` is a series of changepoints/anomalies, a pandas series
+              will be returned containing the indexes of the changepoints/anomalies
+            * If ``y_sparse`` is a series of segments, a series with an interval
+              datatype index will be returned. The values of the series will be the
+              labels of segments.
+        """
+        if 0 in y_dense.values:
+            # y_dense is a series of change points
+            change_points = np.where(y_dense.values != 0)[0]
+            return pd.Series(change_points)
+        else:
+            segment_start_indexes = np.where(y_dense.diff() != 0)[0]
+            segment_end_indexes = np.roll(segment_start_indexes, -1)
+
+            # The final index is always the end of a segment
+            segment_end_indexes[-1] = y_dense.index[-1]
+
+            segment_labels = y_dense.iloc[segment_start_indexes].to_numpy()
+            interval_index = pd.IntervalIndex.from_arrays(
+                segment_start_indexes, segment_end_indexes, closed="left"
+            )
+            y_sparse = pd.Series(segment_labels, index=interval_index)
+
+            # -1 represents unclassified regions so we remove them
+            y_sparse = y_sparse.loc[y_sparse != -1]
+            return y_sparse
+
+    @staticmethod
+    def change_points_to_segments(y_sparse, start=None, end=None):
+        """Convert an series of change point indexes to segments.
+
+        Parameters
+        ----------
+        y_sparse : pd.Series
+            A series containing the indexes of change points.
+        start : optional
+            Starting point of the first segment.
+        end : optional
+            Ending point of the last segment
+
+        Returns
+        -------
+        pd.Series
+            A series with an interval index indicating the start and end points of the
+            segments. The values of the series are the labels of the segments.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> change_points = pd.Series([1, 2, 5])
+        >>> BaseDetector.change_points_to_segments(change_points, 0, 7)
+        [0, 1)   -1
+        [1, 2)    1
+        [2, 5)    2
+        [5, 7)    3
+        dtype: int64
+        """
+        breaks = y_sparse.values
+
+        if start > breaks.min():
+            raise ValueError(
+                "The starting index must be before the first change point."
+            )
+        first_change_point = breaks.min()
+
+        if start is not None:
+            breaks = np.insert(breaks, 0, start)
+        if end is not None:
+            breaks = np.append(breaks, end)
+
+        index = pd.IntervalIndex.from_breaks(breaks, copy=True, closed="left")
+        segments = pd.Series(0, index=index)
+
+        in_range = index.left >= first_change_point
+
+        number_of_segments = in_range.sum()
+        segments.loc[in_range] = range(1, number_of_segments + 1)
+        segments.loc[~in_range] = -1
+
+        return segments
+
+    @staticmethod
+    def segments_to_change_points(y_sparse):
+        """Convert segments to change points.
+
+        Parameters
+        ----------
+        y_sparse : pd.DataFrame
+            A series of segments. The index must be the interval data type and the
+            values should be the integer labels of the segments.
+
+        Returns
+        -------
+        pd.Series
+            A series containing the indexes of the start of each segment.
+
+        Examples
+        --------
+        >>> import pandas as pd
+        >>> from sktime.detection.base import BaseDetector
+        >>> segments = pd.Series(
+        ...     [3, -1, 2],
+        ...     index=pd.IntervalIndex.from_breaks([2, 5, 7, 9], closed="left")
+        ... )
+        >>> BaseDetector.segments_to_change_points(segments)
+        0    2
+        1    5
+        2    7
+        dtype: int64
+        """
+        change_points = pd.Series(y_sparse.index.left)
+        return change_points
+
+
+class BaseSeriesAnnotator(BaseDetector):
+    """Base class for time series detectors - DEPRECATED - use BaseDetector instead."""
+
+    def __init__(self):
+        super().__init__()
+        warn(
+            "Warning: BaseSeriesAnnotator is deprecated. "
+            "Extension developers should use BaseDetector instead, "
+            "from sktime.detection.base, this is a replacement with "
+            "equivalent functionality. "
+            "The BaseSeriesAnnotator will be removed in the 0.37.0 release.",
+            stacklevel=2,
+        )
+
+
+# todo 0.37.0: remove this
+def _method_has_arg(method, arg="y"):
+    """Return if transformer.method has a parameter, and whether it has a default.
+
+    Parameters
+    ----------
+    method : callable
+        method to check
+    arg : str, optional, default="y"
+        parameter name to check
+
+    Returns
+    -------
+    has_param : bool
+        whether the method ``method`` has a parameter with name ``arg``
+    """
+    from inspect import signature
+
+    method_params = list(signature(method).parameters.keys())
+    return arg in method_params
diff --git a/sktime/registry/_base_classes.py b/sktime/registry/_base_classes.py
index 05f72c9b2..4ac44c56e 100644
--- a/sktime/registry/_base_classes.py
+++ b/sktime/registry/_base_classes.py
@@ -272,9 +272,9 @@ class series_annotator(_BaseScitypeOfObject):
 
     @classmethod
     def get_base_class(cls):
-        from sktime.annotation.base import BaseSeriesAnnotator
+        from sktime.detection.base import BaseDetector
 
-        return BaseSeriesAnnotator
+        return BaseDetector
 
 
 class splitter(_BaseScitypeOfObject):
diff --git a/sktime/transformations/series/signature.py b/sktime/transformations/series/signature.py
new file mode 100644
index 000000000..6493c3b65
--- /dev/null
+++ b/sktime/transformations/series/signature.py
@@ -0,0 +1,175 @@
+"""Signature moment transformer."""
+
+import numpy as np
+import pandas as pd
+
+from sktime.transformations.base import BaseTransformer
+
+
+class SignatureMoments(BaseTransformer):
+    """Signature Moments Transformer for multivariate time series.
+
+    Computes time ordered signature moments for uni- and multivariate time series.
+
+    Pipelining ``Differencer() * SignatureMoments()`` can be used to
+    obtain the discrete path signature.
+
+    For a degree ``d``, the columns of the ``transform`` output are
+    strings corresponding to strings of length ``d`` over the alphabet
+    ``{[0], ..., [str(n_channels - 1)]}``,
+    where ``n_channels`` is the number of
+    variables in the time series, and the character ``i`` represents the
+    ``i``-th variable.
+
+    If ``use_index=True``, the time index is included as an additional
+    dimension, and is represented by the character ``[n_channels]``.
+
+    For a time series :math:`X` with ``n_channels`` variables, the signature moment
+    for a string :math:`s = i_1 i_2 ... i_d` is the arithmetic mean of the products
+
+    .. math:: X_{i_1}(t_1) X_{i_2}(t_2) ... X_{i_d}(t_d)
+
+    where :math:`t_1 < t_2 < ... < t_d` are the time indices.
+
+    If ``normalize_prod=True``, the signature moment is computed as the arithmetic
+    mean of the geometric means instead, i.e., of
+
+    .. math:: (X_{i_1}(t_1) X_{i_2}(t_2) ... X_{i_d}(t_d))^{1/d}
+
+    This ensures that all signature moments are of the same unit as the input data.
+
+    Parameters
+    ----------
+    degree: int, default=2
+        The maximum length of the string-based signature elements to include.
+        Degree can be upto 3.
+
+    use_index: bool, default=True
+        Whether to include the time index as an additional dimension.
+
+    normalize_prod: bool, default=False
+        If True, uses geometric mean instead of product for the signature moment,
+        see above for formula.
+        If False, uses product.
+
+    Examples
+    --------
+    >>> from sktime.transformations.series.signature import SignatureMoments
+    >>> from sktime.datasets import load_airline
+    >>> y = load_airline()
+    >>> transformer = SignatureMoments(degree=2, use_index=True)
+    >>> Xt = transformer.fit_transform(y)
+    """
+
+    _tags = {
+        "authors": ["VectorNd", "fkiraly"],
+        "maintainers": "VectorNd",
+        "scitype:transform-input": "Series",
+        "scitype:transform-output": "Primitives",
+        "scitype:instancewise": True,
+        "X_inner_mtype": "np.ndarray",
+        "y_inner_mtype": "None",
+        "fit_is_empty": True,
+    }
+
+    def __init__(self, degree=2, use_index=True, normalize_prod=False):
+        self.degree = degree
+        self.use_index = use_index
+        self.normalize_prod = normalize_prod
+        super().__init__()
+
+    def _transform(self, X, y=None):
+        """Compute the signature features for the input time series."""
+        n_timepoints, n_channels = X.shape
+
+        if self.use_index:
+            index = np.arange(n_timepoints).reshape(-1, 1)
+            X = np.concatenate((X, index), axis=1)
+            n_channels += 1
+
+        signature_matrix = []
+        instance_data = X.T
+        signature_row, feature_names = self._compute_signature(instance_data)
+        signature_matrix.append(signature_row)
+
+        if self.normalize_prod:
+            signature_matrix = np.power(signature_matrix, 1 / self.degree)
+
+        return pd.DataFrame(signature_matrix, columns=feature_names)
+
+    def _compute_signature(self, data):
+        """Compute signature features for a single instance."""
+        n_channels, _ = data.shape
+
+        feature_names = []
+        signature_row = []
+        for length in range(1, self.degree + 1):
+            for indices in np.ndindex((n_channels,) * length):
+                element_mean = self._compute_mean_product(data, indices)
+                signature_row.append(element_mean)
+
+                feature_name = "".join(f"[{i}]" for i in indices)
+                feature_names.append(feature_name)
+
+        return signature_row, feature_names
+
+    def _compute_mean_product(self, data, indices):
+        """Compute mean product of the specified data dimensions."""
+        length = len(indices)
+        ix = indices
+
+        if length == 1:
+            return np.mean(data[ix[0], :])
+        elif length == 2:
+            correlation_data = data[ix[0], :, np.newaxis] * data[ix[1], np.newaxis, :]
+            triu_indices = np.triu_indices(correlation_data.shape[1])
+            return np.mean(correlation_data[triu_indices])
+        elif length == 3:
+            correlation_data = (
+                data[ix[0], :, np.newaxis, np.newaxis]
+                * data[ix[1], np.newaxis, :, np.newaxis]
+                * data[ix[2], np.newaxis, np.newaxis, :]
+            )
+            depth = correlation_data.shape[0]
+
+            total_sum, total_len = 0, 0
+
+            for i in range(depth):
+                filtered_matrix = correlation_data[i][i:]
+
+                triu_indices = np.triu_indices(filtered_matrix.shape[0])
+
+                upper_triangular = filtered_matrix[triu_indices]
+
+                total_len += len(upper_triangular)
+                total_sum += np.sum(upper_triangular)
+
+            data_mean = total_sum / total_len
+
+            return data_mean
+        else:
+            raise NotImplementedError("Degree higher than 3 is not implemented.")
+
+    @classmethod
+    def get_test_params(cls, parameter_set="default"):
+        """Return testing parameter settings for the estimator.
+
+        Parameters
+        ----------
+        parameter_set : str, default="default"
+            Name of the set of test parameters to return, for use in tests. If no
+            special parameters are defined for a value, will return ``"default"`` set.
+
+        Returns
+        -------
+        params : dict or list of dict, default = {}
+            Parameters to create testing instances of the class
+            Each dict are parameters to construct an "interesting" test instance, i.e.,
+            ``MyClass(**params)`` or ``MyClass(**params[i])`` creates a valid test
+            instance.
+            ``create_test_instance`` uses the first (or only) dictionary in ``params``
+        """
+        params0 = {"degree": 1, "use_index": True}
+        params1 = {"degree": 3, "use_index": False}
+        params2 = {"degree": 2, "use_index": True, "normalize_prod": True}
+        return [params0, params1, params2]


Test patch:
diff --git a/sktime/annotation/tests/test_base.py b/sktime/annotation/tests/test_base.py
index 53adb6ede..06d79e80f 100644
--- a/sktime/annotation/tests/test_base.py
+++ b/sktime/annotation/tests/test_base.py
@@ -1,4 +1,4 @@
-"""Tests for the BaseSeriesAnnotator class."""
+"""Tests for the BaseDetector class."""
 
 __author__ = ["Alex-JG3"]
 __all__ = []
@@ -7,7 +7,7 @@ import pandas as pd
 import pytest
 from pandas import testing
 
-from sktime.annotation.base._base import BaseSeriesAnnotator
+from sktime.detection.base import BaseDetector
 
 
 @pytest.mark.parametrize(
@@ -43,7 +43,7 @@ from sktime.annotation.base._base import BaseSeriesAnnotator
 )
 def test_sparse_to_dense(y_sparse, y_dense_expected, index):
     """Test converting from sparse to dense."""
-    y_dense_actual = BaseSeriesAnnotator.sparse_to_dense(y_sparse, index=index)
+    y_dense_actual = BaseDetector.sparse_to_dense(y_sparse, index=index)
     testing.assert_series_equal(y_dense_actual, y_dense_expected)
 
 
@@ -63,7 +63,7 @@ def test_sparse_to_dense(y_sparse, y_dense_expected, index):
 )
 def test_dense_to_sparse(y_dense, y_sparse_expected):
     """Test converting from dense to sparse."""
-    y_sparse_actual = BaseSeriesAnnotator.dense_to_sparse(y_dense)
+    y_sparse_actual = BaseDetector.dense_to_sparse(y_dense)
     testing.assert_series_equal(y_sparse_actual, y_sparse_expected)
 
 
@@ -83,9 +83,7 @@ def test_dense_to_sparse(y_dense, y_sparse_expected):
 )
 def test_change_points_to_segments(change_points, expected_segments, start, end):
     """Test converting change points to segments."""
-    actual_segments = BaseSeriesAnnotator.change_points_to_segments(
-        change_points, start, end
-    )
+    actual_segments = BaseDetector.change_points_to_segments(change_points, start, end)
     testing.assert_series_equal(actual_segments, expected_segments)
 
 
@@ -103,7 +101,7 @@ def test_change_points_to_segments(change_points, expected_segments, start, end)
 )
 def test_segments_to_change_points(segments, expected_change_points):
     """Test converting change points to segments."""
-    actual_change_points = BaseSeriesAnnotator.segments_to_change_points(segments)
+    actual_change_points = BaseDetector.segments_to_change_points(segments)
     testing.assert_series_equal(
         actual_change_points, expected_change_points, check_dtype=False
     )
@@ -123,7 +121,7 @@ def test_segments_to_change_points(segments, expected_change_points):
     ],
 )
 def test_sparse_segments_to_dense(y_sparse, index, y_dense_expected):
-    y_dense_actual = BaseSeriesAnnotator._sparse_segments_to_dense(y_sparse, index)
+    y_dense_actual = BaseDetector._sparse_segments_to_dense(y_sparse, index)
     testing.assert_series_equal(y_dense_expected, y_dense_actual)
 
 
@@ -132,5 +130,5 @@ def test_sparse_segments_to_dense(y_sparse, index, y_dense_expected):
     [(pd.Series([2, 4]), [0, 1, 2, 3, 4, 5, 6], pd.Series([0, 0, 1, 0, 1, 0, 0]))],
 )
 def test_sparse_points_to_dense(y_sparse, index, y_dense_expected):
-    y_dense_actual = BaseSeriesAnnotator._sparse_points_to_dense(y_sparse, index)
+    y_dense_actual = BaseDetector._sparse_points_to_dense(y_sparse, index)
     testing.assert_series_equal(y_dense_actual, y_dense_expected)