Repository: aeon-toolkit/aeon
Pull request #987 (2023-12-11 15:08:21)

[ENH] Tidy up and restructure load to nested univariate
Part of #974 

This simplifies and tidies up the file datasets._dataframe_loaders.py. Context is this is very old code to load data into the now defunct nested univ format. It is not used anywhere and has under 50% coverage. Changes:

1. Remove load from long format to nested univariate. This function makes a lot of assumptions about the input format and has no facility to allow class values. I see no point in keeping it
2. Load the tsv, ts and arff load to dataframe functions simply call their counterparts in _data_loaders, then convert to nested_univ. Removes a lot of code and makes it all more readable and robust. It does mean reducing some of the options in the arguments, but these were not tested anywhere and seemed pointless to me. 
3. Tidies up a weird potential circular import I left in when writing convert_collection
4. Removes a function load_tsf_to_dataframe from _data_loaders that was a direct copy of the function in _dataframe_loaders
5. Remove the duplication of having load_from_tsf_file and load_tsf_to_dataframe, because they were essentially doing the same thing. Just have load_from_tsf_file
6. Adds some tests for _data_loaders
7. Make separate test files for _data_generators and forecasting loading, to make things clearer 
8. Adjusted tsf single problem loader to return either default format or the hierarchical long format.

Two issues for me need resolving, possibly after this PR
1. _data_generators contains a function _convert_tsf_to_hierarchical which should be elsewhere really
2. Im still unclear as to the best format for returning time series for forecasting, need to explore a little more 



aeon-actions-bot[bot]: 
## Thank you for contributing to `aeon`!

I have added the following labels to this PR based on the title: **[ $\\color{#FEF1BE}{\\textsf{enhancement}}$ ]**.
I would have added the following labels to this PR based on the changes made: **[ $\\color{#0B1D38}{\\textsf{datasets}}$, $\\color{#BDD9DB}{\\textsf{datatypes}}$ ]**, however some package labels are already present.

The [Checks](https://github.com/aeon-toolkit/aeon/pull/987/checks) tab will show the status of our automated tests. You can click on individual test runs in the tab or "Details" in the panel below to see more information if there is a failure.

If our `pre-commit` code quality check fails, any trivial fixes will automatically be pushed to your PR unless it is a draft.

Don't hesitate to ask questions on the `aeon` [Slack](https://join.slack.com/t/aeon-toolkit/shared_invite/zt-22vwvut29-HDpCu~7VBUozyfL_8j3dLA) channel if you have any!
    

Patch:
diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md
index 2eba37b2..8e854c9a 100644
--- a/CONTRIBUTORS.md
+++ b/CONTRIBUTORS.md
@@ -1,7 +1,7 @@
 # Contributors
 
 <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
-[![All Contributors](https://img.shields.io/badge/all_contributors-215-orange.svg)](#contributors)
+[![All Contributors](https://img.shields.io/badge/all_contributors-216-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!
@@ -24,6 +24,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/AidenRushbrooke"><img src="https://avatars0.githubusercontent.com/u/72034940?v=4?s=80" width="80px;" alt="AidenRushbrooke"/><br /><sub><b>AidenRushbrooke</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=AidenRushbrooke" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=AidenRushbrooke" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/akshatvishu"><img src="https://avatars.githubusercontent.com/u/33392262?v=4?s=80" width="80px;" alt="Akshat Nayak"/><br /><sub><b>Akshat Nayak</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=akshatvishu" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/arampuria19"><img src="https://avatars.githubusercontent.com/u/85577835?v=4?s=80" width="80px;" alt="Akshat Rampuria"/><br /><sub><b>Akshat Rampuria</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=arampuria19" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/keepersas"><img src="https://avatars.githubusercontent.com/u/44262176?v=4?s=80" width="80px;" alt="Aleksandr Grekov"/><br /><sub><b>Aleksandr Grekov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=keepersas" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/alex-hh"><img src="https://avatars.githubusercontent.com/u/5719745?v=4?s=80" width="80px;" alt="Alex Hawkins-Hooker"/><br /><sub><b>Alex Hawkins-Hooker</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=alex-hh" title="Code">💻</a></td>
@@ -31,9 +32,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/hadifawaz1999"><img src="https://avatars.githubusercontent.com/u/54309336?s=80" width="80px;" alt="Ali Ismail-Fawaz"/><br /><sub><b>Ali Ismail-Fawaz</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=hadifawaz1999" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Ahadifawaz1999" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=hadifawaz1999" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=hadifawaz1999" title="Tests">⚠️</a> <a href="#maintenance-hadifawaz1999" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ali-tny"><img src="https://avatars.githubusercontent.com/u/26010073?v=4?s=80" width="80px;" alt="Ali Teeney"/><br /><sub><b>Ali Teeney</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ali-tny" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/myprogrammerpersonality"><img src="https://avatars.githubusercontent.com/u/49058167?v=4?s=80" width="80px;" alt="Ali Yazdizadeh"/><br /><sub><b>Ali Yazdizadeh</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=myprogrammerpersonality" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/alwinw"><img src="https://avatars3.githubusercontent.com/u/16846521?v=4?s=80" width="80px;" alt="Alwin"/><br /><sub><b>Alwin</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=alwinw" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=alwinw" title="Code">💻</a> <a href="#maintenance-alwinw" title="Maintenance">🚧</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/alwinw"><img src="https://avatars3.githubusercontent.com/u/16846521?v=4?s=80" width="80px;" alt="Alwin"/><br /><sub><b>Alwin</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=alwinw" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=alwinw" title="Code">💻</a> <a href="#maintenance-alwinw" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/AnH0ang"><img src="https://avatars.githubusercontent.com/u/46025351?v=4?s=80" width="80px;" alt="An Hoang"/><br /><sub><b>An Hoang</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AAnH0ang" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=AnH0ang" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/akanz1"><img src="https://avatars3.githubusercontent.com/u/51492342?v=4?s=80" width="80px;" alt="Andreas Kanz"/><br /><sub><b>Andreas Kanz</b></sub></a><br /><a href="#tutorial-akanz1" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/angus924"><img src="https://avatars0.githubusercontent.com/u/55837131?v=4?s=80" width="80px;" alt="Angus Dempster"/><br /><sub><b>Angus Dempster</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=angus924" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=angus924" title="Tests">⚠️</a> <a href="#tutorial-angus924" title="Tutorials">✅</a></td>
@@ -41,9 +42,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/yard1/"><img src="https://avatars.githubusercontent.com/u/10364161?v=4?s=80" width="80px;" alt="Antoni Baum"/><br /><sub><b>Antoni Baum</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Yard1" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://aparna-sakshi.github.io/"><img src="https://avatars.githubusercontent.com/u/44149689?v=4?s=80" width="80px;" alt="Aparna Sakshi"/><br /><sub><b>Aparna Sakshi</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Aparna-Sakshi" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/AreloTanoh"><img src="https://avatars.githubusercontent.com/AreloTanoh?s=80" width="80px;" alt="Arelo Tanoh"/><br /><sub><b>Arelo Tanoh</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=AreloTanoh" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/bugslayer-332"><img src="https://avatars.githubusercontent.com/u/89122324?v=4?s=80" width="80px;" alt="Arepalli Yashwanth Reddy"/><br /><sub><b>Arepalli Yashwanth Reddy</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=bugslayer-332" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Abugslayer-332" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=bugslayer-332" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/bugslayer-332"><img src="https://avatars.githubusercontent.com/u/89122324?v=4?s=80" width="80px;" alt="Arepalli Yashwanth Reddy"/><br /><sub><b>Arepalli Yashwanth Reddy</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=bugslayer-332" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Abugslayer-332" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=bugslayer-332" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ermshaua/"><img src="https://avatars.githubusercontent.com/u/23294512?v=4?s=80" width="80px;" alt="Arik Ermshaus"/><br /><sub><b>Arik Ermshaus</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ermshaua" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/arnavrneo"><img src="https://avatars.githubusercontent.com/u/48650781?v=4?s=80" width="80px;" alt="Arnav"/><br /><sub><b>Arnav</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=arnavrneo" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/ayushmaan-seth-4a96364a/"><img src="https://avatars1.githubusercontent.com/u/29939762?v=4?s=80" width="80px;" alt="Ayushmaan Seth"/><br /><sub><b>Ayushmaan Seth</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Ayushmaanseth" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3AAyushmaanseth" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Ayushmaanseth" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Ayushmaanseth" title="Documentation">📖</a> <a href="#eventOrganizing-Ayushmaanseth" title="Event Organizing">📋</a> <a href="#tutorial-Ayushmaanseth" title="Tutorials">✅</a></td>
@@ -51,9 +52,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/badrmarani"><img src="https://avatars.githubusercontent.com/badrmarani?s=80" width="80px;" alt="Badr-Eddine Marani"/><br /><sub><b>Badr-Eddine Marani</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=badrmarani" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/benheid"><img src="https://avatars.githubusercontent.com/u/9725296?v=4?s=80" width="80px;" alt="Benedikt Heidrich"/><br /><sub><b>Benedikt Heidrich</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=benheid" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/benjaminbluhm"><img src="https://avatars.githubusercontent.com/u/40917599?v=4?s=80" width="80px;" alt="Benjamin Bluhm"/><br /><sub><b>Benjamin Bluhm</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=benjaminbluhm" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=benjaminbluhm" title="Documentation">📖</a> <a href="#example-benjaminbluhm" title="Examples">💡</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://haskarb.github.io/"><img src="https://avatars.githubusercontent.com/u/20501023?v=4?s=80" width="80px;" alt="Bhaskar Dhariyal"/><br /><sub><b>Bhaskar Dhariyal</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=haskarb" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=haskarb" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://haskarb.github.io/"><img src="https://avatars.githubusercontent.com/u/20501023?v=4?s=80" width="80px;" alt="Bhaskar Dhariyal"/><br /><sub><b>Bhaskar Dhariyal</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=haskarb" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=haskarb" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/BINAYKUMAR943"><img src="https://avatars.githubusercontent.com/u/38756834?v=4?s=80" width="80px;" alt="Binay Kumar"/><br /><sub><b>Binay Kumar</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=BINAYKUMAR943" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=BINAYKUMAR943" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=BINAYKUMAR943" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://angelpone.github.io/"><img src="https://avatars.githubusercontent.com/u/32930283?v=4?s=80" width="80px;" alt="Bohan Zhang"/><br /><sub><b>Bohan Zhang</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=AngelPone" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/boukepostma"><img src="https://avatars.githubusercontent.com/boukepostma?s=80" width="80px;" alt="Bouke Postma"/><br /><sub><b>Bouke Postma</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=boukepostma" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Aboukepostma" title="Bug reports">🐛</a> <a href="#ideas-boukepostma" title="Ideas, Planning, & Feedback">🤔</a></td>
@@ -61,9 +62,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Carlosbogo"><img src="https://avatars.githubusercontent.com/u/84228424?v=4?s=80" width="80px;" alt="Carlos Borrajo"/><br /><sub><b>Carlos Borrajo</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Carlosbogo" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Carlosbogo" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/vnmabus"><img src="https://avatars1.githubusercontent.com/u/2364173?v=4?s=80" width="80px;" alt="Carlos Ramos Carreño"/><br /><sub><b>Carlos Ramos Carreño</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=vnmabus" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ChangWeiTan"><img src="https://avatars.githubusercontent.com/u/570744?v=4?s=80" width="80px;" alt="Chang Wei Tan"/><br /><sub><b>Chang Wei Tan</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ChangWeiTan" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="http://cheuk.dev"><img src="https://avatars1.githubusercontent.com/u/28761465?v=4?s=80" width="80px;" alt="Cheuk Ting Ho"/><br /><sub><b>Cheuk Ting Ho</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Cheukting" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="http://cheuk.dev"><img src="https://avatars1.githubusercontent.com/u/28761465?v=4?s=80" width="80px;" alt="Cheuk Ting Ho"/><br /><sub><b>Cheuk Ting Ho</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Cheukting" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ckastner"><img src="https://avatars.githubusercontent.com/u/15859947?v=4?s=80" width="80px;" alt="Christian Kastner"/><br /><sub><b>Christian Kastner</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ckastner" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Ackastner" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/cdahlin"><img src="https://avatars.githubusercontent.com/u/1567780?v=4?s=80" width="80px;" alt="Christopher Dahlin"/><br /><sub><b>Christopher Dahlin</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=cdahlin" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/topher-lo"><img src="https://avatars.githubusercontent.com/u/46541035?v=4?s=80" width="80px;" alt="Christopher Lo"/><br /><sub><b>Christopher Lo</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=topher-lo" title="Code">💻</a> <a href="#ideas-topher-lo" title="Ideas, Planning, & Feedback">🤔</a></td>
@@ -71,9 +72,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ClaudiaSanches"><img src="https://avatars3.githubusercontent.com/u/28742178?v=4?s=80" width="80px;" alt="ClaudiaSanches"/><br /><sub><b>ClaudiaSanches</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ClaudiaSanches" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=ClaudiaSanches" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://sites.google.com/view/corvinpaul/"><img src="https://avatars.githubusercontent.com/u/5957191?v=4?s=80" width="80px;" alt="Corvin Paul"/><br /><sub><b>Corvin Paul</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=corvusrabus" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/DBCerigo"><img src="https://avatars.githubusercontent.com/u/8318425?v=4?s=80" width="80px;" alt="Daniel Burkhardt Cerigo"/><br /><sub><b>Daniel Burkhardt Cerigo</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=DBCerigo" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/daniel-martin-martinez"><img src="https://avatars.githubusercontent.com/dainelli98?s=80" width="80px;" alt="Daniel Martín Martínez"/><br /><sub><b>Daniel Martín Martínez</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=dainelli98" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Adainelli98" title="Bug reports">🐛</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/daniel-martin-martinez"><img src="https://avatars.githubusercontent.com/dainelli98?s=80" width="80px;" alt="Daniel Martín Martínez"/><br /><sub><b>Daniel Martín Martínez</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=dainelli98" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Adainelli98" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://dhirschfeld.github.io/"><img src="https://avatars1.githubusercontent.com/u/881019?v=4?s=80" width="80px;" alt="Dave Hirschfeld"/><br /><sub><b>Dave Hirschfeld</b></sub></a><br /><a href="#infra-dhirschfeld" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/davidbp"><img src="https://avatars3.githubusercontent.com/u/4223580?v=4?s=80" width="80px;" alt="David Buchaca Prats"/><br /><sub><b>David Buchaca Prats</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=davidbp" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://dguijo.com"><img src="https://avatars1.githubusercontent.com/u/47889499?v=4?s=80" width="80px;" alt="David Guijo-Rubio"/><br /><sub><b>David Guijo-Rubio</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=dguijo" title="Code">💻</a> <a href="#ideas-dguijo" title="Ideas, Planning, & Feedback">🤔</a></td>
@@ -81,9 +82,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/dougollerenshaw"><img src="https://avatars.githubusercontent.com/u/19944442?v=4?s=80" width="80px;" alt="Doug Ollerenshaw"/><br /><sub><b>Doug Ollerenshaw</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=dougollerenshaw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Dbhasin1"><img src="https://avatars.githubusercontent.com/u/56479884?v=4?s=80" width="80px;" alt="Drishti Bhasin "/><br /><sub><b>Drishti Bhasin </b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Dbhasin1" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/dsherry"><img src="https://avatars.githubusercontent.com/dsherry?s=80" width="80px;" alt="Dylan Sherry"/><br /><sub><b>Dylan Sherry</b></sub></a><br /><a href="#infra-dsherry" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Emiliathewolf"><img src="https://avatars2.githubusercontent.com/u/22026218?v=4?s=80" width="80px;" alt="Emilia Rose"/><br /><sub><b>Emilia Rose</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Emiliathewolf" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Emiliathewolf" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Emiliathewolf"><img src="https://avatars2.githubusercontent.com/u/22026218?v=4?s=80" width="80px;" alt="Emilia Rose"/><br /><sub><b>Emilia Rose</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Emiliathewolf" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Emiliathewolf" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/erjieyong"><img src="https://avatars.githubusercontent.com/u/109052378?v=4?s=80" width="80px;" alt="Er Jie Yong"/><br /><sub><b>Er Jie Yong</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Aerjieyong" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=erjieyong" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/evanmiller29"><img src="https://avatars2.githubusercontent.com/u/8062590?v=4?s=80" width="80px;" alt="Evan Miller"/><br /><sub><b>Evan Miller</b></sub></a><br /><a href="#tutorial-evanmiller29" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/eyalshafran"><img src="https://avatars.githubusercontent.com/u/16999574?v=4?s=80" width="80px;" alt="Eyal Shafran"/><br /><sub><b>Eyal Shafran</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=eyalshafran" title="Code">💻</a></td>
@@ -91,9 +92,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/flix6x"><img src="https://avatars.githubusercontent.com/u/30658763?v=4?s=80" width="80px;" alt="Felix Claessen"/><br /><sub><b>Felix Claessen</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Flix6x" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Flix6x" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Flix6x" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AFlix6x" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/fstinner"><img src="https://avatars.githubusercontent.com/u/11679462?v=4?s=80" width="80px;" alt="Florian Stinner"/><br /><sub><b>Florian Stinner</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=fstinner" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=fstinner" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/fkiraly"><img src="https://avatars1.githubusercontent.com/u/7985502?v=4?s=80" width="80px;" alt="Franz Kiraly"/><br /><sub><b>Franz Kiraly</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Afkiraly" title="Bug reports">🐛</a> <a href="#business-fkiraly" title="Business development">💼</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=fkiraly" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=fkiraly" title="Documentation">📖</a> <a href="#design-fkiraly" title="Design">🎨</a> <a href="#eventOrganizing-fkiraly" title="Event Organizing">📋</a> <a href="#example-fkiraly" title="Examples">💡</a> <a href="#financial-fkiraly" title="Financial">💵</a> <a href="#fundingFinding-fkiraly" title="Funding Finding">🔍</a> <a href="#ideas-fkiraly" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-fkiraly" title="Maintenance">🚧</a> <a href="#mentoring-fkiraly" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-fkiraly" title="Project Management">📆</a> <a href="#question-fkiraly" title="Answering Questions">💬</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3Afkiraly" title="Reviewed Pull Requests">👀</a> <a href="#talk-fkiraly" title="Talks">📢</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=fkiraly" title="Tests">⚠️</a> <a href="#tutorial-fkiraly" title="Tutorials">✅</a> <a href="#video-fkiraly" title="Videos">📹</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/freddyaboulton"><img src="https://avatars.githubusercontent.com/u/41651716?v=4?s=80" width="80px;" alt="Freddy A Boulton"/><br /><sub><b>Freddy A Boulton</b></sub></a><br /><a href="#infra-freddyaboulton" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=freddyaboulton" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/freddyaboulton"><img src="https://avatars.githubusercontent.com/u/41651716?v=4?s=80" width="80px;" alt="Freddy A Boulton"/><br /><sub><b>Freddy A Boulton</b></sub></a><br /><a href="#infra-freddyaboulton" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=freddyaboulton" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/chernika158"><img src="https://avatars.githubusercontent.com/u/43787741?s=400&v=4?s=80" width="80px;" alt="Galina Chernikova"/><br /><sub><b>Galina Chernikova</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=chernika158" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/goastler"><img src="https://avatars0.githubusercontent.com/u/7059456?v=4?s=80" width="80px;" alt="George Oastler"/><br /><sub><b>George Oastler</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=goastler" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=goastler" title="Tests">⚠️</a> <a href="#platform-goastler" title="Packaging/porting to new platform">📦</a> <a href="#example-goastler" title="Examples">💡</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=goastler" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/gracewgao/"><img src="https://avatars0.githubusercontent.com/u/38268331?v=4?s=80" width="80px;" alt="Grace Gao"/><br /><sub><b>Grace Gao</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=gracewgao" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Agracewgao" title="Bug reports">🐛</a></td>
@@ -101,9 +102,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/GuzalBulatova"><img src="https://avatars.githubusercontent.com/GuzalBulatova?s=80" width="80px;" alt="Guzal Bulatova"/><br /><sub><b>Guzal Bulatova</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AGuzalBulatova" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=GuzalBulatova" title="Code">💻</a> <a href="#eventOrganizing-GuzalBulatova" title="Event Organizing">📋</a> <a href="#mentoring-GuzalBulatova" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-GuzalBulatova" title="Project Management">📆</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3AGuzalBulatova" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=GuzalBulatova" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/HYang1996"><img src="https://avatars0.githubusercontent.com/u/44179303?v=4?s=80" width="80px;" alt="HYang1996"/><br /><sub><b>HYang1996</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=HYang1996" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=HYang1996" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=HYang1996" title="Documentation">📖</a> <a href="#tutorial-HYang1996" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/hedeershowk"><img src="https://avatars.githubusercontent.com/u/144284759?v=4?s=80" width="80px;" alt="Hedeer El Showk"/><br /><sub><b>Hedeer El Showk</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Ahedeershowk" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=hedeershowk" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/huayiwei/"><img src="https://avatars3.githubusercontent.com/u/22870735?v=4?s=80" width="80px;" alt="Huayi Wei"/><br /><sub><b>Huayi Wei</b></sub></a><br /><a href="#tutorial-huayicodes" title="Tutorials">✅</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/huayiwei/"><img src="https://avatars3.githubusercontent.com/u/22870735?v=4?s=80" width="80px;" alt="Huayi Wei"/><br /><sub><b>Huayi Wei</b></sub></a><br /><a href="#tutorial-huayicodes" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Ifeanyi30"><img src="https://avatars.githubusercontent.com/u/49926145?v=4?s=80" width="80px;" alt="Ifeanyi30"/><br /><sub><b>Ifeanyi30</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Ifeanyi30" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/iljamaurer"><img src="https://avatars.githubusercontent.com/u/45882103?v=4?s=80" width="80px;" alt="Ilja Maurer"/><br /><sub><b>Ilja Maurer</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=iljamaurer" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/IlyasMoutawwakil"><img src="https://avatars.githubusercontent.com/IlyasMoutawwakil?s=80" width="80px;" alt="Ilyas Moutawwakil"/><br /><sub><b>Ilyas Moutawwakil</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=IlyasMoutawwakil" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=IlyasMoutawwakil" title="Documentation">📖</a></td>
@@ -111,9 +112,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ishannangia001"><img src="https://avatars.githubusercontent.com/u/29480389?v=4?s=80" width="80px;" alt="Ishan Nangia"/><br /><sub><b>Ishan Nangia</b></sub></a><br /><a href="#ideas-ishannangia001" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/jnrusson1"><img src="https://avatars.githubusercontent.com/u/51986332?v=4?s=80" width="80px;" alt="Jack Russon"/><br /><sub><b>Jack Russon</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jnrusson1" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="http://www.timeseriesclassification.com/"><img src="https://avatars0.githubusercontent.com/u/44509982?v=4?s=80" width="80px;" alt="James Large"/><br /><sub><b>James Large</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=James-Large" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=James-Large" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=James-Large" title="Tests">⚠️</a> <a href="#infra-James-Large" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-James-Large" title="Maintenance">🚧</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jambo6"><img src="https://avatars.githubusercontent.com/u/32545677?v=4?s=80" width="80px;" alt="James Morrill"/><br /><sub><b>James Morrill</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jambo6" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jambo6"><img src="https://avatars.githubusercontent.com/u/32545677?v=4?s=80" width="80px;" alt="James Morrill"/><br /><sub><b>James Morrill</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jambo6" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/jasmineliaw"><img src="https://avatars.githubusercontent.com/u/93530957?v=4?s=80" width="80px;" alt="Jasmine Liaw"/><br /><sub><b>Jasmine Liaw</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jasmineliaw" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars1.githubusercontent.com/u/38794632?v=4?s=80" width="80px;" alt="Jason Lines"/><br /><sub><b>Jason Lines</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jasonlines" title="Code">💻</a> <a href="#business-jasonlines" title="Business development">💼</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=jasonlines" title="Documentation">📖</a> <a href="#design-jasonlines" title="Design">🎨</a> <a href="#eventOrganizing-jasonlines" title="Event Organizing">📋</a> <a href="#fundingFinding-jasonlines" title="Funding Finding">🔍</a> <a href="#ideas-jasonlines" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-jasonlines" title="Project Management">📆</a> <a href="#question-jasonlines" title="Answering Questions">💬</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3Ajasonlines" title="Reviewed Pull Requests">👀</a> <a href="#talk-jasonlines" title="Talks">📢</a> <a href="#example-jasonlines" title="Examples">💡</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/whackteachers"><img src="https://avatars0.githubusercontent.com/u/33785383?v=4?s=80" width="80px;" alt="Jason Pong"/><br /><sub><b>Jason Pong</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=whackteachers" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=whackteachers" title="Tests">⚠️</a></td>
@@ -121,9 +122,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/JonathanBechtel"><img src="https://avatars.githubusercontent.com/u/481696?v=4?s=80" width="80px;" alt="JonathanBechtel"/><br /><sub><b>JonathanBechtel</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=JonathanBechtel" title="Code">💻</a> <a href="#ideas-JonathanBechtel" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=JonathanBechtel" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/jorenham"><img src="https://avatars.githubusercontent.com/u/6208662?v=4?s=80" width="80px;" alt="Joren Hammudoglu"/><br /><sub><b>Joren Hammudoglu</b></sub></a><br /><a href="#infra-jorenham" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://juanitorduz.github.io/"><img src="https://avatars1.githubusercontent.com/u/22996444?v=4?s=80" width="80px;" alt="Juan Orduz"/><br /><sub><b>Juan Orduz</b></sub></a><br /><a href="#tutorial-juanitorduz" title="Tutorials">✅</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=juanitorduz" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jelc53"><img src="https://avatars.githubusercontent.com/u/30467615?v=4?s=80" width="80px;" alt="Julian Cooper"/><br /><sub><b>Julian Cooper</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jelc53" title="Code">💻</a> <a href="#ideas-jelc53" title="Ideas, Planning, & Feedback">🤔</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jelc53"><img src="https://avatars.githubusercontent.com/u/30467615?v=4?s=80" width="80px;" alt="Julian Cooper"/><br /><sub><b>Julian Cooper</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jelc53" title="Code">💻</a> <a href="#ideas-jelc53" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/julianarn/"><img src="https://avatars.githubusercontent.com/u/19613567?v=4?s=80" width="80px;" alt="Juliana"/><br /><sub><b>Juliana</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=julramos" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.justinshenk.com/"><img src="https://avatars.githubusercontent.com/u/10270308?v=4?s=80" width="80px;" alt="Justin Shenk"/><br /><sub><b>Justin Shenk</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=justinshenk" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/kcc-lion"><img src="https://avatars.githubusercontent.com/u/54307609?v=4?s=80" width="80px;" alt="Kai Lion"/><br /><sub><b>Kai Lion</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=kcc-lion" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=kcc-lion" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=kcc-lion" title="Documentation">📖</a></td>
@@ -131,9 +132,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://kejsitake.com/"><img src="https://avatars.githubusercontent.com/u/23707808?v=4?s=80" width="80px;" alt="Kejsi Take"/><br /><sub><b>Kejsi Take</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=kejsitake" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/kevinlam2"><img src="https://avatars.githubusercontent.com/u/114420932?s=400&v=4?s=80" width="80px;" alt="Kevin Lam"/><br /><sub><b>Kevin Lam</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=klam-data" title="Code">💻</a> <a href="#example-klam-data" title="Examples">💡</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=klam-data" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://whitakerlab.github.io/"><img src="https://avatars1.githubusercontent.com/u/3626306?v=4?s=80" width="80px;" alt="Kirstie Whitaker"/><br /><sub><b>Kirstie Whitaker</b></sub></a><br /><a href="#ideas-KirstieJane" title="Ideas, Planning, & Feedback">🤔</a> <a href="#fundingFinding-KirstieJane" title="Funding Finding">🔍</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/kishmanani"><img src="https://avatars.githubusercontent.com/u/30973056?v=4?s=80" width="80px;" alt="Kishan Manani"/><br /><sub><b>Kishan Manani</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AKishManani" title="Bug reports">🐛</a> <a href="#ideas-KishManani" title="Ideas, Planning, & Feedback">🤔</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/kishmanani"><img src="https://avatars.githubusercontent.com/u/30973056?v=4?s=80" width="80px;" alt="Kishan Manani"/><br /><sub><b>Kishan Manani</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=KishManani" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AKishManani" title="Bug reports">🐛</a> <a href="#ideas-KishManani" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/krumeto"><img src="https://avatars3.githubusercontent.com/u/11272436?v=4?s=80" width="80px;" alt="Krum Arnaudov"/><br /><sub><b>Krum Arnaudov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Akrumeto" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=krumeto" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/koralturkk"><img src="https://avatars2.githubusercontent.com/u/18037789?s=460&v=4?s=80" width="80px;" alt="Kutay Koralturk"/><br /><sub><b>Kutay Koralturk</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=koralturkk" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Akoralturkk" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ltsaprounis"><img src="https://avatars.githubusercontent.com/u/64217214?v=4?s=80" width="80px;" alt="Leonidas Tsaprounis"/><br /><sub><b>Leonidas Tsaprounis</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ltsaprounis" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Altsaprounis" title="Bug reports">🐛</a> <a href="#mentoring-ltsaprounis" title="Mentoring">🧑‍🏫</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3Altsaprounis" title="Reviewed Pull Requests">👀</a></td>
@@ -141,9 +142,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/chillerobscuro"><img src="https://avatars.githubusercontent.com/u/5232872?v=4?s=80" width="80px;" alt="Logan Duffy"/><br /><sub><b>Logan Duffy</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=chillerobscuro" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=chillerobscuro" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=chillerobscuro" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Achillerobscuro" title="Bug reports">🐛</a> <a href="#ideas-chillerobscuro" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="http://lpantano.github.io/"><img src="https://avatars2.githubusercontent.com/u/1621788?v=4?s=80" width="80px;" alt="Lorena Pantano"/><br /><sub><b>Lorena Pantano</b></sub></a><br /><a href="#ideas-lpantano" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ltoniazzi"><img src="https://avatars.githubusercontent.com/u/61414566?s=80" width="80px;" alt="Lorenzo Toniazzi"/><br /><sub><b>Lorenzo Toniazzi</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ltoniazzi" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Lovkush-A"><img src="https://avatars.githubusercontent.com/u/25344832?v=4?s=80" width="80px;" alt="Lovkush"/><br /><sub><b>Lovkush</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Lovkush-A" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Lovkush-A" title="Tests">⚠️</a> <a href="#ideas-Lovkush-A" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-Lovkush-A" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-Lovkush-A" title="Project Management">📆</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Lovkush-A"><img src="https://avatars.githubusercontent.com/u/25344832?v=4?s=80" width="80px;" alt="Lovkush"/><br /><sub><b>Lovkush</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Lovkush-A" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Lovkush-A" title="Tests">⚠️</a> <a href="#ideas-Lovkush-A" title="Ideas, Planning, & Feedback">🤔</a> <a href="#mentoring-Lovkush-A" title="Mentoring">🧑‍🏫</a> <a href="#projectManagement-Lovkush-A" title="Project Management">📆</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/zy18811"><img src="https://avatars.githubusercontent.com/u/74973887?v=4?s=80" width="80px;" alt="Luca Bennett"/><br /><sub><b>Luca Bennett</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=zy18811" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=zy18811" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=zy18811" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/lbventura"><img src="https://avatars.githubusercontent.com/u/68004282?s=96&v=4?s=80" width="80px;" alt="Luis Ventura"/><br /><sub><b>Luis Ventura</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=lbventura" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/luiszugasti"><img src="https://avatars.githubusercontent.com/u/11198457?s=460&u=0645b72683e491824aca16db9702f1d3eb990389&v=4?s=80" width="80px;" alt="Luis Zugasti"/><br /><sub><b>Luis Zugasti</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=luiszugasti" title="Documentation">📖</a></td>
@@ -151,9 +152,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="http://marcelotryle.com"><img src="https://avatars3.githubusercontent.com/u/7353520?v=4?s=80" width="80px;" alt="Marcelo Trylesinski"/><br /><sub><b>Marcelo Trylesinski</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Kludex" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/MarcoGorelli"><img src="https://avatars2.githubusercontent.com/u/33491632?v=4?s=80" width="80px;" 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="12.5%"><a href="https://www.linkedin.com/in/margaret-gorlin/"><img src="https://avatars.githubusercontent.com/u/23091594?v=4?s=80" width="80px;" alt="Margaret Gorlin"/><br /><sub><b>Margaret Gorlin</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=mgorlin" title="Code">💻</a> <a href="#example-mgorlin" title="Examples">💡</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=mgorlin" title="Tests">⚠️</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/mariamjabara"><img src="https://avatars.githubusercontent.com/u/38568292?v=4?s=80" width="80px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=mariamjabara" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/mariamjabara"><img src="https://avatars.githubusercontent.com/u/38568292?v=4?s=80" width="80px;" alt="Mariam Jabara"/><br /><sub><b>Mariam Jabara</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=mariamjabara" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://twitter.com/marielli"><img src="https://avatars2.githubusercontent.com/u/13499809?v=4?s=80" width="80px;" alt="Marielle"/><br /><sub><b>Marielle</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=marielledado" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=marielledado" title="Code">💻</a> <a href="#ideas-marielledado" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/mloning"><img src="https://avatars3.githubusercontent.com/u/21020482?v=4?s=80" width="80px;" alt="Markus Löning"/><br /><sub><b>Markus Löning</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=mloning" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/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/aeon-toolkit/aeon/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/aeon-toolkit/aeon/commits?author=mloning" title="Documentation">📖</a> <a href="#design-mloning" title="Design">🎨</a> <a href="#eventOrganizing-mloning" title="Event Organizing">📋</a> <a href="#fundingFinding-mloning" title="Funding Finding">🔍</a> <a href="#ideas-mloning" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-mloning" title="Project Management">📆</a> <a href="#question-mloning" title="Answering Questions">💬</a> <a href="#talk-mloning" title="Talks">📢</a> <a href="#mentoring-mloning" title="Mentoring">🧑‍🏫</a> <a href="#video-mloning" title="Videos">📹</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/martin-walter-1a33b3114/"><img src="https://avatars0.githubusercontent.com/u/29627036?v=4?s=80" width="80px;" alt="Martin Walter"/><br /><sub><b>Martin Walter</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=aiwalter" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Aaiwalter" title="Bug reports">🐛</a> <a href="#projectManagement-aiwalter" title="Project Management">📆</a> <a href="#fundingFinding-aiwalter" title="Funding Finding">🔍</a> <a href="#mentoring-aiwalter" title="Mentoring">🧑‍🏫</a> <a href="#ideas-aiwalter" title="Ideas, Planning, & Feedback">🤔</a> <a href="#design-aiwalter" title="Design">🎨</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3Aaiwalter" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=aiwalter" title="Documentation">📖</a> <a href="#talk-aiwalter" title="Talks">📢</a></td>
@@ -161,9 +162,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/MatthewMiddlehurst"><img src="https://avatars0.githubusercontent.com/u/25731235?v=4?s=80" width="80px;" alt="Matthew Middlehurst"/><br /><sub><b>Matthew Middlehurst</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AMatthewMiddlehurst" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MatthewMiddlehurst" title="Code">💻</a> <a href="#data-MatthewMiddlehurst" title="Data">🔣</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MatthewMiddlehurst" title="Documentation">📖</a> <a href="#design-MatthewMiddlehurst" title="Design">🎨</a> <a href="#example-MatthewMiddlehurst" title="Examples">💡</a> <a href="#infra-MatthewMiddlehurst" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="#maintenance-MatthewMiddlehurst" title="Maintenance">🚧</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MatthewMiddlehurst" title="Tests">⚠️</a> <a href="#tutorial-MatthewMiddlehurst" title="Tutorials">✅</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3AMatthewMiddlehurst" title="Reviewed Pull Requests">👀</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/solen0id"><img src="https://avatars.githubusercontent.com/u/20767606?v=4?s=80" width="80px;" alt="Max Patzelt"/><br /><sub><b>Max Patzelt</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=solen0id" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Hephaest"><img src="https://avatars2.githubusercontent.com/u/37981444?v=4?s=80" width="80px;" alt="Miao Cai"/><br /><sub><b>Miao Cai</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AHephaest" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Hephaest" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="michaelfeil.eu"><img src="https://avatars.githubusercontent.com/u/63565275?v=4?s=80" width="80px;" alt="Michael Feil"/><br /><sub><b>Michael Feil</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=michaelfeil" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=michaelfeil" title="Tests">⚠️</a> <a href="#ideas-michaelfeil" title="Ideas, Planning, & Feedback">🤔</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="michaelfeil.eu"><img src="https://avatars.githubusercontent.com/u/63565275?v=4?s=80" width="80px;" alt="Michael Feil"/><br /><sub><b>Michael Feil</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=michaelfeil" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=michaelfeil" title="Tests">⚠️</a> <a href="#ideas-michaelfeil" title="Ideas, Planning, & Feedback">🤔</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/MichalChromcak"><img src="https://avatars1.githubusercontent.com/u/12393430?v=4?s=80" width="80px;" alt="Michal Chromcak"/><br /><sub><b>Michal Chromcak</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=MichalChromcak" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MichalChromcak" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MichalChromcak" title="Tests">⚠️</a> <a href="#tutorial-MichalChromcak" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/miraep8"><img src="https://avatars.githubusercontent.com/u/10511777?s=400&u=10a774fd4be767fa3b23a82a98bbfe102c17f0f3&v=4?s=80" width="80px;" alt="Mirae Parker"/><br /><sub><b>Mirae Parker</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=miraep8" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=miraep8" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://mo-saif.github.io/"><img src="https://avatars0.githubusercontent.com/u/27867617?v=4?s=80" width="80px;" alt="Mohammed Saif Kazamel"/><br /><sub><b>Mohammed Saif Kazamel</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AMo-Saif" title="Bug reports">🐛</a></td>
@@ -171,9 +172,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Multivin12"><img src="https://avatars3.githubusercontent.com/u/36476633?v=4?s=80" width="80px;" alt="Multivin12"/><br /><sub><b>Multivin12</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Multivin12" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Multivin12" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/marcio55afr"><img src="https://avatars.githubusercontent.com/u/42646282?v=4?s=80" width="80px;" alt="Márcio A. Freitas Jr"/><br /><sub><b>Márcio A. Freitas Jr</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=marcio55afr" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/niekvanderlaan"><img src="https://avatars.githubusercontent.com/u/9962825?v=4?s=80" width="80px;" alt="Niek van der Laan"/><br /><sub><b>Niek van der Laan</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=niekvanderlaan" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=80" width="80px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=ngupta23" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/ngupta23"><img src="https://avatars0.githubusercontent.com/u/33585645?v=4?s=80" width="80px;" alt="Nikhil Gupta"/><br /><sub><b>Nikhil Gupta</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ngupta23" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Angupta23" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=ngupta23" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/nshahpazov/"><img src="https://avatars.githubusercontent.com/nshahpazov?s=80" width="80px;" alt="Nikola Shahpazov"/><br /><sub><b>Nikola Shahpazov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=nshahpazov" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/nilesh05apr"><img src="https://avatars.githubusercontent.com/u/65773314?v=4?s=80" width="80px;" alt="Nilesh Kumar"/><br /><sub><b>Nilesh Kumar</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=nilesh05apr" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ninfueng"><img src="https://avatars2.githubusercontent.com/u/28499769?v=4?s=80" width="80px;" alt="Ninnart Fuengfusin"/><br /><sub><b>Ninnart Fuengfusin</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ninfueng" title="Code">💻</a></td>
@@ -181,9 +182,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/shchur"><img src="https://avatars.githubusercontent.com/u/6944857?v=4?s=80" width="80px;" alt="Oleksandr Shchur"/><br /><sub><b>Oleksandr Shchur</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Ashchur" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=shchur" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/kachayev"><img src="https://avatars.githubusercontent.com/u/485647?v=4?s=80" width="80px;" alt="Oleksii Kachaiev"/><br /><sub><b>Oleksii Kachaiev</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=kachayev" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=kachayev" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/olivermatthews"><img src="https://avatars.githubusercontent.com/u/31141490?v=4?s=80" width="80px;" alt="Oliver Matthews"/><br /><sub><b>Oliver Matthews</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=OliverMatthews" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=80" width="80px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/commits?author=prockenschaub" title="Tests">⚠️</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/prockenschaub"><img src="https://avatars0.githubusercontent.com/u/15381732?v=4?s=80" width="80px;" alt="Patrick Rockenschaub"/><br /><sub><b>Patrick Rockenschaub</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/commits?author=prockenschaub" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="http://www2.informatik.hu-berlin.de/~schaefpa/"><img src="https://avatars0.githubusercontent.com/u/7783034?v=4?s=80" width="80px;" alt="Patrick Schäfer"/><br /><sub><b>Patrick Schäfer</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=patrickzib" title="Code">💻</a> <a href="#tutorial-patrickzib" title="Tutorials">✅</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://ber.gp"><img src="https://avatars1.githubusercontent.com/u/9824244?v=4?s=80" width="80px;" alt="Paul"/><br /><sub><b>Paul</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Pangoraw" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/PaulRabich"><img src="https://avatars.githubusercontent.com/u/78356939?v=4?s=80" width="80px;" alt="Paul Rabich"/><br /><sub><b>Paul Rabich</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=PaulRabich" title="Code">💻</a></td>
@@ -191,9 +192,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://www.imes.uni-hannover.de/de/institut/team/m-sc-karl-philipp-kortmann/"><img src="https://avatars.githubusercontent.com/u/20466981?v=4?s=80" width="80px;" alt="Philipp Kortmann"/><br /><sub><b>Philipp Kortmann</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=MrPr3ntice" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=MrPr3ntice" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Piyush1729"><img src="https://avatars2.githubusercontent.com/u/64950012?v=4?s=80" width="80px;" alt="Piyush Gade"/><br /><sub><b>Piyush Gade</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Piyush1729" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3APiyush1729" title="Reviewed Pull Requests">👀</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/pul95"><img src="https://avatars.githubusercontent.com/pul95?s=80" width="80px;" alt="Pulkit Verma"/><br /><sub><b>Pulkit Verma</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=pul95" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=80" width="80px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/Quaterion"><img src="https://avatars2.githubusercontent.com/u/23200273?v=4?s=80" width="80px;" alt="Quaterion"/><br /><sub><b>Quaterion</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3AQuaterion" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/RafaAyGar"><img src="https://avatars.githubusercontent.com/u/37343008?s=400&u=bbd9c00c6045adf11cd9376e6db1d959565c27c6&v=4?s=80" width="80px;" alt="Rafael Ayllón-Gavilán"/><br /><sub><b>Rafael Ayllón-Gavilán</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=RafaAyGar" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/rakshitha123"><img src="https://avatars.githubusercontent.com/u/7654679?v=4?s=80" width="80px;" alt="Rakshitha Godahewa"/><br /><sub><b>Rakshitha Godahewa</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=rakshitha123" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=rakshitha123" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/RavenRudi"><img src="https://avatars.githubusercontent.com/u/46402968?v=4?s=80" width="80px;" alt="RavenRudi"/><br /><sub><b>RavenRudi</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=RavenRudi" title="Code">💻</a></td>
@@ -201,9 +202,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/Ris-Bali"><img src="https://avatars.githubusercontent.com/u/81592570?v=4?s=80" width="80px;" alt="Rishabh Bali"/><br /><sub><b>Rishabh Bali</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Ris-Bali" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/RishiKumarRay"><img src="https://avatars.githubusercontent.com/u/87641376?v=4?s=80" width="80px;" 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="12.5%"><a href="https://github.com/Riyabelle25"><img src="https://avatars.githubusercontent.com/u/55790848?v=4?s=80" width="80px;" alt="Riya Elizabeth John"/><br /><sub><b>Riya Elizabeth John</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=Riyabelle25" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Riyabelle25" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=Riyabelle25" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/ronnie-llamado"><img src="https://avatars.githubusercontent.com/ronnie-llamado?s=80" width="80px;" alt="Ronnie Llamado"/><br /><sub><b>Ronnie Llamado</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ronnie-llamado" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/ronnie-llamado"><img src="https://avatars.githubusercontent.com/ronnie-llamado?s=80" width="80px;" alt="Ronnie Llamado"/><br /><sub><b>Ronnie Llamado</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ronnie-llamado" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/rnkuhns"><img src="https://avatars0.githubusercontent.com/u/26907244?v=4?s=80" width="80px;" alt="Ryan Kuhns"/><br /><sub><b>Ryan Kuhns</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=RNKuhns" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3ARNKuhns" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=RNKuhns" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/achieveordie"><img src="https://avatars.githubusercontent.com/u/54197164?v=4?s=80" width="80px;" alt="Sagar Mishra"/><br /><sub><b>Sagar Mishra</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=achieveordie" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://sajay.online"><img src="https://avatars2.githubusercontent.com/u/25329624?v=4?s=80" width="80px;" alt="Sajaysurya Ganesh"/><br /><sub><b>Sajaysurya Ganesh</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=sajaysurya" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/commits?author=sajaysurya" title="Tests">⚠️</a> <a href="#tutorial-sajaysurya" title="Tutorials">✅</a></td>
@@ -211,9 +212,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/satya-pattnaik-77a430144/"><img src="https://avatars.githubusercontent.com/u/22102468?v=4?s=80" width="80px;" alt="Satya Prakash Pattnaik"/><br /><sub><b>Satya Prakash Pattnaik</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=satya-pattnaik" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/dasgupsa"><img src="https://avatars2.githubusercontent.com/u/10398956?v=4?s=80" width="80px;" alt="Saurabh Dasgupta"/><br /><sub><b>Saurabh Dasgupta</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=dasgupsa" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/SebasKoel"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=80" width="80px;" alt="Sebastiaan Koel"/><br /><sub><b>Sebastiaan Koel</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=SebasKoel" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=SebasKoel" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=80" width="80px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=shagn" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/shagn"><img src="https://avatars.githubusercontent.com/u/16029092?v=4?s=80" width="80px;" alt="Sebastian Hagn"/><br /><sub><b>Sebastian Hagn</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=shagn" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/AurumnPegasus"><img src="https://avatars.githubusercontent.com/u/54315149?v=4?s=80" width="80px;" alt="Shivansh Subramanian"/><br /><sub><b>Shivansh Subramanian</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=AurumnPegasus" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=AurumnPegasus" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/solomon-botchway-a1383821b/"><img src="https://avatars.githubusercontent.com/u/62394255?v=4?s=80" width="80px;" 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="12.5%"><a href="https://github.com/khrapovs"><img src="https://avatars.githubusercontent.com/u/3774663?v=4?s=80" width="80px;" alt="Stanislav Khrapov"/><br /><sub><b>Stanislav Khrapov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=khrapovs" title="Code">💻</a></td>
@@ -221,9 +222,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/SveaMeyer13"><img src="https://avatars.githubusercontent.com/u/46671894?v=4?s=80" width="80px;" alt="Svea Marie Meyer"/><br /><sub><b>Svea Marie Meyer</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=SveaMeyer13" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=SveaMeyer13" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/sylvaincom"><img src="https://avatars.githubusercontent.com/u/48064216?v=4?s=80" width="80px;" alt="Sylvain Combettes"/><br /><sub><b>Sylvain Combettes</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=sylvaincom" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Asylvaincom" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/TNTran92"><img src="https://avatars.githubusercontent.com/u/55965636?v=4?s=80" width="80px;" alt="TNTran92"/><br /><sub><b>TNTran92</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=TNTran92" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://thayeylolu.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/13348874?v=4?s=80" width="80px;" alt="Taiwo Owoseni"/><br /><sub><b>Taiwo Owoseni</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=thayeylolu" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://thayeylolu.github.io/portfolio/"><img src="https://avatars.githubusercontent.com/u/13348874?v=4?s=80" width="80px;" alt="Taiwo Owoseni"/><br /><sub><b>Taiwo Owoseni</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=thayeylolu" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/lnthach"><img src="https://avatars0.githubusercontent.com/u/7788363?v=4?s=80" width="80px;" alt="Thach Le Nguyen"/><br /><sub><b>Thach Le Nguyen</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=lnthach" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=lnthach" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/mathco-wf"><img src="https://avatars.githubusercontent.com/mathco-wf?s=80" width="80px;" alt="TheMathcompay Widget Factory Team"/><br /><sub><b>TheMathcompay Widget Factory Team</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=mathco-wf" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/tombh"><img src="https://avatars.githubusercontent.com/u/160835?s=80&v=4?s=80" width="80px;" alt="Thomas Buckley-Houston"/><br /><sub><b>Thomas Buckley-Houston</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Atombh" title="Bug reports">🐛</a></td>
@@ -231,9 +232,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/tch"><img src="https://avatars3.githubusercontent.com/u/184076?v=4?s=80" width="80px;" alt="Tomasz Chodakowski"/><br /><sub><b>Tomasz Chodakowski</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=tch" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=tch" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Atch" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="http://www.timeseriesclassification.com"><img src="https://avatars1.githubusercontent.com/u/9594042?v=4?s=80" width="80px;" alt="Tony Bagnall"/><br /><sub><b>Tony Bagnall</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=TonyBagnall" title="Code">💻</a> <a href="#business-TonyBagnall" title="Business development">💼</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=TonyBagnall" title="Documentation">📖</a> <a href="#design-TonyBagnall" title="Design">🎨</a> <a href="#eventOrganizing-TonyBagnall" title="Event Organizing">📋</a> <a href="#fundingFinding-TonyBagnall" title="Funding Finding">🔍</a> <a href="#ideas-TonyBagnall" title="Ideas, Planning, & Feedback">🤔</a> <a href="#projectManagement-TonyBagnall" title="Project Management">📆</a> <a href="#question-TonyBagnall" title="Answering Questions">💬</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3ATonyBagnall" title="Reviewed Pull Requests">👀</a> <a href="#talk-TonyBagnall" title="Talks">📢</a> <a href="#data-TonyBagnall" title="Data">🔣</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/utsavcoding"><img src="https://avatars3.githubusercontent.com/u/55446385?v=4?s=80" width="80px;" alt="Utsav Kumar Tiwari"/><br /><sub><b>Utsav Kumar Tiwari</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=utsavcoding" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=utsavcoding" title="Documentation">📖</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/victordremov"><img src="https://avatars.githubusercontent.com/u/32140716?s=80" width="80px;" alt="Viktor Dremov"/><br /><sub><b>Viktor Dremov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=victordremov" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/victordremov"><img src="https://avatars.githubusercontent.com/u/32140716?s=80" width="80px;" alt="Viktor Dremov"/><br /><sub><b>Viktor Dremov</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=victordremov" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ViktorKaz"><img src="https://avatars0.githubusercontent.com/u/33499138?v=4?s=80" width="80px;" alt="ViktorKaz"/><br /><sub><b>ViktorKaz</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ViktorKaz" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=ViktorKaz" title="Documentation">📖</a> <a href="#design-ViktorKaz" title="Design">🎨</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/VyomkeshVyas"><img src="https://avatars.githubusercontent.com/u/110027694?v=4?s=80" width="80px;" alt="Vyomkesh Vyas"/><br /><sub><b>Vyomkesh Vyas</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=VyomkeshVyas" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=VyomkeshVyas" title="Documentation">📖</a> <a href="#example-VyomkeshVyas" title="Examples">💡</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=VyomkeshVyas" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://www.linkedin.com/in/templierw/"><img src="https://github.com/templierw.png?s=80" width="80px;" alt="William Templier"/><br /><sub><b>William Templier</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=templierw" title="Documentation">📖</a></td>
@@ -241,9 +242,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/magittan"><img src="https://avatars0.githubusercontent.com/u/14024202?v=4?s=80" width="80px;" alt="William Zheng"/><br /><sub><b>William Zheng</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=magittan" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=magittan" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/yairbeer"><img src="https://avatars.githubusercontent.com/yairbeer?s=80" width="80px;" alt="Yair Beer"/><br /><sub><b>Yair Beer</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=yairbeer" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/yashlamba"><img src="https://avatars.githubusercontent.com/u/44164398?v=4?s=80" width="80px;" alt="Yash Lamba"/><br /><sub><b>Yash Lamba</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=yashlamba" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=80" width="80px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/xuyxu"><img src="https://avatars2.githubusercontent.com/u/22359569?v=4?s=80" width="80px;" alt="Yi-Xuan Xu"/><br /><sub><b>Yi-Xuan Xu</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Tests">⚠️</a> <a href="#maintenance-xuyxu" title="Maintenance">🚧</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=xuyxu" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/ZiyaoWei"><img src="https://avatars.githubusercontent.com/u/940823?v=4?s=80" width="80px;" alt="Ziyao Wei"/><br /><sub><b>Ziyao Wei</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=ZiyaoWei" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/aa25desh"><img src="https://avatars1.githubusercontent.com/u/29518290?v=4?s=80" width="80px;" alt="aa25desh"/><br /><sub><b>aa25desh</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=aa25desh" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Aaa25desh" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/abandus"><img src="https://avatars2.githubusercontent.com/u/46486474?v=4?s=80" width="80px;" alt="abandus"/><br /><sub><b>abandus</b></sub></a><br /><a href="#ideas-abandus" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=abandus" title="Code">💻</a></td>
@@ -251,9 +252,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/bethrice44"><img src="https://avatars.githubusercontent.com/u/11226988?v=4?s=80" width="80px;" alt="bethrice44"/><br /><sub><b>bethrice44</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Abethrice44" title="Bug reports">🐛</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=bethrice44" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/pulls?q=is%3Apr+reviewed-by%3Abethrice44" title="Reviewed Pull Requests">👀</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=bethrice44" title="Tests">⚠️</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/big-o"><img src="https://avatars1.githubusercontent.com/u/1134151?v=4?s=80" width="80px;" alt="big-o"/><br /><sub><b>big-o</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=big-o" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/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/aeon-toolkit/aeon/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="12.5%"><a href="https://github.com/bobbys-dev"><img src="https://avatars.githubusercontent.com/bobbys-dev?s=80" width="80px;" alt="bobbys"/><br /><sub><b>bobbys</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=bobbys-dev" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/brettkoonce"><img src="https://avatars2.githubusercontent.com/u/11281814?v=4?s=80" width="80px;" alt="brett koonce"/><br /><sub><b>brett koonce</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=brettkoonce" title="Documentation">📖</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/brettkoonce"><img src="https://avatars2.githubusercontent.com/u/11281814?v=4?s=80" width="80px;" alt="brett koonce"/><br /><sub><b>brett koonce</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=brettkoonce" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/btrtts"><img src="https://avatars3.githubusercontent.com/u/66252156?v=4?s=80" width="80px;" alt="btrtts"/><br /><sub><b>btrtts</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=btrtts" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/chizzi25"><img src="https://avatars3.githubusercontent.com/u/67911243?v=4?s=80" width="80px;" alt="chizzi25"/><br /><sub><b>chizzi25</b></sub></a><br /><a href="#blog-chizzi25" title="Blogposts">📝</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/chrisholder"><img src="https://avatars.githubusercontent.com/u/4674372?v=4?s=80" width="80px;" alt="chrisholder"/><br /><sub><b>chrisholder</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=chrisholder" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=chrisholder" title="Tests">⚠️</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=chrisholder" title="Documentation">📖</a> <a href="#design-chrisholder" title="Design">🎨</a> <a href="#example-chrisholder" title="Examples">💡</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Achrisholder" title="Bug reports">🐛</a></td>
@@ -261,9 +262,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/hamzahiqb"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=80" width="80px;" 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="12.5%"><a href="https://github.com/hiqbal2"><img src="https://avatars3.githubusercontent.com/u/10302415?v=4?s=80" width="80px;" alt="hiqbal2"/><br /><sub><b>hiqbal2</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=hiqbal2" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/jesellier"><img src="https://avatars0.githubusercontent.com/u/51952076?v=4?s=80" width="80px;" alt="jesellier"/><br /><sub><b>jesellier</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jesellier" title="Code">💻</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jschemm"><img src="https://avatars.githubusercontent.com/u/81151346?v=4?s=80" width="80px;" alt="jschemm"/><br /><sub><b>jschemm</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jschemm" title="Code">💻</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/jschemm"><img src="https://avatars.githubusercontent.com/u/81151346?v=4?s=80" width="80px;" alt="jschemm"/><br /><sub><b>jschemm</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=jschemm" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/kkoziara"><img src="https://avatars1.githubusercontent.com/u/4346849?v=4?s=80" width="80px;" alt="kkoziara"/><br /><sub><b>kkoziara</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=kkoziara" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Akkoziara" title="Bug reports">🐛</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/matteogales"><img src="https://avatars0.githubusercontent.com/u/9269326?v=4?s=80" width="80px;" alt="matteogales"/><br /><sub><b>matteogales</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/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="12.5%"><a href="https://github.com/oleskiewicz"><img src="https://avatars1.githubusercontent.com/u/5682158?v=4?s=80" width="80px;" alt="oleskiewicz"/><br /><sub><b>oleskiewicz</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=oleskiewicz" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=oleskiewicz" title="Documentation">📖</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=oleskiewicz" title="Tests">⚠️</a></td>
@@ -271,9 +272,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/xloem"><img src="https://avatars.githubusercontent.com/u/279585?v=4?s=80" width="80px;" alt="patiently pending world peace"/><br /><sub><b>patiently pending world peace</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=xloem" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/raishubham1"><img src="https://avatars3.githubusercontent.com/u/29356417?v=4?s=80" width="80px;" alt="raishubham1"/><br /><sub><b>raishubham1</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=raishubham1" title="Documentation">📖</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/simone-pignotti"><img src="https://avatars1.githubusercontent.com/u/44410066?v=4?s=80" width="80px;" alt="simone-pignotti"/><br /><sub><b>simone-pignotti</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=simone-pignotti" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/issues?q=author%3Asimone-pignotti" title="Bug reports">🐛</a></td>
-      <td align="center" valign="top" width="12.5%"><a href="https://github.com/sophijka"><img src="https://avatars2.githubusercontent.com/u/47450591?v=4?s=80" width="80px;" alt="sophijka"/><br /><sub><b>sophijka</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=sophijka" title="Documentation">📖</a> <a href="#maintenance-sophijka" title="Maintenance">🚧</a></td>
     </tr>
     <tr>
+      <td align="center" valign="top" width="12.5%"><a href="https://github.com/sophijka"><img src="https://avatars2.githubusercontent.com/u/47450591?v=4?s=80" width="80px;" alt="sophijka"/><br /><sub><b>sophijka</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=sophijka" title="Documentation">📖</a> <a href="#maintenance-sophijka" title="Maintenance">🚧</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/sri1419"><img src="https://avatars2.githubusercontent.com/u/65078278?v=4?s=80" width="80px;" alt="sri1419"/><br /><sub><b>sri1419</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=sri1419" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/tensorflow-as-tf"><img src="https://avatars.githubusercontent.com/u/51345718?v=4?s=80" width="80px;" alt="tensorflow-as-tf"/><br /><sub><b>tensorflow-as-tf</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=tensorflow-as-tf" title="Code">💻</a></td>
       <td align="center" valign="top" width="12.5%"><a href="https://github.com/vedazeren"><img src="https://avatars3.githubusercontent.com/u/63582874?v=4?s=80" width="80px;" alt="vedazeren"/><br /><sub><b>vedazeren</b></sub></a><br /><a href="https://github.com/aeon-toolkit/aeon/commits?author=vedazeren" title="Code">💻</a> <a href="https://github.com/aeon-toolkit/aeon/commits?author=vedazeren" title="Tests">⚠️</a></td>
diff --git a/aeon/datasets/__init__.py b/aeon/datasets/__init__.py
index 5ecb82dd..66c3e2ff 100644
--- a/aeon/datasets/__init__.py
+++ b/aeon/datasets/__init__.py
@@ -43,8 +43,8 @@ __all__ = [
     "load_cardano_sentiment",
     "load_covid_3month",
     # legacy load functions
-    "load_from_long_to_dataframe",
-    "load_tsf_to_dataframe",
+    "load_from_arff_to_dataframe",
+    "load_from_ucr_tsv_to_dataframe",
     "load_from_tsfile_to_dataframe",
 ]
 
@@ -66,9 +66,9 @@ from aeon.datasets._data_loaders import (
 )
 from aeon.datasets._data_writers import write_results_to_uea_format, write_to_tsfile
 from aeon.datasets._dataframe_loaders import (
-    load_from_long_to_dataframe,
+    load_from_arff_to_dataframe,
     load_from_tsfile_to_dataframe,
-    load_tsf_to_dataframe,
+    load_from_ucr_tsv_to_dataframe,
 )
 from aeon.datasets._single_problem_loaders import (
     load_acsf1,
diff --git a/aeon/datasets/_data_loaders.py b/aeon/datasets/_data_loaders.py
index 4e92d369..c6da70f2 100644
--- a/aeon/datasets/_data_loaders.py
+++ b/aeon/datasets/_data_loaders.py
@@ -11,14 +11,17 @@ from urllib.request import urlretrieve
 import numpy as np
 import pandas as pd
 
-from aeon.datasets._dataframe_loaders import DIRNAME, MODULE
+import aeon
 from aeon.datasets.dataset_collections import (
     list_downloaded_tsc_tsr_datasets,
     list_downloaded_tsf_datasets,
 )
-from aeon.datatypes import MTYPE_LIST_HIERARCHICAL, convert
 from aeon.utils.validation.collection import convert_collection
 
+DIRNAME = "data"
+MODULE = os.path.join(os.path.dirname(aeon.__file__), "datasets")
+
+
 __all__ = [  # Load functions
     "load_from_tsfile",
     "load_from_tsf_file",
@@ -103,7 +106,7 @@ def _load_header_info(file):
     return meta_data
 
 
-def _get_channel_strings(line, target, missing):
+def _get_channel_strings(line, target=True, missing="NaN"):
     """Split a string with timestamps into separate csv strings."""
     channel_strings = re.sub(r"\s", "", line)
     channel_strings = channel_strings.split("):")
@@ -295,8 +298,6 @@ def _load_saved_dataset(
         "numpy2D"/"numpy2d"/"np2d": can be used for univariate equal length series,
         although we recommend numpy3d, because some transformers do not work with
         numpy2d. If None will load 3D numpy or list of numpy
-        There other options, see datatypes.DATATYPE_REGISTER, but these
-        will not necessarily be supported longterm.
     local_module: default = os.path.dirname(__file__),
     local_dirname: default = "data"
 
@@ -531,226 +532,6 @@ def _load_tsc_dataset(
     )
 
 
-def load_tsf_to_dataframe(
-    full_file_path_and_name,
-    replace_missing_vals_with="NaN",
-    value_column_name="series_value",
-    return_type="pd_multiindex_hier",
-):
-    """
-    Convert the contents in a .tsf file into a dataframe.
-
-    This code was extracted from
-    https://github.com/rakshitha123/TSForecasting/blob
-    /master/utils/data_loader.py.
-
-    Parameters
-    ----------
-    full_file_path_and_name: str
-        The full path to the .tsf file.
-    replace_missing_vals_with: str, default="NAN"
-        A term to indicate the missing values in series in the returning dataframe.
-    value_column_name: str, default="series_value"
-        Any name that is preferred to have as the name of the column containing series
-        values in the returning dataframe.
-    return_type : str - "pd_multiindex_hier" (default), "tsf_default", or valid aeon
-        mtype string for in-memory data container format specification of the
-        return type:
-        - "pd_multiindex_hier" = pd.DataFrame of aeon type `pd_multiindex_hier`
-        - "tsf_default" = container that faithfully mirrors tsf format from the original
-            implementation in: https://github.com/rakshitha123/TSForecasting/
-            blob/master/utils/data_loader.py.
-        - other valid mtype strings are Panel or Hierarchical mtypes in
-            datatypes.MTYPE_REGISTER. If Panel or Hierarchical mtype str is given, a
-            conversion to that mtype will be attempted
-
-    Returns
-    -------
-    loaded_data: pd.DataFrame
-        The converted dataframe containing the time series.
-    metadata: dict
-        The metadata for the forecasting problem. The dictionary keys are:
-        "frequency", "forecast_horizon", "contain_missing_values",
-        "contain_equal_length"
-    """
-    col_names = []
-    col_types = []
-    all_data = {}
-    line_count = 0
-    frequency = None
-    forecast_horizon = None
-    contain_missing_values = None
-    contain_equal_length = None
-    found_data_tag = False
-    found_data_section = False
-    started_reading_data_section = False
-
-    with open(full_file_path_and_name, "r", encoding="cp1252") as file:
-        for line in file:
-            # Strip white space from start/end of line
-            line = line.strip()
-
-            if line:
-                if line.startswith("@"):  # Read meta-data
-                    if not line.startswith("@data"):
-                        line_content = line.split(" ")
-                        if line.startswith("@attribute"):
-                            if (
-                                len(line_content) != 3
-                            ):  # Attributes have both name and type
-                                raise Exception("Invalid meta-data specification.")
-
-                            col_names.append(line_content[1])
-                            col_types.append(line_content[2])
-                        else:
-                            if (
-                                len(line_content) != 2
-                            ):  # Other meta-data have only values
-                                raise Exception("Invalid meta-data specification.")
-
-                            if line.startswith("@frequency"):
-                                frequency = line_content[1]
-                            elif line.startswith("@horizon"):
-                                forecast_horizon = int(line_content[1])
-                            elif line.startswith("@missing"):
-                                contain_missing_values = bool(
-                                    strtobool(line_content[1])
-                                )
-                            elif line.startswith("@equallength"):
-                                contain_equal_length = bool(strtobool(line_content[1]))
-
-                    else:
-                        if len(col_names) == 0:
-                            raise Exception(
-                                "Missing attribute section. "
-                                "Attribute section must come before data."
-                            )
-
-                        found_data_tag = True
-                elif not line.startswith("#"):
-                    if len(col_names) == 0:
-                        raise Exception(
-                            "Missing attribute section. "
-                            "Attribute section must come before data."
-                        )
-                    elif not found_data_tag:
-                        raise Exception("Missing @data tag.")
-                    else:
-                        if not started_reading_data_section:
-                            started_reading_data_section = True
-                            found_data_section = True
-                            all_series = []
-
-                            for col in col_names:
-                                all_data[col] = []
-
-                        full_info = line.split(":")
-
-                        if len(full_info) != (len(col_names) + 1):
-                            raise Exception("Missing attributes/values in series.")
-
-                        series = full_info[len(full_info) - 1]
-                        series = series.split(",")
-
-                        if len(series) == 0:
-                            raise Exception(
-                                "A given series should contains a set "
-                                "of comma separated numeric values."
-                                "At least one numeric value should be there "
-                                "in a series. "
-                                "Missing values should be indicated with ? symbol"
-                            )
-
-                        numeric_series = []
-
-                        for val in series:
-                            if val == "?":
-                                numeric_series.append(replace_missing_vals_with)
-                            else:
-                                numeric_series.append(float(val))
-
-                        if numeric_series.count(replace_missing_vals_with) == len(
-                            numeric_series
-                        ):
-                            raise Exception(
-                                "All series values are missing. "
-                                "A given series should contains a set "
-                                "of comma separated numeric values."
-                                "At least one numeric value should be there "
-                                "in a series."
-                            )
-
-                        all_series.append(pd.Series(numeric_series).array)
-
-                        for i in range(len(col_names)):
-                            att_val = None
-                            if col_types[i] == "numeric":
-                                att_val = int(full_info[i])
-                            elif col_types[i] == "string":
-                                att_val = str(full_info[i])
-                            elif col_types[i] == "date":
-                                att_val = datetime.strptime(
-                                    full_info[i], "%Y-%m-%d %H-%M-%S"
-                                )
-                            else:
-                                # Currently, the code supports only
-                                # numeric, string and date types.
-                                # Extend this as required.
-                                raise Exception("Invalid attribute type.")
-
-                            if att_val is None:
-                                raise Exception("Invalid attribute value.")
-                            else:
-                                all_data[col_names[i]].append(att_val)
-
-                line_count = line_count + 1
-
-        if line_count == 0:
-            raise Exception("Empty file.")
-        if len(col_names) == 0:
-            raise Exception("Missing attribute section.")
-        if not found_data_section:
-            raise Exception("Missing series information under data section.")
-
-        all_data[value_column_name] = all_series
-        loaded_data = pd.DataFrame(all_data)
-
-        # metadata dict
-        metadata = dict(
-            zip(
-                (
-                    "frequency",
-                    "forecast_horizon",
-                    "contain_missing_values",
-                    "contain_equal_length",
-                ),
-                (
-                    frequency,
-                    forecast_horizon,
-                    contain_missing_values,
-                    contain_equal_length,
-                ),
-            )
-        )
-
-        if return_type != "default_tsf":
-            loaded_data = _convert_tsf_to_hierarchical(
-                loaded_data, metadata, value_column_name=value_column_name
-            )
-            if (
-                loaded_data.index.nlevels == 2
-                and return_type not in MTYPE_LIST_HIERARCHICAL
-            ):
-                loaded_data = convert(
-                    loaded_data, from_type="pd-multiindex", to_type=return_type
-                )
-            else:
-                loaded_data = convert(
-                    loaded_data, from_type="pd_multiindex_hier", to_type=return_type
-                )
-        return loaded_data, metadata
-
-
 def load_from_arff_file(
     full_file_path_and_name,
     replace_missing_vals_with="NaN",
@@ -925,6 +706,7 @@ def load_from_tsf_file(
     full_file_path_and_name,
     replace_missing_vals_with="NaN",
     value_column_name="series_value",
+    return_type="tsf_default",
 ):
     """
     Convert the contents in a .tsf file into a dataframe.
@@ -934,19 +716,23 @@ def load_from_tsf_file(
 
     Parameters
     ----------
-    full_file_path_and_name: str
+    full_file_path_and_name : str
         The full path to the .tsf file.
-    replace_missing_vals_with: str, default="NAN"
+    replace_missing_vals_with : str, default="NAN"
         A term to indicate the missing values in series in the returning dataframe.
-    value_column_name: str, default="series_value"
+    value_column_name : str, default="series_value"
         Any name that is preferred to have as the name of the column containing series
         values in the returning dataframe.
+    return_type : str - "pd_multiindex_hier" or "tsf_default" (default)
+        - "tsf_default" = container that faithfully mirrors tsf format from the original
+            implementation in: https://github.com/rakshitha123/TSForecasting/
+            blob/master/utils/data_loader.py.
 
     Returns
     -------
-    loaded_data: pd.DataFrame
+    loaded_data : pd.DataFrame
         The converted dataframe containing the time series.
-    metadata: dict
+    metadata : dict
         The metadata for the forecasting problem. The dictionary keys are:
         "frequency", "forecast_horizon", "contain_missing_values",
         "contain_equal_length"
@@ -1110,6 +896,10 @@ def load_from_tsf_file(
                 ),
             )
         )
+        if return_type != "tsf_default":
+            loaded_data = _convert_tsf_to_hierarchical(
+                loaded_data, metadata, value_column_name=value_column_name
+            )
         return loaded_data, metadata
 
 
diff --git a/aeon/datasets/_dataframe_loaders.py b/aeon/datasets/_dataframe_loaders.py
index b8d06f6c..450c2fdf 100644
--- a/aeon/datasets/_dataframe_loaders.py
+++ b/aeon/datasets/_dataframe_loaders.py
@@ -10,715 +10,72 @@ __author__ = [
 __all__ = [
     "load_from_tsfile_to_dataframe",
     "load_from_arff_to_dataframe",
-    "load_from_long_to_dataframe",
     "load_from_ucr_tsv_to_dataframe",
 ]
-
 import os
-from datetime import datetime
-from distutils.util import strtobool
 
-import numpy as np
 import pandas as pd
 
-from aeon.datasets._data_generators import _convert_tsf_to_hierarchical
-from aeon.datatypes import MTYPE_LIST_HIERARCHICAL, convert
-from aeon.datatypes._panel._convert import from_long_to_nested
+import aeon
+from aeon.datasets._data_loaders import load_from_arff_file, load_from_tsfile
+from aeon.utils.validation.collection import convert_collection
 
 DIRNAME = "data"
-MODULE = os.path.dirname(__file__)
+MODULE = os.path.join(os.path.dirname(aeon.__file__), "datasets")
 
 
 def load_from_tsfile_to_dataframe(
     full_file_path_and_name,
-    return_separate_X_and_y=True,
     replace_missing_vals_with="NaN",
 ):
-    """Load data from a .ts file into a Pandas DataFrame.
+    """Load data from a .ts file into a nested pandas DataFrame.
 
     Parameters
     ----------
-    full_file_path_and_name: str
+    full_file_path_and_name : str
         The full pathname of the .ts file to read.
-    return_separate_X_and_y: bool
-        true if X and Y values should be returned as separate Data Frames (
-        X) and a numpy array (y), false otherwise.
-        This is only relevant for data that
-    replace_missing_vals_with: str
+    replace_missing_vals_with : str
        The value that missing values in the text file should be replaced
        with prior to parsing.
 
     Returns
     -------
-    DataFrame (default) or ndarray (i
-        If return_separate_X_and_y then a tuple containing a DataFrame and a
-        numpy array containing the relevant time-series and corresponding
-        class values.
-    DataFrame
-        If not return_separate_X_and_y then a single DataFrame containing
-        all time-series and (if relevant) a column "class_vals" the
-        associated class values.
+    data : DataFrame
+        Time series data in nested pd.DataFrame format.
+    y : np.ndarray
+        Target variable.
     """
-    # Initialize flags and variables used when parsing the file
-    metadata_started = False
-    data_started = False
-
-    has_problem_name_tag = False
-    has_timestamps_tag = False
-    has_univariate_tag = False
-    has_class_labels_tag = False
-    has_data_tag = False
-
-    previous_timestamp_was_int = None
-    prev_timestamp_was_timestamp = None
-    num_dimensions = None
-    is_first_case = True
-    instance_list = []
-    class_val_list = []
-    line_num = 0
-    # Parse the file
-    with open(full_file_path_and_name, "r", encoding="utf-8") as file:
-        for line in file:
-            # Strip white space from start/end of line and change to
-            # lowercase for use below
-            line = line.strip().lower()
-            # Empty lines are valid at any point in a file
-            if line:
-                # Check if this line contains metadata
-                # Please note that even though metadata is stored in this
-                # function it is not currently published externally
-                if line.startswith("@problemname"):
-                    # Check that the data has not started
-                    if data_started:
-                        raise IOError("metadata must come before data")
-                    # Check that the associated value is valid
-                    tokens = line.split(" ")
-                    token_len = len(tokens)
-                    if token_len == 1:
-                        raise IOError("problemname tag requires an associated value")
-                    # problem_name = line[len("@problemname") + 1:]
-                    has_problem_name_tag = True
-                    metadata_started = True
-                elif line.startswith("@timestamps"):
-                    # Check that the data has not started
-                    if data_started:
-                        raise IOError("metadata must come before data")
-                    # Check that the associated value is valid
-                    tokens = line.split(" ")
-                    token_len = len(tokens)
-                    if token_len != 2:
-                        raise IOError(
-                            "timestamps tag requires an associated Boolean " "value"
-                        )
-                    elif tokens[1] == "true":
-                        timestamps = True
-                    elif tokens[1] == "false":
-                        timestamps = False
-                    else:
-                        raise IOError("invalid timestamps value")
-                    has_timestamps_tag = True
-                    metadata_started = True
-                elif line.startswith("@univariate"):
-                    # Check that the data has not started
-                    if data_started:
-                        raise IOError("metadata must come before data")
-                    # Check that the associated value is valid
-                    tokens = line.split(" ")
-                    token_len = len(tokens)
-                    if token_len != 2:
-                        raise IOError(
-                            "univariate tag requires an associated Boolean  " "value"
-                        )
-                    elif tokens[1] == "true":
-                        # univariate = True
-                        pass
-                    elif tokens[1] == "false":
-                        # univariate = False
-                        pass
-                    else:
-                        raise IOError("invalid univariate value")
-                    has_univariate_tag = True
-                    metadata_started = True
-                elif line.startswith("@classlabel"):
-                    # Check that the data has not started
-                    if data_started:
-                        raise IOError("metadata must come before data")
-                    # Check that the associated value is valid
-                    tokens = line.split(" ")
-                    token_len = len(tokens)
-                    if token_len == 1:
-                        raise IOError(
-                            "classlabel tag requires an associated Boolean  " "value"
-                        )
-                    if tokens[1] == "true":
-                        class_labels = True
-                    elif tokens[1] == "false":
-                        class_labels = False
-                    else:
-                        raise IOError("invalid classLabel value")
-                    # Check if we have any associated class values
-                    if token_len == 2 and class_labels:
-                        raise IOError(
-                            "if the classlabel tag is true then class values "
-                            "must be supplied"
-                        )
-                    has_class_labels_tag = True
-                    class_label_list = [token.strip() for token in tokens[2:]]
-                    metadata_started = True
-                elif line.startswith("@targetlabel"):
-                    if data_started:
-                        raise IOError("metadata must come before data")
-                    tokens = line.split(" ")
-                    token_len = len(tokens)
-                    if token_len == 1:
-                        raise IOError(
-                            "targetlabel tag requires an associated Boolean value"
-                        )
-                    if tokens[1] == "true":
-                        class_labels = True
-                    elif tokens[1] == "false":
-                        class_labels = False
-                    else:
-                        raise IOError("invalid targetlabel value")
-                    if token_len > 2:
-                        raise IOError(
-                            "targetlabel tag should not be accompanied with info "
-                            "apart from true/false, but found "
-                            f"{tokens}"
-                        )
-                    has_class_labels_tag = True
-                    metadata_started = True
-                # Check if this line contains the start of data
-                elif line.startswith("@data"):
-                    if line != "@data":
-                        raise IOError("data tag should not have an associated value")
-                    if data_started and not metadata_started:
-                        raise IOError("metadata must come before data")
-                    else:
-                        has_data_tag = True
-                        data_started = True
-                # If the 'data tag has been found then metadata has been
-                # parsed and data can be loaded
-                elif data_started:
-                    # Check that a full set of metadata has been provided
-                    if (
-                        not has_problem_name_tag
-                        or not has_timestamps_tag
-                        or not has_univariate_tag
-                        or not has_class_labels_tag
-                        or not has_data_tag
-                    ):
-                        raise IOError(
-                            "a full set of metadata has not been provided "
-                            "before the data"
-                        )
-                    # Replace any missing values with the value specified
-                    line = line.replace("?", replace_missing_vals_with)
-                    # Check if we are dealing with data that has timestamps
-                    if timestamps:
-                        # We're dealing with timestamps so cannot just split
-                        # line on ':' as timestamps may contain one
-                        has_another_value = False
-                        has_another_dimension = False
-                        timestamp_for_dim = []
-                        values_for_dimension = []
-                        this_line_num_dim = 0
-                        line_len = len(line)
-                        char_num = 0
-                        while char_num < line_len:
-                            # Move through any spaces
-                            while char_num < line_len and str.isspace(line[char_num]):
-                                char_num += 1
-                            # See if there is any more data to read in or if
-                            # we should validate that read thus far
-                            if char_num < line_len:
-                                # See if we have an empty dimension (i.e. no
-                                # values)
-                                if line[char_num] == ":":
-                                    if len(instance_list) < (this_line_num_dim + 1):
-                                        instance_list.append([])
-                                    instance_list[this_line_num_dim].append(
-                                        pd.Series(dtype="object")
-                                    )
-                                    this_line_num_dim += 1
-                                    has_another_value = False
-                                    has_another_dimension = True
-                                    timestamp_for_dim = []
-                                    values_for_dimension = []
-                                    char_num += 1
-                                else:
-                                    # Check if we have reached a class label
-                                    if line[char_num] != "(" and class_labels:
-                                        class_val = line[char_num:].strip()
-                                        if class_val not in class_label_list:
-                                            raise IOError(
-                                                "the class value '"
-                                                + class_val
-                                                + "' on line "
-                                                + str(line_num + 1)
-                                                + " is not "
-                                                "valid"
-                                            )
-                                        class_val_list.append(class_val)
-                                        char_num = line_len
-                                        has_another_value = False
-                                        has_another_dimension = False
-                                        timestamp_for_dim = []
-                                        values_for_dimension = []
-                                    else:
-                                        # Read in the data contained within
-                                        # the next tuple
-                                        if line[char_num] != "(" and not class_labels:
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " does "
-                                                "not "
-                                                "start "
-                                                "with a "
-                                                "'('"
-                                            )
-                                        char_num += 1
-                                        tuple_data = ""
-                                        while (
-                                            char_num < line_len
-                                            and line[char_num] != ")"
-                                        ):
-                                            tuple_data += line[char_num]
-                                            char_num += 1
-                                        if (
-                                            char_num >= line_len
-                                            or line[char_num] != ")"
-                                        ):
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " does "
-                                                "not end"
-                                                " with a "
-                                                "')'"
-                                            )
-                                        # Read in any spaces immediately
-                                        # after the current tuple
-                                        char_num += 1
-                                        while char_num < line_len and str.isspace(
-                                            line[char_num]
-                                        ):
-                                            char_num += 1
-
-                                        # Check if there is another value or
-                                        # dimension to process after this tuple
-                                        if char_num >= line_len:
-                                            has_another_value = False
-                                            has_another_dimension = False
-                                        elif line[char_num] == ",":
-                                            has_another_value = True
-                                            has_another_dimension = False
-                                        elif line[char_num] == ":":
-                                            has_another_value = False
-                                            has_another_dimension = True
-                                        char_num += 1
-                                        # Get the numeric value for the
-                                        # tuple by reading from the end of
-                                        # the tuple data backwards to the
-                                        # last comma
-                                        last_comma_index = tuple_data.rfind(",")
-                                        if last_comma_index == -1:
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " contains a tuple that has "
-                                                "no comma inside of it"
-                                            )
-                                        try:
-                                            value = tuple_data[last_comma_index + 1 :]
-                                            value = float(value)
-                                        except ValueError:
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " contains a tuple that does "
-                                                "not have a valid numeric "
-                                                "value"
-                                            )
-                                        # Check the type of timestamp that
-                                        # we have
-                                        timestamp = tuple_data[0:last_comma_index]
-                                        try:
-                                            timestamp = int(timestamp)
-                                            timestamp_is_int = True
-                                            timestamp_is_timestamp = False
-                                        except ValueError:
-                                            timestamp_is_int = False
-                                        if not timestamp_is_int:
-                                            try:
-                                                timestamp = timestamp.strip()
-                                                timestamp_is_timestamp = True
-                                            except ValueError:
-                                                timestamp_is_timestamp = False
-                                        # Make sure that the timestamps in
-                                        # the file (not just this dimension
-                                        # or case) are consistent
-                                        if (
-                                            not timestamp_is_timestamp
-                                            and not timestamp_is_int
-                                        ):
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " contains a tuple that "
-                                                "has an invalid timestamp '"
-                                                + timestamp
-                                                + "'"
-                                            )
-                                        if (
-                                            previous_timestamp_was_int is not None
-                                            and previous_timestamp_was_int
-                                            and not timestamp_is_int
-                                        ):
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " contains tuples where the "
-                                                "timestamp format is "
-                                                "inconsistent"
-                                            )
-                                        if (
-                                            prev_timestamp_was_timestamp is not None
-                                            and prev_timestamp_was_timestamp
-                                            and not timestamp_is_timestamp
-                                        ):
-                                            raise IOError(
-                                                "dimension "
-                                                + str(this_line_num_dim + 1)
-                                                + " on line "
-                                                + str(line_num + 1)
-                                                + " contains tuples where the "
-                                                "timestamp format is "
-                                                "inconsistent"
-                                            )
-                                        # Store the values
-                                        timestamp_for_dim += [timestamp]
-                                        values_for_dimension += [value]
-                                        #  If this was our first tuple then
-                                        #  we store the type of timestamp we
-                                        #  had
-                                        if (
-                                            prev_timestamp_was_timestamp is None
-                                            and timestamp_is_timestamp
-                                        ):
-                                            prev_timestamp_was_timestamp = True
-                                            previous_timestamp_was_int = False
-
-                                        if (
-                                            previous_timestamp_was_int is None
-                                            and timestamp_is_int
-                                        ):
-                                            prev_timestamp_was_timestamp = False
-                                            previous_timestamp_was_int = True
-                                        # See if we should add the data for
-                                        # this dimension
-                                        if not has_another_value:
-                                            if len(instance_list) < (
-                                                this_line_num_dim + 1
-                                            ):
-                                                instance_list.append([])
-
-                                            if timestamp_is_timestamp:
-                                                timestamp_for_dim = pd.DatetimeIndex(
-                                                    timestamp_for_dim
-                                                )
-
-                                            instance_list[this_line_num_dim].append(
-                                                pd.Series(
-                                                    index=timestamp_for_dim,
-                                                    data=values_for_dimension,
-                                                )
-                                            )
-                                            this_line_num_dim += 1
-                                            timestamp_for_dim = []
-                                            values_for_dimension = []
-                            elif has_another_value:
-                                raise IOError(
-                                    "dimension " + str(this_line_num_dim + 1) + " on "
-                                    "line "
-                                    + str(line_num + 1)
-                                    + " ends with a ',' that "
-                                    "is not followed by "
-                                    "another tuple"
-                                )
-                            elif has_another_dimension and class_labels:
-                                raise IOError(
-                                    "dimension " + str(this_line_num_dim + 1) + " on "
-                                    "line "
-                                    + str(line_num + 1)
-                                    + " ends with a ':' while "
-                                    "it should list a class "
-                                    "value"
-                                )
-                            elif has_another_dimension and not class_labels:
-                                if len(instance_list) < (this_line_num_dim + 1):
-                                    instance_list.append([])
-                                instance_list[this_line_num_dim].append(
-                                    pd.Series(dtype=np.float32)
-                                )
-                                this_line_num_dim += 1
-                                num_dimensions = this_line_num_dim
-                            # If this is the 1st line of data we have seen
-                            # then note the dimensions
-                            if not has_another_value and not has_another_dimension:
-                                if num_dimensions is None:
-                                    num_dimensions = this_line_num_dim
-                                if num_dimensions != this_line_num_dim:
-                                    raise IOError(
-                                        "line "
-                                        + str(line_num + 1)
-                                        + " does not have the "
-                                        "same number of "
-                                        "dimensions as the "
-                                        "previous line of "
-                                        "data"
-                                    )
-                        # Check that we are not expecting some more data,
-                        # and if not, store that processed above
-                        if has_another_value:
-                            raise IOError(
-                                "dimension "
-                                + str(this_line_num_dim + 1)
-                                + " on line "
-                                + str(line_num + 1)
-                                + " ends with a ',' that is "
-                                "not followed by another "
-                                "tuple"
-                            )
-                        elif has_another_dimension and class_labels:
-                            raise IOError(
-                                "dimension "
-                                + str(this_line_num_dim + 1)
-                                + " on line "
-                                + str(line_num + 1)
-                                + " ends with a ':' while it "
-                                "should list a class value"
-                            )
-                        elif has_another_dimension and not class_labels:
-                            if len(instance_list) < (this_line_num_dim + 1):
-                                instance_list.append([])
-                            instance_list[this_line_num_dim].append(
-                                pd.Series(dtype="object")
-                            )
-                            this_line_num_dim += 1
-                            num_dimensions = this_line_num_dim
-                        # If this is the 1st line of data we have seen then
-                        # note the dimensions
-                        if (
-                            not has_another_value
-                            and num_dimensions != this_line_num_dim
-                        ):
-                            raise IOError(
-                                "line " + str(line_num + 1) + " does not have the same "
-                                "number of dimensions as the "
-                                "previous line of data"
-                            )
-                        # Check if we should have class values, and if so
-                        # that they are contained in those listed in the
-                        # metadata
-                        if class_labels and len(class_val_list) == 0:
-                            raise IOError("the cases have no associated class values")
-                    else:
-                        dimensions = line.split(":")
-                        # If first row then note the number of dimensions (
-                        # that must be the same for all cases)
-                        if is_first_case:
-                            num_dimensions = len(dimensions)
-                            if class_labels:
-                                num_dimensions -= 1
-                            for _dim in range(0, num_dimensions):
-                                instance_list.append([])
-                            is_first_case = False
-                        # See how many dimensions that the case whose data
-                        # in represented in this line has
-                        this_line_num_dim = len(dimensions)
-                        if class_labels:
-                            this_line_num_dim -= 1
-                        # All dimensions should be included for all series,
-                        # even if they are empty
-                        if this_line_num_dim != num_dimensions:
-                            raise IOError(
-                                "inconsistent number of dimensions. "
-                                "Expecting "
-                                + str(num_dimensions)
-                                + " but have read "
-                                + str(this_line_num_dim)
-                            )
-                        # Process the data for each dimension
-                        for dim in range(0, num_dimensions):
-                            dimension = dimensions[dim].strip()
-
-                            if dimension:
-                                data_series = dimension.split(",")
-                                data_series = [float(i) for i in data_series]
-                                instance_list[dim].append(pd.Series(data_series))
-                            else:
-                                instance_list[dim].append(pd.Series(dtype="object"))
-                        if class_labels:
-                            class_val_list.append(dimensions[num_dimensions].strip())
-            line_num += 1
-    # Check that the file was not empty
-    if line_num:
-        # Check that the file contained both metadata and data
-        if metadata_started and not (
-            has_problem_name_tag
-            and has_timestamps_tag
-            and has_univariate_tag
-            and has_class_labels_tag
-            and has_data_tag
-        ):
-            raise IOError("metadata incomplete")
-
-        elif metadata_started and not data_started:
-            raise IOError("file contained metadata but no data")
-
-        elif metadata_started and data_started and len(instance_list) == 0:
-            raise IOError("file contained metadata but no data")
-        # Create a DataFrame from the data parsed above
-        data = pd.DataFrame(dtype=np.float32)
-        for dim in range(0, num_dimensions):
-            data["var_" + str(dim)] = instance_list[dim]
-        # Check if we should return any associated class labels separately
-        if class_labels:
-            if return_separate_X_and_y:
-                return data, np.asarray(class_val_list)
-            else:
-                data["class_vals"] = pd.Series(class_val_list)
-                return data
-        else:
-            return data
-    else:
-        raise IOError("empty file")
+    X, y = load_from_tsfile(full_file_path_and_name, replace_missing_vals_with)
+    # Convert
+    X = convert_collection(X, output_type="nested_univ")
+    return X, y
 
 
 def load_from_arff_to_dataframe(
     full_file_path_and_name,
-    has_class_labels=True,
-    return_separate_X_and_y=True,
     replace_missing_vals_with="NaN",
 ):
-    """Load data from a .ts file into a Pandas DataFrame.
+    """Load data from a .arff file into a nested pandas DataFrame.
 
     Parameters
     ----------
-    full_file_path_and_name: str
+    full_file_path_and_name : str
         The full pathname of the .ts file to read.
-    has_class_labels: bool
-        true then line contains separated strings and class value contains
-        list of separated strings, check for 'return_separate_X_and_y'
-        false otherwise.
-    return_separate_X_and_y: bool
-        true then X and Y values should be returned as separate Data Frames (
-        X) and a numpy array (y), false otherwise.
-        This is only relevant for data.
-    replace_missing_vals_with: str
+    replace_missing_vals_with : str
        The value that missing values in the text file should be replaced
        with prior to parsing.
 
     Returns
     -------
-    DataFrame, ndarray
-        If return_separate_X_and_y then a tuple containing a DataFrame and a
-        numpy array containing the relevant time-series and corresponding
-        class values.
-    DataFrame
-        If not return_separate_X_and_y then a single DataFrame containing
-        all time-series and (if relevant) a column "class_vals" the
-        associated class values.
+    data : DataFrame
+        Time series data in nested pd.DataFrame format.
+    y : np.ndarray
+        Target variable.
     """
-    instance_list = []
-    y = []
-    data_started = False
-    is_multi_variate = False
-    is_first_case = True
-    # Parse the file
-    # print(full_file_path_and_name)
-    with open(full_file_path_and_name, "r", encoding="utf-8") as f:
-        for line in f:
-            if line.strip():
-                if (
-                    is_multi_variate is False
-                    and "@attribute" in line.lower()
-                    and "relational" in line.lower()
-                ):
-                    is_multi_variate = True
-
-                if "@data" in line.lower():
-                    data_started = True
-                    continue
-                # if the 'data tag has been found, the header information
-                # has been cleared and now data can be loaded
-                if data_started:
-                    line = line.replace("?", replace_missing_vals_with)
-
-                    if is_multi_variate:
-                        if has_class_labels:
-                            line, class_val = line.split("',")
-                            y.append(class_val.strip())
-                        dimensions = line.split("\\n")
-                        dimensions[0] = dimensions[0].replace("'", "")
-
-                        if is_first_case:
-                            for _d in range(len(dimensions)):
-                                instance_list.append([])
-                            is_first_case = False
-
-                        for dim in range(len(dimensions)):
-                            instance_list[dim].append(
-                                pd.Series(
-                                    [float(i) for i in dimensions[dim].split(",")]
-                                )
-                            )
-
-                    else:
-                        if is_first_case:
-                            instance_list.append([])
-                            is_first_case = False
-
-                        line_parts = line.split(",")
-                        if has_class_labels:
-                            instance_list[0].append(
-                                pd.Series(
-                                    [
-                                        float(i)
-                                        for i in line_parts[: len(line_parts) - 1]
-                                    ]
-                                )
-                            )
-                            y.append(line_parts[-1].strip())
-                        else:
-                            instance_list[0].append(
-                                pd.Series(
-                                    [float(i) for i in line_parts[: len(line_parts)]]
-                                )
-                            )
-    X = pd.DataFrame(dtype=np.float32)
-    for dim in range(len(instance_list)):
-        X["var_" + str(dim)] = instance_list[dim]
-    if has_class_labels:
-        if return_separate_X_and_y:
-            return X, np.asarray(y)
-        else:
-            X["class_vals"] = pd.Series(y)
-    return X
+    X, y = load_from_arff_file(full_file_path_and_name, replace_missing_vals_with)
+    # Convert
+    X = convert_collection(X, output_type="nested_univ")
+    return X, y
 
 
 def load_from_ucr_tsv_to_dataframe(
@@ -755,256 +112,3 @@ def load_from_ucr_tsv_to_dataframe(
         return X, y
     X["class_val"] = y
     return X
-
-
-def load_from_long_to_dataframe(full_file_path_and_name, separator=","):
-    """Load data from a long format file into a Pandas DataFrame.
-
-    Parameters
-    ----------
-    full_file_path_and_name: str
-        The full pathname of the .csv file to read.
-    separator: str
-        The character that the csv uses as a delimiter
-
-    Returns
-    -------
-    DataFrame
-        A dataframe with aeon-formatted data
-    """
-    data = pd.read_csv(full_file_path_and_name, sep=separator, header=0)
-    # ensure there are 4 columns in the long_format table
-    if len(data.columns) != 4:
-        raise ValueError("dataframe must contain 4 columns of data")
-    # ensure that all columns contain the correct data types
-    if (
-        not data.iloc[:, 0].dtype == "int64"
-        or not data.iloc[:, 1].dtype == "int64"
-        or not data.iloc[:, 2].dtype == "int64"
-        or not data.iloc[:, 3].dtype == "float64"
-    ):
-        raise ValueError("one or more data columns contains data of an incorrect type")
-
-    data = from_long_to_nested(data)
-    return data
-
-
-def load_tsf_to_dataframe(
-    full_file_path_and_name,
-    replace_missing_vals_with="NaN",
-    value_column_name="series_value",
-    return_type="pd_multiindex_hier",
-):
-    """
-    Convert the contents in a .tsf file into a dataframe.
-
-    This code was extracted from
-    https://github.com/rakshitha123/TSForecasting/blob
-    /master/utils/data_loader.py.
-
-    Parameters
-    ----------
-    full_file_path_and_name: str
-        The full path to the .tsf file.
-    replace_missing_vals_with: str, default="NAN"
-        A term to indicate the missing values in series in the returning dataframe.
-    value_column_name: str, default="series_value"
-        Any name that is preferred to have as the name of the column containing series
-        values in the returning dataframe.
-    return_type : str - "pd_multiindex_hier" (default), "tsf_default", or valid aeon
-        mtype string for in-memory data container format specification of the
-        return type:
-        - "pd_multiindex_hier" = pd.DataFrame of aeon type `pd_multiindex_hier`
-        - "tsf_default" = container that faithfully mirrors tsf format from the original
-            implementation in: https://github.com/rakshitha123/TSForecasting/
-            blob/master/utils/data_loader.py.
-        - other valid mtype strings are Panel or Hierarchical mtypes in
-            datatypes.MTYPE_REGISTER. If Panel or Hierarchical mtype str is given, a
-            conversion to that mtype will be attempted
-
-    Returns
-    -------
-    loaded_data: pd.DataFrame
-        The converted dataframe containing the time series.
-    metadata: dict
-        The metadata for the forecasting problem. The dictionary keys are:
-        "frequency", "forecast_horizon", "contain_missing_values",
-        "contain_equal_length"
-    """
-    col_names = []
-    col_types = []
-    all_data = {}
-    line_count = 0
-    frequency = None
-    forecast_horizon = None
-    contain_missing_values = None
-    contain_equal_length = None
-    found_data_tag = False
-    found_data_section = False
-    started_reading_data_section = False
-
-    with open(full_file_path_and_name, "r", encoding="cp1252") as file:
-        for line in file:
-            # Strip white space from start/end of line
-            line = line.strip()
-
-            if line:
-                if line.startswith("@"):  # Read meta-data
-                    if not line.startswith("@data"):
-                        line_content = line.split(" ")
-                        if line.startswith("@attribute"):
-                            if (
-                                len(line_content) != 3
-                            ):  # Attributes have both name and type
-                                raise Exception("Invalid meta-data specification.")
-
-                            col_names.append(line_content[1])
-                            col_types.append(line_content[2])
-                        else:
-                            if (
-                                len(line_content) != 2
-                            ):  # Other meta-data have only values
-                                raise Exception("Invalid meta-data specification.")
-
-                            if line.startswith("@frequency"):
-                                frequency = line_content[1]
-                            elif line.startswith("@horizon"):
-                                forecast_horizon = int(line_content[1])
-                            elif line.startswith("@missing"):
-                                contain_missing_values = bool(
-                                    strtobool(line_content[1])
-                                )
-                            elif line.startswith("@equallength"):
-                                contain_equal_length = bool(strtobool(line_content[1]))
-
-                    else:
-                        if len(col_names) == 0:
-                            raise Exception(
-                                "Missing attribute section. "
-                                "Attribute section must come before data."
-                            )
-
-                        found_data_tag = True
-                elif not line.startswith("#"):
-                    if len(col_names) == 0:
-                        raise Exception(
-                            "Missing attribute section. "
-                            "Attribute section must come before data."
-                        )
-                    elif not found_data_tag:
-                        raise Exception("Missing @data tag.")
-                    else:
-                        if not started_reading_data_section:
-                            started_reading_data_section = True
-                            found_data_section = True
-                            all_series = []
-
-                            for col in col_names:
-                                all_data[col] = []
-
-                        full_info = line.split(":")
-
-                        if len(full_info) != (len(col_names) + 1):
-                            raise Exception("Missing attributes/values in series.")
-
-                        series = full_info[len(full_info) - 1]
-                        series = series.split(",")
-
-                        if len(series) == 0:
-                            raise Exception(
-                                "A given series should contains a set "
-                                "of comma separated numeric values."
-                                "At least one numeric value should be there "
-                                "in a series. "
-                                "Missing values should be indicated with ? symbol"
-                            )
-
-                        numeric_series = []
-
-                        for val in series:
-                            if val == "?":
-                                numeric_series.append(replace_missing_vals_with)
-                            else:
-                                numeric_series.append(float(val))
-
-                        if numeric_series.count(replace_missing_vals_with) == len(
-                            numeric_series
-                        ):
-                            raise Exception(
-                                "All series values are missing. "
-                                "A given series should contains a set "
-                                "of comma separated numeric values."
-                                "At least one numeric value should be there "
-                                "in a series."
-                            )
-
-                        all_series.append(pd.Series(numeric_series).array)
-
-                        for i in range(len(col_names)):
-                            att_val = None
-                            if col_types[i] == "numeric":
-                                att_val = int(full_info[i])
-                            elif col_types[i] == "string":
-                                att_val = str(full_info[i])
-                            elif col_types[i] == "date":
-                                att_val = datetime.strptime(
-                                    full_info[i], "%Y-%m-%d %H-%M-%S"
-                                )
-                            else:
-                                # Currently, the code supports only
-                                # numeric, string and date types.
-                                # Extend this as required.
-                                raise Exception("Invalid attribute type.")
-
-                            if att_val is None:
-                                raise Exception("Invalid attribute value.")
-                            else:
-                                all_data[col_names[i]].append(att_val)
-
-                line_count = line_count + 1
-
-        if line_count == 0:
-            raise Exception("Empty file.")
-        if len(col_names) == 0:
-            raise Exception("Missing attribute section.")
-        if not found_data_section:
-            raise Exception("Missing series information under data section.")
-
-        all_data[value_column_name] = all_series
-        loaded_data = pd.DataFrame(all_data)
-
-        # metadata dict
-        metadata = dict(
-            zip(
-                (
-                    "frequency",
-                    "forecast_horizon",
-                    "contain_missing_values",
-                    "contain_equal_length",
-                ),
-                (
-                    frequency,
-                    forecast_horizon,
-                    contain_missing_values,
-                    contain_equal_length,
-                ),
-            )
-        )
-
-        if return_type != "default_tsf":
-            loaded_data = _convert_tsf_to_hierarchical(
-                loaded_data, metadata, value_column_name=value_column_name
-            )
-            if (
-                loaded_data.index.nlevels == 2
-                and return_type not in MTYPE_LIST_HIERARCHICAL
-            ):
-                loaded_data = convert(
-                    loaded_data, from_type="pd-multiindex", to_type=return_type
-                )
-            else:
-                loaded_data = convert(
-                    loaded_data, from_type="pd_multiindex_hier", to_type=return_type
-                )
-
-        return loaded_data, metadata
diff --git a/aeon/datasets/_single_problem_loaders.py b/aeon/datasets/_single_problem_loaders.py
index e9cc1c4b..decd7360 100644
--- a/aeon/datasets/_single_problem_loaders.py
+++ b/aeon/datasets/_single_problem_loaders.py
@@ -46,8 +46,8 @@ from warnings import warn
 import numpy as np
 import pandas as pd
 
+from aeon.datasets import load_from_tsf_file
 from aeon.datasets._data_loaders import _load_saved_dataset, _load_tsc_dataset
-from aeon.datasets._dataframe_loaders import load_tsf_to_dataframe
 from aeon.utils.validation._dependencies import _check_soft_dependencies
 
 DIRNAME = "data"
@@ -899,10 +899,17 @@ def load_macroeconomic():
     return y
 
 
-def load_unit_test_tsf():
+def load_unit_test_tsf(return_type="tsf_default"):
     """
     Load tsf UnitTest dataset.
 
+    Parameters
+    ----------
+    return_type : str - "pd_multiindex_hier" or "tsf_default" (default)
+        - "tsf_default" = container that faithfully mirrors tsf format from the original
+            implementation in: https://github.com/rakshitha123/TSForecasting/
+            blob/master/utils/data_loader.py.
+
     Returns
     -------
     loaded_data: pd.DataFrame
@@ -917,7 +924,7 @@ def load_unit_test_tsf():
         Whether the series have equal lengths or not.
     """
     path = os.path.join(MODULE, DIRNAME, "UnitTest", "UnitTest_Tsf_Loader.tsf")
-    data, meta = load_tsf_to_dataframe(path)
+    data, meta = load_from_tsf_file(path, return_type=return_type)
     return (
         data,
         meta["frequency"],
diff --git a/aeon/datasets/dataset_collections.py b/aeon/datasets/dataset_collections.py
index ae4636b2..b6d3a377 100644
--- a/aeon/datasets/dataset_collections.py
+++ b/aeon/datasets/dataset_collections.py
@@ -35,11 +35,13 @@ __all__ = [
 ]
 import os
 
-from aeon.datasets._dataframe_loaders import MODULE
+import aeon
 from aeon.datasets.tsc_data_lists import multivariate, univariate
 from aeon.datasets.tser_data_lists import tser_all
 from aeon.datasets.tsf_data_lists import tsf_all
 
+MODULE = os.path.join(os.path.dirname(aeon.__file__), "datasets")
+
 
 def list_available_tser_datasets(name=None):
     """List available tser data."""


Test patch:
diff --git a/aeon/datasets/tests/test_data_generators.py b/aeon/datasets/tests/test_data_generators.py
new file mode 100644
index 00000000..898d14f0
--- /dev/null
+++ b/aeon/datasets/tests/test_data_generators.py
@@ -0,0 +1,89 @@
+"""Test functions for data input and output."""
+
+import pandas as pd
+import pytest
+from pandas.testing import assert_frame_equal
+
+from aeon.datasets._data_generators import _convert_tsf_to_hierarchical
+
+
+@pytest.mark.parametrize("freq", [None, "YS"])
+def test_convert_tsf_to_multiindex(freq):
+    """Test convert_tsf_to_multiindex method."""
+    input_df = pd.DataFrame(
+        {
+            "series_name": ["T1", "T2", "T3"],
+            "start_timestamp": [
+                pd.Timestamp(year=1979, month=1, day=1),
+                pd.Timestamp(year=1979, month=1, day=1),
+                pd.Timestamp(year=1973, month=1, day=1),
+            ],
+            "series_value": [
+                [
+                    25092.2284,
+                    24271.5134,
+                    25828.9883,
+                    27697.5047,
+                    27956.2276,
+                    29924.4321,
+                    30216.8321,
+                ],
+                [887896.51, 887068.98, 971549.04],
+                [227921, 230995, 183635, 238605, 254186],
+            ],
+        }
+    )
+
+    output_df = pd.DataFrame(
+        data=[
+            25092.2284,
+            24271.5134,
+            25828.9883,
+            27697.5047,
+            27956.2276,
+            29924.4321,
+            30216.8321,
+            887896.51,
+            887068.98,
+            971549.04,
+            227921,
+            230995,
+            183635,
+            238605,
+            254186,
+        ],
+        index=pd.MultiIndex.from_tuples(
+            [
+                ("T1", pd.Timestamp(year=1979, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1980, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1981, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1982, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1983, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1984, month=1, day=1)),
+                ("T1", pd.Timestamp(year=1985, month=1, day=1)),
+                ("T2", pd.Timestamp(year=1979, month=1, day=1)),
+                ("T2", pd.Timestamp(year=1980, month=1, day=1)),
+                ("T2", pd.Timestamp(year=1981, month=1, day=1)),
+                ("T3", pd.Timestamp(year=1973, month=1, day=1)),
+                ("T3", pd.Timestamp(year=1974, month=1, day=1)),
+                ("T3", pd.Timestamp(year=1975, month=1, day=1)),
+                ("T3", pd.Timestamp(year=1976, month=1, day=1)),
+                ("T3", pd.Timestamp(year=1977, month=1, day=1)),
+            ],
+            names=["series_name", "timestamp"],
+        ),
+        columns=["series_value"],
+    )
+
+    metadata = {
+        "frequency": "yearly",
+        "forecast_horizon": 4,
+        "contain_missing_values": False,
+        "contain_equal_length": False,
+    }
+
+    assert_frame_equal(
+        output_df,
+        _convert_tsf_to_hierarchical(input_df, metadata, freq=freq),
+        check_dtype=False,
+    )
diff --git a/aeon/datasets/tests/test_data_loaders.py b/aeon/datasets/tests/test_data_loaders.py
index 11ea0ce3..230dbc15 100644
--- a/aeon/datasets/tests/test_data_loaders.py
+++ b/aeon/datasets/tests/test_data_loaders.py
@@ -11,29 +11,19 @@ import tempfile
 import numpy as np
 import pandas as pd
 import pytest
-from pandas.testing import assert_frame_equal
 
 import aeon
 from aeon.datasets import (
     load_classification,
     load_forecasting,
     load_from_arff_file,
-    load_from_long_to_dataframe,
-    load_from_tsf_file,
     load_from_tsfile,
     load_from_tsv_file,
     load_regression,
-    load_tsf_to_dataframe,
-    load_uschange,
-)
-from aeon.datasets._data_generators import (
-    _convert_tsf_to_hierarchical,
-    make_example_long_table,
 )
 from aeon.datasets._data_loaders import (
-    DIRNAME,
-    MODULE,
     _alias_datatype_check,
+    _get_channel_strings,
     _load_data,
     _load_header_info,
     _load_saved_dataset,
@@ -150,8 +140,11 @@ def test__alias_datatype_check():
     reason="Only run on overnights because of intermittent fail for read/write",
 )
 def test__load_header_info():
+    path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/UnitTest/UnitTest_TRAIN.ts",
+    )
     """Test loading a header."""
-    path = os.path.join(MODULE, DIRNAME, "UnitTest", "UnitTest_TRAIN.ts")
     with open(path, "r", encoding="utf-8") as file:
         # Read in headers
         meta_data = _load_header_info(file)
@@ -194,20 +187,29 @@ def test__load_header_info():
 )
 def test__load_data():
     """Test loading after header."""
-    path = os.path.join(MODULE, DIRNAME, "UnitTest", "UnitTest_TRAIN.ts")
+    path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/UnitTest/UnitTest_TRAIN.ts",
+    )
     with open(path, "r", encoding="utf-8") as file:
         meta_data = _load_header_info(file)
         X, y, _ = _load_data(file, meta_data)
         assert X.shape == (20, 1, 24)
         assert len(y) == 20
-    path = os.path.join(MODULE, DIRNAME, "BasicMotions", "BasicMotions_TRAIN.ts")
+    path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/BasicMotions/BasicMotions_TRAIN.ts",
+    )
     with open(path, "r", encoding="utf-8") as file:
         meta_data = _load_header_info(file)
         # Check raise error for incorrect univariate test
         meta_data["univariate"] = True
         with pytest.raises(IOError):
             X, y, _ = _load_data(file, meta_data)
-    path = os.path.join(MODULE, DIRNAME, "JapaneseVowels", "JapaneseVowels_TRAIN.ts")
+    path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/JapaneseVowels/JapaneseVowels_TRAIN.ts",
+    )
     with open(path, "r", encoding="utf-8") as file:
         meta_data = _load_header_info(file)
         # Check raise error for incorrect univariate test
@@ -293,10 +295,14 @@ def test_load_from_tsfile():
     2. Multivariate equal length (BasicMotions) returns 3D numpy X, 1D numpy y
     3. Univariate and multivariate unequal length (PLAID) return X as list of numpy
     """
-    data_path = MODULE + "/" + DIRNAME + "/UnitTest/UnitTest_TRAIN.ts"
+
     # Test 1.1: load univariate equal length (UnitTest), should return 2D array and 1D
     # array, test first and last data
     # Test 1.2: Load a problem without y values (UnitTest),  test first and last data.
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/UnitTest/UnitTest_TRAIN.ts",
+    )
     X, y = load_from_tsfile(data_path, return_meta_data=False)
     assert isinstance(X, np.ndarray) and isinstance(y, np.ndarray)
     assert X.ndim == 3
@@ -310,7 +316,10 @@ def test_load_from_tsfile():
 
     # Test 2: load multivare equal length (BasicMotions), should return 3D array and 1D
     # array, test first and last data.
-    data_path = MODULE + "/data/BasicMotions/BasicMotions_TRAIN.ts"
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/BasicMotions/BasicMotions_TRAIN.ts",
+    )
     X, y = load_from_tsfile(data_path, return_meta_data=False)
     assert isinstance(X, np.ndarray) and isinstance(y, np.ndarray)
     assert X.shape == (40, 6, 100) and y.shape == (40,)
@@ -323,357 +332,23 @@ def test_load_from_tsfile():
 
     # Test 3.1: load univariate unequal length (PLAID), should return a one column
     # dataframe,
-    data_path = MODULE + "/data/PLAID/PLAID_TRAIN.ts"
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/PLAID/PLAID_TRAIN.ts",
+    )
+
     X, y = load_from_tsfile(full_file_path_and_name=data_path, return_meta_data=False)
     assert isinstance(X, list) and isinstance(y, np.ndarray)
     assert len(X) == 537 and y.shape == (537,)
     # Test 3.2: load multivariate unequal length (JapaneseVowels), should return a X
     # columns dataframe,
-    data_path = MODULE + "/data/JapaneseVowels/JapaneseVowels_TRAIN.ts"
-    X, y = load_from_tsfile(full_file_path_and_name=data_path, return_meta_data=False)
-    assert isinstance(X, list) and isinstance(y, np.ndarray)
-    assert len(X) == 270 and y.shape == (270,)
-
-
-_CHECKS = {
-    "uschange": {
-        "columns": ["Income", "Production", "Savings", "Unemployment"],
-        "len_y": 187,
-        "len_X": 187,
-        "data_types_X": {
-            "Income": "float64",
-            "Production": "float64",
-            "Savings": "float64",
-            "Unemployment": "float64",
-        },
-        "data_type_y": "float64",
-        "data": load_uschange(),
-    },
-}
-
-
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-@pytest.mark.parametrize("dataset", sorted(_CHECKS.keys()))
-def test_forecasting_data_loaders(dataset):
-    """
-    Assert if datasets are loaded correctly.
-
-    dataset: dictionary with values to assert against should contain:
-        'columns' : list with column names in correct order,
-        'len_y'   : lenght of the y series (int),
-        'len_X'   : lenght of the X series/dataframe (int),
-        'data_types_X' : dictionary with column name keys and dtype as value,
-        'data_type_y'  : dtype if y column (string)
-        'data'    : tuple with y series and X series/dataframe if one is not
-                    applicable fill with None value,
-    """
-    checks = _CHECKS[dataset]
-    y = checks["data"][0]
-    X = checks["data"][1]
-
-    if y is not None:
-        assert isinstance(y, pd.Series)
-        assert len(y) == checks["len_y"]
-        assert y.dtype == checks["data_type_y"]
-
-    if X is not None:
-        if len(checks["data_types_X"]) > 1:
-            assert isinstance(X, pd.DataFrame)
-        else:
-            assert isinstance(X, pd.Series)
-
-        assert X.columns.values.tolist() == checks["columns"]
-
-        for col, dt in checks["data_types_X"].items():
-            assert X[col].dtype == dt
-
-        assert len(X) == checks["len_X"]
-
-
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-def test_load_from_long_to_dataframe(tmpdir):
-    """Test for loading from long to dataframe."""
-    # create and save a example long-format file to csv
-    test_dataframe = make_example_long_table()
-    dataframe_path = tmpdir.join("data.csv")
-    test_dataframe.to_csv(dataframe_path, index=False)
-    # load and convert the csv to aeon-formatted data
-    nested_dataframe = load_from_long_to_dataframe(dataframe_path)
-    assert isinstance(nested_dataframe, pd.DataFrame)
-
-
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-def test_load_from_long_incorrect_format(tmpdir):
-    """Test for loading from long with incorrect format."""
-    with pytest.raises(ValueError):
-        dataframe = make_example_long_table()
-        dataframe.drop(dataframe.columns[[3]], axis=1, inplace=True)
-        dataframe_path = tmpdir.join("data.csv")
-        dataframe.to_csv(dataframe_path, index=False)
-        load_from_long_to_dataframe(dataframe_path)
-
-
-@pytest.mark.parametrize(
-    "input_path, return_type, output_df",
-    [
-        (
-            "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
-            "default_tsf",
-            pd.DataFrame(
-                {
-                    "series_name": ["T1", "T2", "T3"],
-                    "start_timestamp": [
-                        pd.Timestamp(year=1979, month=1, day=1),
-                        pd.Timestamp(year=1979, month=1, day=1),
-                        pd.Timestamp(year=1973, month=1, day=1),
-                    ],
-                    "series_value": [
-                        [
-                            25092.2284,
-                            24271.5134,
-                            25828.9883,
-                            27697.5047,
-                            27956.2276,
-                            29924.4321,
-                            30216.8321,
-                        ],
-                        [887896.51, 887068.98, 971549.04],
-                        [227921, 230995, 183635, 238605, 254186],
-                    ],
-                }
-            ),
-        ),
-        (
-            "datasets/data/UnitTest/UnitTest_Tsf_Loader_hierarchical.tsf",
-            "pd_multiindex_hier",
-            pd.DataFrame(
-                data=[
-                    25092.2284,
-                    24271.5134,
-                    25828.9883,
-                    27697.5047,
-                    27956.2276,
-                    29924.4321,
-                    30216.8321,
-                    887896.51,
-                    887068.98,
-                    971549.04,
-                    227921,
-                    230995,
-                    183635,
-                    238605,
-                    254186,
-                ],
-                index=pd.MultiIndex.from_tuples(
-                    [
-                        ("G1", "T1", pd.Timestamp(year=1979, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1980, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1981, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1982, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1983, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1984, month=1, day=1)),
-                        ("G1", "T1", pd.Timestamp(year=1985, month=1, day=1)),
-                        ("G1", "T2", pd.Timestamp(year=1979, month=1, day=1)),
-                        ("G1", "T2", pd.Timestamp(year=1980, month=1, day=1)),
-                        ("G1", "T2", pd.Timestamp(year=1981, month=1, day=1)),
-                        ("G2", "T3", pd.Timestamp(year=1973, month=1, day=1)),
-                        ("G2", "T3", pd.Timestamp(year=1974, month=1, day=1)),
-                        ("G2", "T3", pd.Timestamp(year=1975, month=1, day=1)),
-                        ("G2", "T3", pd.Timestamp(year=1976, month=1, day=1)),
-                        ("G2", "T3", pd.Timestamp(year=1977, month=1, day=1)),
-                    ],
-                    names=["series_group", "series_name", "timestamp"],
-                ),
-                columns=["series_value"],
-            ),
-        ),
-        (
-            "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
-            "pd-multiindex",
-            pd.DataFrame(
-                data=[
-                    25092.2284,
-                    24271.5134,
-                    25828.9883,
-                    27697.5047,
-                    27956.2276,
-                    29924.4321,
-                    30216.8321,
-                    887896.51,
-                    887068.98,
-                    971549.04,
-                    227921,
-                    230995,
-                    183635,
-                    238605,
-                    254186,
-                ],
-                index=pd.MultiIndex.from_tuples(
-                    [
-                        ("T1", pd.Timestamp(year=1979, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1980, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1981, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1982, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1983, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1984, month=1, day=1)),
-                        ("T1", pd.Timestamp(year=1985, month=1, day=1)),
-                        ("T2", pd.Timestamp(year=1979, month=1, day=1)),
-                        ("T2", pd.Timestamp(year=1980, month=1, day=1)),
-                        ("T2", pd.Timestamp(year=1981, month=1, day=1)),
-                        ("T3", pd.Timestamp(year=1973, month=1, day=1)),
-                        ("T3", pd.Timestamp(year=1974, month=1, day=1)),
-                        ("T3", pd.Timestamp(year=1975, month=1, day=1)),
-                        ("T3", pd.Timestamp(year=1976, month=1, day=1)),
-                        ("T3", pd.Timestamp(year=1977, month=1, day=1)),
-                    ],
-                    names=["series_name", "timestamp"],
-                ),
-                columns=["series_value"],
-            ),
-        ),
-        (
-            "datasets/data/UnitTest/UnitTest_Tsf_Loader_no_start_timestamp.tsf",
-            "default_tsf",
-            pd.DataFrame(
-                {
-                    "series_name": ["T1", "T2", "T3"],
-                    "series_value": [
-                        [
-                            25092.2284,
-                            24271.5134,
-                            25828.9883,
-                            27697.5047,
-                            27956.2276,
-                            29924.4321,
-                            30216.8321,
-                        ],
-                        [887896.51, 887068.98, 971549.04],
-                        [227921, 230995, 183635, 238605, 254186],
-                    ],
-                }
-            ),
-        ),
-        (
-            "datasets/data/UnitTest/UnitTest_Tsf_Loader_no_start_timestamp.tsf",
-            "pd-multiindex",
-            pd.DataFrame(
-                data=[
-                    25092.2284,
-                    24271.5134,
-                    25828.9883,
-                    27697.5047,
-                    27956.2276,
-                    29924.4321,
-                    30216.8321,
-                    887896.51,
-                    887068.98,
-                    971549.04,
-                    227921,
-                    230995,
-                    183635,
-                    238605,
-                    254186,
-                ],
-                index=pd.MultiIndex.from_tuples(
-                    [
-                        ("T1", 0),
-                        ("T1", 1),
-                        ("T1", 2),
-                        ("T1", 3),
-                        ("T1", 4),
-                        ("T1", 5),
-                        ("T1", 6),
-                        ("T2", 0),
-                        ("T2", 1),
-                        ("T2", 2),
-                        ("T3", 0),
-                        ("T3", 1),
-                        ("T3", 2),
-                        ("T3", 3),
-                        ("T3", 4),
-                    ],
-                    names=["series_name", "timestamp"],
-                ),
-                columns=["series_value"],
-            ),
-        ),
-    ],
-)
-def test_load_tsf_to_dataframe(input_path, return_type, output_df):
-    """Test function for loading tsf format."""
     data_path = os.path.join(
         os.path.dirname(aeon.__file__),
-        input_path,
+        "datasets/data/JapaneseVowels/JapaneseVowels_TRAIN.ts",
     )
-    expected_metadata = {
-        "frequency": "yearly",
-        "forecast_horizon": 4,
-        "contain_missing_values": False,
-        "contain_equal_length": False,
-    }
-
-    df, metadata = load_tsf_to_dataframe(data_path, return_type=return_type)
-    assert isinstance(df, pd.DataFrame)
-    assert isinstance(metadata, dict)
-    assert_frame_equal(df, output_df, check_dtype=False)
-    assert metadata == expected_metadata
-    # default_tsf"
-    #    assert check_is_mtype(obj=df, mtype=return_type)
-    if return_type == "default_tsf":
-        assert isinstance(df, pd.DataFrame)
-    elif return_type == "pd-multiindex":
-        assert isinstance(df.index, pd.MultiIndex)
-    elif return_type == "pd_multiindex_hier":
-        assert df.index.nlevels > 1
-
-
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-def test_load_from_tsf_file():
-    """Test the tsf loader that has no conversions."""
-    data_path = os.path.join(
-        os.path.dirname(aeon.__file__),
-        "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
-    )
-    expected_metadata = {
-        "frequency": "yearly",
-        "forecast_horizon": 4,
-        "contain_missing_values": False,
-        "contain_equal_length": False,
-    }
-    df, metadata = load_from_tsf_file(data_path)
-    assert metadata == expected_metadata
-    assert df.shape == (3, 3)
-
-
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-def test_load_forecasting():
-    """Test load forecasting for baked in data."""
-    expected_metadata = {
-        "frequency": "yearly",
-        "forecast_horizon": 6,
-        "contain_missing_values": False,
-        "contain_equal_length": False,
-    }
-    df, meta = load_forecasting("m1_yearly_dataset", return_metadata=True)
-    assert meta == expected_metadata
-    assert df.shape == (181, 3)
-    df = load_forecasting("m1_yearly_dataset", return_metadata=False)
-    assert df.shape == (181, 3)
+    X, y = load_from_tsfile(full_file_path_and_name=data_path, return_meta_data=False)
+    assert isinstance(X, list) and isinstance(y, np.ndarray)
+    assert len(X) == 270 and y.shape == (270,)
 
 
 @pytest.mark.skipif(
@@ -724,91 +399,6 @@ def test_load_classification():
     assert y.shape == (42,)
 
 
-@pytest.mark.skipif(
-    PR_TESTING,
-    reason="Only run on overnights because of intermittent fail for read/write",
-)
-@pytest.mark.parametrize("freq", [None, "YS"])
-def test_convert_tsf_to_multiindex(freq):
-    input_df = pd.DataFrame(
-        {
-            "series_name": ["T1", "T2", "T3"],
-            "start_timestamp": [
-                pd.Timestamp(year=1979, month=1, day=1),
-                pd.Timestamp(year=1979, month=1, day=1),
-                pd.Timestamp(year=1973, month=1, day=1),
-            ],
-            "series_value": [
-                [
-                    25092.2284,
-                    24271.5134,
-                    25828.9883,
-                    27697.5047,
-                    27956.2276,
-                    29924.4321,
-                    30216.8321,
-                ],
-                [887896.51, 887068.98, 971549.04],
-                [227921, 230995, 183635, 238605, 254186],
-            ],
-        }
-    )
-
-    output_df = pd.DataFrame(
-        data=[
-            25092.2284,
-            24271.5134,
-            25828.9883,
-            27697.5047,
-            27956.2276,
-            29924.4321,
-            30216.8321,
-            887896.51,
-            887068.98,
-            971549.04,
-            227921,
-            230995,
-            183635,
-            238605,
-            254186,
-        ],
-        index=pd.MultiIndex.from_tuples(
-            [
-                ("T1", pd.Timestamp(year=1979, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1980, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1981, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1982, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1983, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1984, month=1, day=1)),
-                ("T1", pd.Timestamp(year=1985, month=1, day=1)),
-                ("T2", pd.Timestamp(year=1979, month=1, day=1)),
-                ("T2", pd.Timestamp(year=1980, month=1, day=1)),
-                ("T2", pd.Timestamp(year=1981, month=1, day=1)),
-                ("T3", pd.Timestamp(year=1973, month=1, day=1)),
-                ("T3", pd.Timestamp(year=1974, month=1, day=1)),
-                ("T3", pd.Timestamp(year=1975, month=1, day=1)),
-                ("T3", pd.Timestamp(year=1976, month=1, day=1)),
-                ("T3", pd.Timestamp(year=1977, month=1, day=1)),
-            ],
-            names=["series_name", "timestamp"],
-        ),
-        columns=["series_value"],
-    )
-
-    metadata = {
-        "frequency": "yearly",
-        "forecast_horizon": 4,
-        "contain_missing_values": False,
-        "contain_equal_length": False,
-    }
-
-    assert_frame_equal(
-        output_df,
-        _convert_tsf_to_hierarchical(input_df, metadata, freq=freq),
-        check_dtype=False,
-    )
-
-
 @pytest.mark.skipif(
     PR_TESTING,
     reason="Only run on overnights because of intermittent fail for read/write",
@@ -816,7 +406,10 @@ def test_convert_tsf_to_multiindex(freq):
 def test_load_from_ucr_tsv():
     """Test that GunPoint is the same when loaded from .ts and .tsv"""
     X, y = _load_saved_dataset("GunPoint", split="TRAIN")
-    data_path = MODULE + "/" + DIRNAME + "/GunPoint/GunPoint_TRAIN.tsv"
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/GunPoint/GunPoint_TRAIN.tsv",
+    )
     X2, y2 = load_from_tsv_file(data_path)
     y = y.astype(float)
     np.testing.assert_array_almost_equal(X, X2, decimal=4)
@@ -830,7 +423,10 @@ def test_load_from_ucr_tsv():
 def test_load_from_arff():
     """Test that GunPoint is the same when loaded from .ts and .arff"""
     X, y = _load_saved_dataset("GunPoint", split="TRAIN")
-    data_path = MODULE + "/" + DIRNAME + "/GunPoint/GunPoint_TRAIN.arff"
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/GunPoint/GunPoint_TRAIN.arff",
+    )
     X2, y2 = load_from_arff_file(data_path)
     assert isinstance(X2, np.ndarray)
     assert isinstance(y2, np.ndarray)
@@ -839,8 +435,18 @@ def test_load_from_arff():
     np.testing.assert_array_almost_equal(X, X2, decimal=4)
     assert np.array_equal(y, y2)
     X, y = _load_saved_dataset("BasicMotions", split="TRAIN")
-    data_path = MODULE + "/" + DIRNAME + "/BasicMotions/BasicMotions_TRAIN.arff"
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/BasicMotions/BasicMotions_TRAIN.arff",
+    )
     X2, y2 = load_from_arff_file(data_path)
     assert isinstance(X, np.ndarray)
     assert isinstance(y2, np.ndarray)
     np.testing.assert_array_almost_equal(X, X2, decimal=4)
+
+
+def test__get_channel_strings():
+    line = "(2007-01-01 00:00:00,241.97),(2007-01-01 00:01:00,241.75):1"
+    channel_strings = _get_channel_strings(line)
+    assert len(channel_strings) == 2
+    assert channel_strings[0] == "241.97,241.75"
diff --git a/aeon/datasets/tests/test_dataframe_loaders.py b/aeon/datasets/tests/test_dataframe_loaders.py
index ca4db0bd..4a3e9600 100644
--- a/aeon/datasets/tests/test_dataframe_loaders.py
+++ b/aeon/datasets/tests/test_dataframe_loaders.py
@@ -5,7 +5,11 @@ import pandas as pd
 import pytest
 
 import aeon
-from aeon.datasets import load_from_tsfile_to_dataframe
+from aeon.datasets import (
+    load_from_arff_to_dataframe,
+    load_from_tsfile_to_dataframe,
+    load_from_ucr_tsv_to_dataframe,
+)
 from aeon.tests.test_config import PR_TESTING
 
 
@@ -16,10 +20,42 @@ from aeon.tests.test_config import PR_TESTING
 def test_load_from_tsfile_to_dataframe():
     data_path = os.path.join(
         os.path.dirname(aeon.__file__),
-        "datasets/data/UnitTest/UnitTestTimeStamps_TRAIN.ts",
+        "datasets/data/UnitTest/UnitTest_TRAIN.ts",
     )
 
     data, y = load_from_tsfile_to_dataframe(data_path)
     assert type(data) is pd.DataFrame
-    assert data.shape == (4, 1)
-    assert len(y) == 4
+    assert data.shape == (20, 1)
+    assert len(y) == 20
+
+
+@pytest.mark.skipif(
+    PR_TESTING,
+    reason="Only run on overnights because of intermittent fail for read/write",
+)
+def test_load_from_arff_to_dataframe():
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/GunPoint/GunPoint_TRAIN.arff",
+    )
+
+    data, y = load_from_arff_to_dataframe(data_path)
+    assert type(data) is pd.DataFrame
+    assert data.shape == (50, 1)
+    assert len(y) == 50
+
+
+@pytest.mark.skipif(
+    PR_TESTING,
+    reason="Only run on overnights because of intermittent fail for read/write",
+)
+def test_load_from_ucr_tsv_to_dataframe():
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/GunPoint/GunPoint_TRAIN.tsv",
+    )
+
+    data, y = load_from_ucr_tsv_to_dataframe(data_path)
+    assert type(data) is pd.DataFrame
+    assert data.shape == (50, 1)
+    assert len(y) == 50
diff --git a/aeon/datasets/tests/test_load_forecasting.py b/aeon/datasets/tests/test_load_forecasting.py
new file mode 100644
index 00000000..45edd732
--- /dev/null
+++ b/aeon/datasets/tests/test_load_forecasting.py
@@ -0,0 +1,332 @@
+"""Test function for loading forecasting data."""
+import os
+
+import pandas as pd
+import pytest
+from pandas.testing import assert_frame_equal
+
+import aeon
+from aeon.datasets import load_forecasting, load_from_tsf_file, load_uschange
+from aeon.tests.test_config import PR_TESTING
+
+_CHECKS = {
+    "uschange": {
+        "columns": ["Income", "Production", "Savings", "Unemployment"],
+        "len_y": 187,
+        "len_X": 187,
+        "data_types_X": {
+            "Income": "float64",
+            "Production": "float64",
+            "Savings": "float64",
+            "Unemployment": "float64",
+        },
+        "data_type_y": "float64",
+        "data": load_uschange(),
+    },
+}
+
+
+@pytest.mark.skipif(
+    PR_TESTING,
+    reason="Only run on overnights because of intermittent fail for read/write",
+)
+@pytest.mark.parametrize("dataset", sorted(_CHECKS.keys()))
+def test_forecasting_data_loaders(dataset):
+    """
+    Assert if datasets are loaded correctly.
+
+    dataset: dictionary with values to assert against should contain:
+        'columns' : list with column names in correct order,
+        'len_y'   : lenght of the y series (int),
+        'len_X'   : lenght of the X series/dataframe (int),
+        'data_types_X' : dictionary with column name keys and dtype as value,
+        'data_type_y'  : dtype if y column (string)
+        'data'    : tuple with y series and X series/dataframe if one is not
+                    applicable fill with None value,
+    """
+    checks = _CHECKS[dataset]
+    y = checks["data"][0]
+    X = checks["data"][1]
+
+    if y is not None:
+        assert isinstance(y, pd.Series)
+        assert len(y) == checks["len_y"]
+        assert y.dtype == checks["data_type_y"]
+
+    if X is not None:
+        if len(checks["data_types_X"]) > 1:
+            assert isinstance(X, pd.DataFrame)
+        else:
+            assert isinstance(X, pd.Series)
+
+        assert X.columns.values.tolist() == checks["columns"]
+
+        for col, dt in checks["data_types_X"].items():
+            assert X[col].dtype == dt
+
+        assert len(X) == checks["len_X"]
+
+
+@pytest.mark.skipif(
+    PR_TESTING,
+    reason="Only run on overnights because of intermittent fail for read/write",
+)
+def test_load_from_tsf_file():
+    """Test the tsf loader that has no conversions."""
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
+    )
+    expected_metadata = {
+        "frequency": "yearly",
+        "forecast_horizon": 4,
+        "contain_missing_values": False,
+        "contain_equal_length": False,
+    }
+    df, metadata = load_from_tsf_file(data_path)
+    assert metadata == expected_metadata
+    assert df.shape == (3, 3)
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/m1_yearly_dataset/m1_yearly_dataset.tsf",
+    )
+
+    data, meta = load_from_tsf_file(data_path)
+    assert type(data) is pd.DataFrame
+    assert data.shape == (181, 3)
+    assert len(meta) == 4
+    data, meta = load_from_tsf_file(data_path, return_type="pd-multiindex")
+    assert type(data) is pd.DataFrame
+    assert data.shape == (4515, 1)
+    assert len(meta) == 4
+
+
+@pytest.mark.parametrize(
+    "input_path, return_type, output_df",
+    [
+        (
+            "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
+            "tsf_default",
+            pd.DataFrame(
+                {
+                    "series_name": ["T1", "T2", "T3"],
+                    "start_timestamp": [
+                        pd.Timestamp(year=1979, month=1, day=1),
+                        pd.Timestamp(year=1979, month=1, day=1),
+                        pd.Timestamp(year=1973, month=1, day=1),
+                    ],
+                    "series_value": [
+                        [
+                            25092.2284,
+                            24271.5134,
+                            25828.9883,
+                            27697.5047,
+                            27956.2276,
+                            29924.4321,
+                            30216.8321,
+                        ],
+                        [887896.51, 887068.98, 971549.04],
+                        [227921, 230995, 183635, 238605, 254186],
+                    ],
+                }
+            ),
+        ),
+        (
+            "datasets/data/UnitTest/UnitTest_Tsf_Loader_hierarchical.tsf",
+            "pd_multiindex_hier",
+            pd.DataFrame(
+                data=[
+                    25092.2284,
+                    24271.5134,
+                    25828.9883,
+                    27697.5047,
+                    27956.2276,
+                    29924.4321,
+                    30216.8321,
+                    887896.51,
+                    887068.98,
+                    971549.04,
+                    227921,
+                    230995,
+                    183635,
+                    238605,
+                    254186,
+                ],
+                index=pd.MultiIndex.from_tuples(
+                    [
+                        ("G1", "T1", pd.Timestamp(year=1979, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1980, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1981, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1982, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1983, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1984, month=1, day=1)),
+                        ("G1", "T1", pd.Timestamp(year=1985, month=1, day=1)),
+                        ("G1", "T2", pd.Timestamp(year=1979, month=1, day=1)),
+                        ("G1", "T2", pd.Timestamp(year=1980, month=1, day=1)),
+                        ("G1", "T2", pd.Timestamp(year=1981, month=1, day=1)),
+                        ("G2", "T3", pd.Timestamp(year=1973, month=1, day=1)),
+                        ("G2", "T3", pd.Timestamp(year=1974, month=1, day=1)),
+                        ("G2", "T3", pd.Timestamp(year=1975, month=1, day=1)),
+                        ("G2", "T3", pd.Timestamp(year=1976, month=1, day=1)),
+                        ("G2", "T3", pd.Timestamp(year=1977, month=1, day=1)),
+                    ],
+                    names=["series_group", "series_name", "timestamp"],
+                ),
+                columns=["series_value"],
+            ),
+        ),
+        (
+            "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
+            "pd-multiindex",
+            pd.DataFrame(
+                data=[
+                    25092.2284,
+                    24271.5134,
+                    25828.9883,
+                    27697.5047,
+                    27956.2276,
+                    29924.4321,
+                    30216.8321,
+                    887896.51,
+                    887068.98,
+                    971549.04,
+                    227921,
+                    230995,
+                    183635,
+                    238605,
+                    254186,
+                ],
+                index=pd.MultiIndex.from_tuples(
+                    [
+                        ("T1", pd.Timestamp(year=1979, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1980, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1981, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1982, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1983, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1984, month=1, day=1)),
+                        ("T1", pd.Timestamp(year=1985, month=1, day=1)),
+                        ("T2", pd.Timestamp(year=1979, month=1, day=1)),
+                        ("T2", pd.Timestamp(year=1980, month=1, day=1)),
+                        ("T2", pd.Timestamp(year=1981, month=1, day=1)),
+                        ("T3", pd.Timestamp(year=1973, month=1, day=1)),
+                        ("T3", pd.Timestamp(year=1974, month=1, day=1)),
+                        ("T3", pd.Timestamp(year=1975, month=1, day=1)),
+                        ("T3", pd.Timestamp(year=1976, month=1, day=1)),
+                        ("T3", pd.Timestamp(year=1977, month=1, day=1)),
+                    ],
+                    names=["series_name", "timestamp"],
+                ),
+                columns=["series_value"],
+            ),
+        ),
+        (
+            "datasets/data/UnitTest/UnitTest_Tsf_Loader_no_start_timestamp.tsf",
+            "tsf_default",
+            pd.DataFrame(
+                {
+                    "series_name": ["T1", "T2", "T3"],
+                    "series_value": [
+                        [
+                            25092.2284,
+                            24271.5134,
+                            25828.9883,
+                            27697.5047,
+                            27956.2276,
+                            29924.4321,
+                            30216.8321,
+                        ],
+                        [887896.51, 887068.98, 971549.04],
+                        [227921, 230995, 183635, 238605, 254186],
+                    ],
+                }
+            ),
+        ),
+        (
+            "datasets/data/UnitTest/UnitTest_Tsf_Loader_no_start_timestamp.tsf",
+            "pd-multiindex",
+            pd.DataFrame(
+                data=[
+                    25092.2284,
+                    24271.5134,
+                    25828.9883,
+                    27697.5047,
+                    27956.2276,
+                    29924.4321,
+                    30216.8321,
+                    887896.51,
+                    887068.98,
+                    971549.04,
+                    227921,
+                    230995,
+                    183635,
+                    238605,
+                    254186,
+                ],
+                index=pd.MultiIndex.from_tuples(
+                    [
+                        ("T1", 0),
+                        ("T1", 1),
+                        ("T1", 2),
+                        ("T1", 3),
+                        ("T1", 4),
+                        ("T1", 5),
+                        ("T1", 6),
+                        ("T2", 0),
+                        ("T2", 1),
+                        ("T2", 2),
+                        ("T3", 0),
+                        ("T3", 1),
+                        ("T3", 2),
+                        ("T3", 3),
+                        ("T3", 4),
+                    ],
+                    names=["series_name", "timestamp"],
+                ),
+                columns=["series_value"],
+            ),
+        ),
+    ],
+)
+def test_load_from_tsf_file_more(input_path, return_type, output_df):
+    """Test function for loading tsf format."""
+    data_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        input_path,
+    )
+    expected_metadata = {
+        "frequency": "yearly",
+        "forecast_horizon": 4,
+        "contain_missing_values": False,
+        "contain_equal_length": False,
+    }
+
+    df, metadata = load_from_tsf_file(data_path, return_type=return_type)
+    assert isinstance(df, pd.DataFrame)
+    assert isinstance(metadata, dict)
+    assert_frame_equal(df, output_df, check_dtype=False)
+    assert metadata == expected_metadata
+    if return_type == "tsf_default":
+        assert isinstance(df, pd.DataFrame)
+    elif return_type == "pd-multiindex":
+        assert isinstance(df.index, pd.MultiIndex)
+    elif return_type == "pd_multiindex_hier":
+        assert df.index.nlevels > 1
+
+
+@pytest.mark.skipif(
+    PR_TESTING,
+    reason="Only run on overnights because of intermittent fail for read/write",
+)
+def test_load_forecasting():
+    """Test load forecasting for baked in data."""
+    expected_metadata = {
+        "frequency": "yearly",
+        "forecast_horizon": 6,
+        "contain_missing_values": False,
+        "contain_equal_length": False,
+    }
+    df, meta = load_forecasting("m1_yearly_dataset", return_metadata=True)
+    assert meta == expected_metadata
+    assert df.shape == (181, 3)
+    df = load_forecasting("m1_yearly_dataset", return_metadata=False)
+    assert df.shape == (181, 3)
diff --git a/aeon/datasets/tests/test_single_problem_loaders.py b/aeon/datasets/tests/test_single_problem_loaders.py
index 3a96bc6e..44ab24a1 100644
--- a/aeon/datasets/tests/test_single_problem_loaders.py
+++ b/aeon/datasets/tests/test_single_problem_loaders.py
@@ -5,21 +5,21 @@ import numpy as np
 import pandas as pd
 import pytest
 
+import aeon
 from aeon.datasets import (  # Univariate; Unequal length; Multivariate
     load_acsf1,
     load_arrow_head,
     load_basic_motions,
     load_covid_3month,
+    load_from_tsf_file,
     load_italy_power_demand,
     load_japanese_vowels,
     load_osuleaf,
     load_plaid,
     load_solar,
-    load_tsf_to_dataframe,
     load_unit_test,
     load_unit_test_tsf,
 )
-from aeon.datasets._single_problem_loaders import MODULE
 
 UNIVARIATE_PROBLEMS = [
     load_acsf1,
@@ -74,18 +74,22 @@ def test_load_unit_test_tsf():
     """Test load unit test tsf."""
     tuple = load_unit_test_tsf()
     assert isinstance(tuple[0], pd.DataFrame)
-    assert tuple[0].shape == (15, 1)
+    assert tuple[0].shape == (3, 3)
     assert tuple[1] == "yearly"
     assert tuple[2] == 4
     assert not tuple[3]
     assert not tuple[4]
+    tuple = load_unit_test_tsf(return_type="pd_multiindex_hier")
+    assert tuple[0].shape == (15, 1)
 
 
 def test_basic_load_tsf_to_dataframe():
     """Simple loader test."""
-
-    full_path = os.path.join(MODULE, "data", "UnitTest", "UnitTest_Tsf_Loader.tsf")
-    df, metadata = load_tsf_to_dataframe(full_path)
+    full_path = os.path.join(
+        os.path.dirname(aeon.__file__),
+        "datasets/data/UnitTest/UnitTest_Tsf_Loader.tsf",
+    )
+    df, metadata = load_from_tsf_file(full_path)
     assert isinstance(df, pd.DataFrame)
     assert metadata["frequency"] == "yearly"
     assert metadata["forecast_horizon"] == 4