diff --git a/.github/workflows/fast_release.yml b/.github/workflows/fast_release.yml index f3c28bc437..df9115eb82 100644 --- a/.github/workflows/fast_release.yml +++ b/.github/workflows/fast_release.yml @@ -29,6 +29,7 @@ jobs: retention-days: 5 upload-wheels: + needs: build-project runs-on: ubuntu-24.04 environment: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e939f4b4af..3f34af6b7e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,6 +39,18 @@ jobs: python -m pip install build python -m build + - name: Check tag matches built version + if: github.ref_type == 'tag' + shell: bash + env: + RELEASE_TAG: ${{ github.ref_name }} + run: | + if ! ls dist/aeon-"${RELEASE_TAG#v}"-*.whl > /dev/null 2>&1; then + echo "::error::Tag ${RELEASE_TAG} does not match the built distribution." + ls dist/ + exit 1 + fi + - name: Store build files uses: actions/upload-artifact@v7 with: @@ -116,8 +128,12 @@ jobs: - name: Show dependencies run: python -m pip list - - name: Tests - run: python -m pytest -n logical + - name: Test installed wheel + shell: bash + run: | + mkdir wheel-test && cd wheel-test + python -c "import aeon; print(aeon.__file__); assert 'site-packages' in aeon.__file__, 'not the installed wheel'" + python -m pytest -c ../pyproject.toml -n logical --pyargs aeon upload-wheels: needs: test-wheels diff --git a/README.md b/README.md index 26a46f4b39..ff57ca41bb 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,12 @@

`aeon` is a scikit-learn compatible Python library for learning from time series. -It covers classification, regression, clustering, forecasting, anomaly detection, distances, -segmentation, similarity search, transformations and benchmarking. +It covers classification, regression, clustering, forecasting, anomaly detection, +distances, segmentation, similarity search, transformations and benchmarking. -Many implementations in `aeon` are contributed and maintained by the researchers who developed the original methods. These include state-of-the-art models for forecasting, classification, regression, and clustering, including deep learning approaches. +Many implementations in `aeon` are contributed and maintained by the researchers who +developed the original methods. These include state-of-the-art models for forecasting, +classification, regression, and clustering, including deep learning approaches. [Documentation](https://www.aeon-toolkit.org/) · [Examples](https://www.aeon-toolkit.org/en/stable/examples.html) · @@ -54,7 +56,6 @@ evaluate new methods. That means: - **State of the art, sooner.** New methods often land in `aeon` alongside publication. - **Evidence-based defaults.** What's included — and what's recommended — is grounded in published comparative studies. - A selection of algorithms available in `aeon` written by `aeon` core developers or contributors: | Method | Reference | Task | @@ -70,7 +71,6 @@ A selection of algorithms available in `aeon` written by `aeon` core developers Code in `aeon` and related toolkits has been used in a wide range of benchmarking studies: - | Study | Reference | Area | |-----------------------------------|-------------------------------------------------------------------------------------------|--------------| | Clustering | [Holder et al., 2024](https://link.springer.com/article/10.1007/s10115-023-01952-0) | Benchmarking | @@ -102,8 +102,12 @@ pip install aeon[all_extras] For development installs and platform-specific notes, see the [installation guide](https://www.aeon-toolkit.org/en/stable/installation.html). +The latest version of `aeon` is v1.6.0. + ## Quick start + Fit a classifier on a standard UCR dataset: + ```python from aeon.classification.convolution_based import RocketClassifier from aeon.datasets import load_gunpoint @@ -136,9 +140,13 @@ Ten task areas, one consistent API: ## Getting started examples +For more examples across tasks, visit the +[examples gallery](https://www.aeon-toolkit.org/en/stable/examples.html). + ### Classification -Time series classification predicts class labels for unseen series using a model fitted on a collection of labelled time series. +Time series classification predicts class labels for unseen series using a model fitted +on a collection of labelled time series. ```python import numpy as np @@ -165,7 +173,6 @@ print(y_pred) # ['low' 'low' 'high'] ``` - ### Clustering Time series clustering groups similar time series together from an unlabelled collection. @@ -197,7 +204,8 @@ pred = forecaster.forecast(y) print(pred) ``` -For more advanced forecasting, `aeon` also includes deep learning and machine learning methods not available elsewhere in Python, such as `SETARTree` and `SETARForest`. +For more advanced forecasting, `aeon` also includes deep learning and machine learning +methods not available elsewhere in Python, such as `SETARTree` and `SETARForest`. ### Deep learning @@ -227,9 +235,6 @@ print(clf.score(X_test, y_test)) See the [examples gallery](https://www.aeon-toolkit.org/en/stable/examples.html) for GPU usage, custom architectures, and benchmarking against classical methods. -For more examples across tasks, visit the -[examples gallery](https://www.aeon-toolkit.org/en/stable/examples.html). - ## Support aeon There are several ways to engage with the project: @@ -255,7 +260,8 @@ Useful links: - [Governance](https://github.com/aeon-toolkit/aeon/blob/main/GOVERNANCE.md) - [Project website](https://www.aeon-toolkit.org/) -The `aeon` developers are volunteers, so please be patient with issue triage and pull request review. +The `aeon` developers are volunteers, so please be patient with issue triage and +pull request review. ## Citation @@ -274,16 +280,26 @@ If you use `aeon` in academic work, please cite the project: } ``` -If you let us know about your paper using `aeon`, we will happily list it on the [project website](https://www.aeon-toolkit.org/en/latest/papers_using_aeon.html). +If you let us know about your paper using `aeon`, we will happily list it on +the [project website](https://www.aeon-toolkit.org/en/latest/papers_using_aeon.html). ## Project history -`aeon` was forked from `sktime` `v0.16.0` in 2022 by an initial group of eight core developers, and has since been substantially rewritten and extended. -Our core development team of 13 spans academia and industry, representing seven nationalities across the globe. -You can read more about the project's history, values, and governance on the [About Us page](https://www.aeon-toolkit.org/en/stable/about.html). +`aeon` was forked from `sktime` `v0.16.0` in 2022 by an initial group of eight core +developers, and has since been substantially rewritten and extended. +Our core development team of 13 spans academia and industry, representing seven +nationalities across the globe. +You can read more about the project's history, values, and governance on the +[About Us page](https://www.aeon-toolkit.org/en/stable/about.html). ## Project status -`aeon` is under active development. The core package is stable and widely used. The following modules are currently considered in development, and the deprecation policy does not necessarily apply (although we only rarely make non-compatible changes): `anomaly_detection`, `forecasting`, `segmentation`, `similarity_search`, `visualisation`, `transformations.collection.self_supervised`, `transformations.collection.imbalance`. +`aeon` is under active development. The core package is stable and widely used. +The following modules are currently considered in development, and the deprecation +policy does not necessarily apply (although we only rarely make non-compatible changes): +`anomaly_detection`, `forecasting`, `segmentation`, `similarity_search`, +`visualisation`, `transformations.collection.self_supervised`, +`transformations.collection.imbalance`. -Please check the documentation for task-specific capabilities, limitations, and current status. +Please check the documentation for task-specific capabilities, limitations, and +current status. diff --git a/aeon/__init__.py b/aeon/__init__.py index ea13204dc9..94ffcd1314 100644 --- a/aeon/__init__.py +++ b/aeon/__init__.py @@ -1,3 +1,3 @@ """aeon toolkit.""" -__version__ = "1.5.0" +__version__ = "1.6.0" diff --git a/docs/changelog.md b/docs/changelog.md index 5f53eef19d..e0a1428a92 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -9,6 +9,7 @@ To stay up to date with `aeon` releases, subscribe to aeon [here](https://libraries.io/pypi/aeon) or follow us on [LinkedIn](https://www.linkedin.com/company/aeon-toolkit/). +- [Version 1.6.0](changelogs/v1.6.md) - [Version 1.5.0](changelogs/v1.5.md) - [Version 1.4.0](changelogs/v1.4.md) - [Version 1.3.0](changelogs/v1.3.md) diff --git a/docs/changelogs/v1.6.md b/docs/changelogs/v1.6.md new file mode 100644 index 0000000000..928c32e037 --- /dev/null +++ b/docs/changelogs/v1.6.md @@ -0,0 +1,9 @@ +# v1.6.0 + +July 2026 + +## Classification + +### Deprecation + +- Removed `LearningShapeletClassifier` as scheduled after its deprecation in v1.5.0. diff --git a/docs/developer_guide/release.md b/docs/developer_guide/release.md index 826f816fba..bcfafc759e 100644 --- a/docs/developer_guide/release.md +++ b/docs/developer_guide/release.md @@ -39,19 +39,29 @@ The release process is as follows, on high-level: ## `pypi` release and release validation -Creation of the GitHub release trigger the `pypi` release workflow. +Publishing the GitHub release triggers the `pypi` release workflow. The workflow builds +from the released tag, checks that the tag matches the version of the built +distribution, and runs the test suite against the built wheel rather than the source +tree. 5. **Approve the release workflow.** The release workflow will be automatically created in the GitHub Actions tab. This must be approved by a member of the release management workgroup before it will run. 6. **Wait for the ``pypi`` release CI/CD to finish.** - If tests fail due to sporadic unrelated failure, restart. If tests fail genuinely, - something went wrong in the above steps, investigate, fix, and repeat. If the bug - is known and sporadic (i.e. failure to read data from an external source), the release - workflow can be restarted. It is not necessary to create a new GitHub release, and - the workflow can be manually run from the GitHub Actions tab if more PRs are - required. + If tests fail due to a sporadic unrelated failure (i.e. failure to read data from an + external source), re-run the failed jobs. It is not necessary to create a new GitHub + release, and the workflow can also be run manually from the GitHub Actions tab by + selecting the release tag. + + If tests fail genuinely, something went wrong in the above steps. Nothing has been + uploaded to `pypi` at this point, so the version number is still free to use: delete + the GitHub release and its tag, merge the necessary fixes, then create the release + and tag again with the same version number. + + Once the `pypi` upload has succeeded the version is fixed, as `pypi` does not allow a + version to be re-uploaded. Any problem found after that point requires a new patch + version and a new release. 7. **Release workflow completion tasks.** Once the release workflow has passed, check `aeon` version on `pypi`, this should be diff --git a/examples/classification/shapelet_based.ipynb b/examples/classification/shapelet_based.ipynb index d8e6ca0815..957ac6a197 100644 --- a/examples/classification/shapelet_based.ipynb +++ b/examples/classification/shapelet_based.ipynb @@ -93,7 +93,7 @@ { "data": { "text/plain": [ - " ('RDSTClassifier', aeon.classification.shapelet_based._rdst.RDSTClassifier),\n", + "[('RDSTClassifier', aeon.classification.shapelet_based._rdst.RDSTClassifier),\n", " ('RSASTClassifier',\n", " aeon.classification.shapelet_based._rsast.RSASTClassifier),\n", " ('SASTClassifier', aeon.classification.shapelet_based._sast.SASTClassifier),\n", @@ -487,7 +487,7 @@ " - Others such as `SAST`[4] only select a small number of \"reference\" time series in the training data where all subsequences will be considered as shapelets without evaluating their quality. This leaves the \"feature selection\" step to the classifier that will use the transformation. `RSAST`[5] uses the same approach but also uses some statistical criteria to further reduce the number of candidates extracted from these reference time series.\n", " - Another approach used in `RandomDilatedShapeletTransform` is to use a semi-random extraction which is guided by a masking of the input space. Once a shapelet has been randomly sampled from a time series, the neighboring points around the sampling point are removed from the list of available sampling points. This avoids extracting self-similar shapelets and improves the diversity of the extracted shapelet set. The number of neighboring points affected by this process is controlled with the `alpha_similarity` parameter.\n", "\n", - "- **Shapelet generation**: This last approach takes another view at the problem: What if the best shapelets for my dataset are not present in the training data ? The goal is to use optimization methods, such as gradient descent or evolutionary algorithm, to generate shapelet values instead of extracting them from the input. The first shapelet generation method was Learning Shapelet [6], which is not currently implemented in aeon.\n", + "- **Shapelet generation**: This last approach takes another view at the problem: What if the best shapelets for my dataset are not present in the training data ? The goal is to use optimization methods, such as gradient descent or evolutionary algorithm, to generate shapelet values instead of extracting them from the input. The first shapelet generation method was Learning Shapelet [6], which is not currently implemented in aeon.\n", "\n", "\n", "## Shapelet \"self-similarity\"\n", diff --git a/pyproject.toml b/pyproject.toml index 74749034c4..5c9ca83ea9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "aeon" -version = "1.5.0" +version = "1.6.0" description = "A toolkit for time series machine learning" authors = [ {name = "aeon developers", email = "contact@aeon-toolkit.org"},