From 06eaea6803def0afff5bdd24ac4e0e7e443e7ed0 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 22:42:09 +0000 Subject: [PATCH 1/2] chore: pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.12.1 → 24.3.0](https://github.com/psf/black/compare/23.12.1...24.3.0) - [github.com/PyCQA/flake8: 6.1.0 → 7.0.0](https://github.com/PyCQA/flake8/compare/6.1.0...7.0.0) - [github.com/kynan/nbstripout: 0.6.1 → 0.7.1](https://github.com/kynan/nbstripout/compare/0.6.1...0.7.1) - [github.com/nbQA-dev/nbQA: 1.7.1 → 1.8.5](https://github.com/nbQA-dev/nbQA/compare/1.7.1...1.8.5) --- .pre-commit-config.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 61e5fe1a..82334f5f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/psf/black - rev: 23.12.1 + rev: 24.3.0 hooks: - id: black language_version: python3 @@ -25,12 +25,12 @@ repos: args: [--in-place] exclude: mkdocs_macros.py - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.0.0 hooks: - id: flake8 # additional_dependencies: [flake8-docstrings, flake8-bugbear, flake8-spellcheck, flake8-import-order] - repo: https://github.com/kynan/nbstripout - rev: 0.6.1 + rev: 0.7.1 hooks: - id: nbstripout - repo: https://github.com/asottile/blacken-docs @@ -38,7 +38,7 @@ repos: hooks: - id: blacken-docs - repo: https://github.com/nbQA-dev/nbQA - rev: 1.7.1 + rev: 1.8.5 hooks: - id: nbqa-black args: [--nbqa-mutate] From 5b241e9d940fd23a2b7d87bb31ebf263c9ebcba5 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 1 Apr 2024 22:42:23 +0000 Subject: [PATCH 2/2] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/examples/merging-cost-functions.ipynb | 40 +++++++++++----------- docs/user-guide/costs/costcustom.md | 1 - src/ruptures/base.py | 1 + src/ruptures/costs/costclinear.py | 1 + src/ruptures/costs/costcosine.py | 1 + src/ruptures/costs/costl1.py | 1 + src/ruptures/costs/costl2.py | 1 + src/ruptures/costs/costlinear.py | 1 + src/ruptures/costs/costml.py | 1 + src/ruptures/costs/costnormal.py | 1 + src/ruptures/costs/costrank.py | 1 + src/ruptures/costs/costrbf.py | 1 + src/ruptures/datasets/__init__.py | 1 + src/ruptures/datasets/pw_linear.py | 1 + src/ruptures/datasets/pw_normal.py | 1 + src/ruptures/datasets/pw_wavy.py | 1 + src/ruptures/detection/binseg.py | 1 + src/ruptures/detection/bottomup.py | 1 + src/ruptures/detection/dynp.py | 1 + src/ruptures/detection/pelt.py | 1 + src/ruptures/detection/window.py | 1 - src/ruptures/metrics/__init__.py | 1 + src/ruptures/metrics/hamming.py | 1 + src/ruptures/metrics/hausdorff.py | 1 + src/ruptures/metrics/precisionrecall.py | 1 + src/ruptures/metrics/randindex.py | 1 + src/ruptures/metrics/timeerror.py | 1 + src/ruptures/utils/__init__.py | 1 + src/ruptures/utils/bnode.py | 1 + tests/test_detection.py | 8 ++--- 30 files changed, 48 insertions(+), 28 deletions(-) diff --git a/docs/examples/merging-cost-functions.ipynb b/docs/examples/merging-cost-functions.ipynb index 4e25e670..b0c56933 100644 --- a/docs/examples/merging-cost-functions.ipynb +++ b/docs/examples/merging-cost-functions.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "markdown", - "id": "e07961b1-a84a-4749-ad7f-0d3fc617efd3", + "id": "0", "metadata": { "tags": [] }, @@ -36,7 +36,7 @@ }, { "cell_type": "markdown", - "id": "dbdf7dce-47f1-415b-9d89-e2899b1f4e6c", + "id": "1", "metadata": {}, "source": [ "## Setup\n", @@ -47,7 +47,7 @@ { "cell_type": "code", "execution_count": null, - "id": "0998be59-5a69-4617-b931-2c9d4fd6595d", + "id": "2", "metadata": {}, "outputs": [], "source": [ @@ -72,7 +72,7 @@ }, { "cell_type": "markdown", - "id": "11388466-a41d-4e44-9789-0161e3cc5e88", + "id": "3", "metadata": {}, "source": [ "The merging procedure of cost functions is applied on the following 2D toy signal, where each dimension contains three mean-shifts.\n", @@ -82,7 +82,7 @@ { "cell_type": "code", "execution_count": null, - "id": "84089dda-f638-42a2-a429-b5365860cd1f", + "id": "4", "metadata": {}, "outputs": [], "source": [ @@ -104,7 +104,7 @@ }, { "cell_type": "markdown", - "id": "e43b33e1-f056-4d23-ad58-d7e5da754347", + "id": "5", "metadata": {}, "source": [ "## Detection with a single cost function\n", @@ -115,7 +115,7 @@ { "cell_type": "code", "execution_count": null, - "id": "64e93a45-7a4c-42f8-b7aa-95365e831203", + "id": "6", "metadata": { "tags": [] }, @@ -159,7 +159,7 @@ }, { "cell_type": "markdown", - "id": "78eaafde-ae84-4ff1-9c80-426040185d90", + "id": "7", "metadata": {}, "source": [ "Combining this cost function with the [window search method](../user-guide/detection/window.md) yields the following change-points.\n", @@ -169,7 +169,7 @@ { "cell_type": "code", "execution_count": null, - "id": "63af12a7-bd4a-4732-92eb-a8599999a82c", + "id": "8", "metadata": {}, "outputs": [], "source": [ @@ -194,7 +194,7 @@ { "cell_type": "code", "execution_count": null, - "id": "dfceeaa3-2c26-48ea-8af9-5cfa8d0fcdbe", + "id": "9", "metadata": {}, "outputs": [], "source": [ @@ -218,7 +218,7 @@ }, { "cell_type": "markdown", - "id": "ce63eac0-5cd5-474a-bafa-2b4c53425d57", + "id": "10", "metadata": {}, "source": [ "Observe that, depending on the considered cost function (`CostL2OnSingleDim(dim=0)` or `CostL2OnSingleDim(dim=1)`), the detected changes are not the same even though the input signal is the same.\n", @@ -229,7 +229,7 @@ { "cell_type": "code", "execution_count": null, - "id": "03da2de4-9339-4280-afa8-b04d094213e4", + "id": "11", "metadata": {}, "outputs": [], "source": [ @@ -242,7 +242,7 @@ }, { "cell_type": "markdown", - "id": "5b967d36-1dfa-42e8-a5e1-3085d4325624", + "id": "12", "metadata": {}, "source": [ "\n", @@ -251,7 +251,7 @@ }, { "cell_type": "markdown", - "id": "7fb9ee7e-469e-4a11-a48b-6e3f152aa6d1", + "id": "13", "metadata": {}, "source": [ "## Detection with an aggregated cost function\n", @@ -265,7 +265,7 @@ { "cell_type": "code", "execution_count": null, - "id": "1b8ffd8d-8d41-4189-ba25-16ddaf09c063", + "id": "14", "metadata": {}, "outputs": [], "source": [ @@ -298,7 +298,7 @@ }, { "cell_type": "markdown", - "id": "71c261aa-9287-4e47-b331-28ddb3a66c06", + "id": "15", "metadata": {}, "source": [ "### Union\n", @@ -312,7 +312,7 @@ { "cell_type": "code", "execution_count": null, - "id": "f1571dca-0674-45d8-b9aa-e4200eed3e78", + "id": "16", "metadata": {}, "outputs": [], "source": [ @@ -339,7 +339,7 @@ }, { "cell_type": "markdown", - "id": "ffff426b-2ab7-41fb-972c-2ef9ade72ed8", + "id": "17", "metadata": {}, "source": [ "## Conclusion\n", @@ -355,7 +355,7 @@ }, { "cell_type": "markdown", - "id": "1a6d5256-67f3-4d3c-8192-4043ff6abce5", + "id": "18", "metadata": {}, "source": [ "## Authors\n", @@ -365,7 +365,7 @@ }, { "cell_type": "markdown", - "id": "e100e594-eced-42db-9841-4bff2d737c1d", + "id": "19", "metadata": {}, "source": [ "## References\n", diff --git a/docs/user-guide/costs/costcustom.md b/docs/user-guide/costs/costcustom.md index 9c5aca15..e27bad33 100644 --- a/docs/user-guide/costs/costcustom.md +++ b/docs/user-guide/costs/costcustom.md @@ -25,7 +25,6 @@ from ruptures.base import BaseCost class MyCost(BaseCost): - """Custom cost for exponential signals.""" # The 2 following attributes must be specified for compatibility. diff --git a/src/ruptures/base.py b/src/ruptures/base.py index 19c673c7..5becb9db 100644 --- a/src/ruptures/base.py +++ b/src/ruptures/base.py @@ -3,6 +3,7 @@ [`BaseEstimator`][ruptures.base.BaseEstimator] and [`BaseCost`][ruptures.base.BaseCost] respectively. """ + import abc from ruptures.utils import pairwise diff --git a/src/ruptures/costs/costclinear.py b/src/ruptures/costs/costclinear.py index fe235ccf..5858d5fc 100644 --- a/src/ruptures/costs/costclinear.py +++ b/src/ruptures/costs/costclinear.py @@ -1,4 +1,5 @@ r"""Continuous linear change.""" + import numpy as np from ruptures.base import BaseCost diff --git a/src/ruptures/costs/costcosine.py b/src/ruptures/costs/costcosine.py index b5b4118d..dcacea76 100644 --- a/src/ruptures/costs/costcosine.py +++ b/src/ruptures/costs/costcosine.py @@ -1,4 +1,5 @@ r"""CostCosine (kernel change point detection with the cosine similarity)""" + import numpy as np from ruptures.base import BaseCost from ruptures.costs import NotEnoughPoints diff --git a/src/ruptures/costs/costl1.py b/src/ruptures/costs/costl1.py index 2652bfaa..80c3a6f9 100644 --- a/src/ruptures/costs/costl1.py +++ b/src/ruptures/costs/costl1.py @@ -1,4 +1,5 @@ r"""CostL1 (least absolute deviation)""" + import numpy as np from ruptures.base import BaseCost diff --git a/src/ruptures/costs/costl2.py b/src/ruptures/costs/costl2.py index 0930f3dc..f1d81f52 100644 --- a/src/ruptures/costs/costl2.py +++ b/src/ruptures/costs/costl2.py @@ -1,4 +1,5 @@ r"""CostL2 (least squared deviation)""" + from ruptures.costs import NotEnoughPoints from ruptures.base import BaseCost diff --git a/src/ruptures/costs/costlinear.py b/src/ruptures/costs/costlinear.py index e45a3d38..7464288a 100644 --- a/src/ruptures/costs/costlinear.py +++ b/src/ruptures/costs/costlinear.py @@ -1,4 +1,5 @@ r"""Linear model change.""" + from numpy.linalg import lstsq from ruptures.base import BaseCost diff --git a/src/ruptures/costs/costml.py b/src/ruptures/costs/costml.py index 2869a932..2c91a448 100644 --- a/src/ruptures/costs/costml.py +++ b/src/ruptures/costs/costml.py @@ -1,4 +1,5 @@ r"""Change detection with a Mahalanobis-type metric.""" + import numpy as np from numpy.linalg import inv diff --git a/src/ruptures/costs/costnormal.py b/src/ruptures/costs/costnormal.py index fb2c73e8..9e69803e 100644 --- a/src/ruptures/costs/costnormal.py +++ b/src/ruptures/costs/costnormal.py @@ -1,4 +1,5 @@ r"""Gaussian process changes (CostNormal)""" + import warnings import numpy as np diff --git a/src/ruptures/costs/costrank.py b/src/ruptures/costs/costrank.py index 2cbd3343..322a7ea6 100644 --- a/src/ruptures/costs/costrank.py +++ b/src/ruptures/costs/costrank.py @@ -1,4 +1,5 @@ r"""Rank-based cost function (CostRank)""" + import numpy as np from numpy.linalg import pinv, LinAlgError from scipy.stats.mstats import rankdata diff --git a/src/ruptures/costs/costrbf.py b/src/ruptures/costs/costrbf.py index 5c53c524..788b86ca 100644 --- a/src/ruptures/costs/costrbf.py +++ b/src/ruptures/costs/costrbf.py @@ -1,4 +1,5 @@ r"""Kernelized mean change.""" + import numpy as np from scipy.spatial.distance import pdist, squareform diff --git a/src/ruptures/datasets/__init__.py b/src/ruptures/datasets/__init__.py index e353bc14..6251d8b3 100644 --- a/src/ruptures/datasets/__init__.py +++ b/src/ruptures/datasets/__init__.py @@ -1,4 +1,5 @@ """Utility functions to load or generate data sets.""" + from .pw_constant import pw_constant from .pw_linear import pw_linear from .pw_normal import pw_normal diff --git a/src/ruptures/datasets/pw_linear.py b/src/ruptures/datasets/pw_linear.py index df2bd791..1a71976b 100644 --- a/src/ruptures/datasets/pw_linear.py +++ b/src/ruptures/datasets/pw_linear.py @@ -1,4 +1,5 @@ r"""Shift in linear model.""" + import numpy as np from . import pw_constant diff --git a/src/ruptures/datasets/pw_normal.py b/src/ruptures/datasets/pw_normal.py index aca238d4..ab2149ae 100644 --- a/src/ruptures/datasets/pw_normal.py +++ b/src/ruptures/datasets/pw_normal.py @@ -1,4 +1,5 @@ """2D piecewise Gaussian process (pw_normal)""" + from itertools import cycle import numpy as np diff --git a/src/ruptures/datasets/pw_wavy.py b/src/ruptures/datasets/pw_wavy.py index dbb15a53..b55eb6e0 100644 --- a/src/ruptures/datasets/pw_wavy.py +++ b/src/ruptures/datasets/pw_wavy.py @@ -1,4 +1,5 @@ """Piecewise sinusoidal (pw_wavy)""" + from itertools import cycle import numpy as np diff --git a/src/ruptures/detection/binseg.py b/src/ruptures/detection/binseg.py index 075212b7..ecdae799 100644 --- a/src/ruptures/detection/binseg.py +++ b/src/ruptures/detection/binseg.py @@ -1,4 +1,5 @@ r"""Binary segmentation.""" + from functools import lru_cache import numpy as np diff --git a/src/ruptures/detection/bottomup.py b/src/ruptures/detection/bottomup.py index ec4656ec..7ec34afa 100644 --- a/src/ruptures/detection/bottomup.py +++ b/src/ruptures/detection/bottomup.py @@ -1,4 +1,5 @@ r"""Bottom-up segmentation.""" + import heapq from bisect import bisect_left from functools import lru_cache diff --git a/src/ruptures/detection/dynp.py b/src/ruptures/detection/dynp.py index 2b600893..8afa935d 100644 --- a/src/ruptures/detection/dynp.py +++ b/src/ruptures/detection/dynp.py @@ -1,4 +1,5 @@ r"""Dynamic programming.""" + from functools import lru_cache from ruptures.utils import sanity_check diff --git a/src/ruptures/detection/pelt.py b/src/ruptures/detection/pelt.py index 1b0c352d..ec8ea657 100644 --- a/src/ruptures/detection/pelt.py +++ b/src/ruptures/detection/pelt.py @@ -1,4 +1,5 @@ r"""Pelt.""" + from math import floor from ruptures.costs import cost_factory diff --git a/src/ruptures/detection/window.py b/src/ruptures/detection/window.py index 98a36ac6..354ac562 100644 --- a/src/ruptures/detection/window.py +++ b/src/ruptures/detection/window.py @@ -1,6 +1,5 @@ r"""Window-based change point detection.""" - import numpy as np from scipy.signal import argrelmax diff --git a/src/ruptures/metrics/__init__.py b/src/ruptures/metrics/__init__.py index d75ed187..f4623bb8 100644 --- a/src/ruptures/metrics/__init__.py +++ b/src/ruptures/metrics/__init__.py @@ -16,6 +16,7 @@ display """ + from .hausdorff import hausdorff from .timeerror import meantime from .precisionrecall import precision_recall diff --git a/src/ruptures/metrics/hamming.py b/src/ruptures/metrics/hamming.py index a9088bea..53c7db06 100644 --- a/src/ruptures/metrics/hamming.py +++ b/src/ruptures/metrics/hamming.py @@ -1,4 +1,5 @@ """Hamming metric for segmentation.""" + from ruptures.metrics.randindex import randindex diff --git a/src/ruptures/metrics/hausdorff.py b/src/ruptures/metrics/hausdorff.py index 8c7a5965..8e09efad 100644 --- a/src/ruptures/metrics/hausdorff.py +++ b/src/ruptures/metrics/hausdorff.py @@ -1,4 +1,5 @@ r"""Hausdorff metric.""" + import numpy as np from scipy.spatial.distance import cdist from ruptures.metrics.sanity_check import sanity_check diff --git a/src/ruptures/metrics/precisionrecall.py b/src/ruptures/metrics/precisionrecall.py index 343023ab..ffe6299a 100644 --- a/src/ruptures/metrics/precisionrecall.py +++ b/src/ruptures/metrics/precisionrecall.py @@ -1,4 +1,5 @@ r"""Precision and recall.""" + from itertools import product from ruptures.metrics.sanity_check import sanity_check diff --git a/src/ruptures/metrics/randindex.py b/src/ruptures/metrics/randindex.py index f58f1433..9c4b0896 100644 --- a/src/ruptures/metrics/randindex.py +++ b/src/ruptures/metrics/randindex.py @@ -1,4 +1,5 @@ r"""Rand index (`randindex`)""" + from ruptures.metrics.sanity_check import sanity_check diff --git a/src/ruptures/metrics/timeerror.py b/src/ruptures/metrics/timeerror.py index 9bbd4493..11732af5 100644 --- a/src/ruptures/metrics/timeerror.py +++ b/src/ruptures/metrics/timeerror.py @@ -1,4 +1,5 @@ """Mean time error.""" + import numpy as np from scipy.spatial.distance import cdist diff --git a/src/ruptures/utils/__init__.py b/src/ruptures/utils/__init__.py index 8a1ef123..492820e5 100644 --- a/src/ruptures/utils/__init__.py +++ b/src/ruptures/utils/__init__.py @@ -1,4 +1,5 @@ """Import utils functions.""" + from ruptures.utils._utils.convert_path_matrix import from_path_matrix_to_bkps_list from .bnode import Bnode diff --git a/src/ruptures/utils/bnode.py b/src/ruptures/utils/bnode.py index ccfe78c0..a4c6f304 100644 --- a/src/ruptures/utils/bnode.py +++ b/src/ruptures/utils/bnode.py @@ -1,4 +1,5 @@ """Binary node.""" + import functools import numpy as np diff --git a/tests/test_detection.py b/tests/test_detection.py index f9ea615f..606313c4 100644 --- a/tests/test_detection.py +++ b/tests/test_detection.py @@ -346,15 +346,11 @@ def test_model_small_signal(signal_bkps_5D_n10, algo, model): signal, _ = signal_bkps_5D_n10 with pytest.raises(BadSegmentationParameters): algo(model=model, min_size=5, jump=2).fit_predict(signal, n_bkps=2) - assert ( - len(algo(model=model, min_size=5, jump=2).fit_predict(signal, pen=10**6)) > 0 - ) + assert len(algo(model=model, min_size=5, jump=2).fit_predict(signal, pen=10**6)) > 0 assert ( len(algo(model=model, min_size=5, jump=2).fit_predict(signal, epsilon=10)) > 0 ) - assert ( - len(algo(model=model, min_size=9, jump=2).fit_predict(signal, pen=10**6)) > 0 - ) + assert len(algo(model=model, min_size=9, jump=2).fit_predict(signal, pen=10**6)) > 0 @pytest.mark.parametrize(