diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index ac5bf36b8..4aab8ed6c 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -15,15 +15,9 @@ jobs:
strategy:
matrix:
include:
- - os: ubuntu-latest
- python-version: "3.7"
- numpy-version: 1.21.4
- - os: ubuntu-latest
- python-version: "3.8"
- numpy-version: 1.21.4
- os: ubuntu-latest
python-version: "3.9"
- numpy-version: 1.21.4
+ numpy-version: 1.22.4
- os: ubuntu-latest
python-version: "3.10"
numpy-version: 1.22.4
diff --git a/README.rst b/README.rst
index bca9b5fee..0183d8998 100644
--- a/README.rst
+++ b/README.rst
@@ -79,8 +79,8 @@ Implemented methods in **MAPIE** respect three fundamental pillars:
🔗 Requirements
===============
-- **MAPIE** runs on Python 3.7+.
-- **MAPIE** stands on the shoulders of giants. Its only internal dependencies are `scikit-learn `_ and `numpy=>1.21 `_.
+- **MAPIE** runs on Python 3.9+.
+- **MAPIE** stands on the shoulders of giants. Its only internal dependencies are `scikit-learn `_ and `numpy=>1.22 `_.
🛠Installation
diff --git a/doc/v1_migration_guide.rst b/doc/v1_migration_guide.rst
index abd1b4192..3af25c2b1 100644
--- a/doc/v1_migration_guide.rst
+++ b/doc/v1_migration_guide.rst
@@ -5,7 +5,14 @@ MAPIE v1 introduces several updates, enhancements, and structural changes that s
This guide outlines the differences between MAPIE v0.x and MAPIE v1 and provides instructions for migrating your code to the new API.
-1. Overview of class restructuring
+1. Python and NumPy versions support
+-------------------------------------------------
+
+We now support Python >= 3.9 (formerly >=3.7), and NumPy >= 1.22 (formerly >=1.21).
+
+MAPIE v1 may run with Python < 3.9, but we do not recommend it.
+
+2. Class restructuring
-----------------------------------
MAPIE v1 breaks down the ``MapieRegressor`` and ``MapieClassifier`` classes into 5 classes, each dedicated to a particular conformal prediction technique. ``MapieQuantileRegressor`` has also been revamped, and renamed ``ConformalizedQuantileRegressor``.
@@ -48,7 +55,7 @@ The ``cv`` parameter is key to understand what new class to use in the v1 API:
For more details regarding the difference between split and cross conformal types, see :doc:`split_cross_conformal`
-2. Method changes
+3. Method changes
-----------------
In MAPIE v1, the conformal prediction workflow is more streamlined and modular, with distinct methods for training, conformalization (named calibration in the scientific literature), and prediction. The conformalization process in v1 consists of four steps.
@@ -91,7 +98,7 @@ The ``.predict()`` method now focuses solely on producing point predictions.
-3. Parameters change
+4. Parameters change
------------------------
``alpha``
@@ -182,7 +189,7 @@ No more parameters with incorrect ``None`` defaults.
- **v1**: All parameters now have explicit defaults.
-4. Migration example: MAPIE v0.x to MAPIE v1
+5. Migration examples: MAPIE v0.x to MAPIE v1
----------------------------------------------------------------------------------------
Below is a side-by-side example of code in MAPIE v0.x and its equivalent in MAPIE v1
diff --git a/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py b/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py
index 894add6aa..286b374a8 100644
--- a/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py
+++ b/examples/calibration/1-quickstart/plot_calibration_hypothesis_testing.py
@@ -29,7 +29,7 @@
from matplotlib import pyplot as plt
from sklearn.utils import check_random_state
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import (cumulative_differences, kolmogorov_smirnov_p_value,
length_scale)
diff --git a/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py b/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py
index ae5cb8b24..decc5d944 100644
--- a/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py
+++ b/examples/calibration/2-advanced-analysis/plot_asymptotic_convergence_of_p_values.py
@@ -39,7 +39,7 @@
from matplotlib import pyplot as plt
from sklearn.utils import check_random_state
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import (kolmogorov_smirnov_p_value, kuiper_p_value,
spiegelhalter_p_value)
diff --git a/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py b/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py
index 014ed943a..4fb5725c2 100644
--- a/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py
+++ b/examples/classification/1-quickstart/plot_comp_methods_on_2d_dataset.py
@@ -53,7 +53,7 @@
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.classification import MapieClassifier
from mapie.metrics import (classification_coverage_score,
classification_mean_width_score)
diff --git a/examples/classification/4-tutorials/plot_crossconformal.py b/examples/classification/4-tutorials/plot_crossconformal.py
index f9469300b..c78587377 100644
--- a/examples/classification/4-tutorials/plot_crossconformal.py
+++ b/examples/classification/4-tutorials/plot_crossconformal.py
@@ -35,7 +35,7 @@
from sklearn.naive_bayes import GaussianNB
from typing_extensions import TypedDict
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.classification import MapieClassifier
from mapie.metrics import (classification_coverage_score,
classification_mean_width_score)
diff --git a/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py b/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py
index f83d24011..9fb66b142 100644
--- a/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py
+++ b/examples/classification/4-tutorials/plot_main-tutorial-binary-classification.py
@@ -33,7 +33,7 @@
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.classification import MapieClassifier
from mapie.metrics import (classification_coverage_score,
classification_mean_width_score)
diff --git a/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py b/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py
index b2d9bc72f..f89ee5cde 100644
--- a/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py
+++ b/examples/regression/1-quickstart/plot_heteroscedastic_1d_data.py
@@ -25,7 +25,7 @@
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie_v1.regression import (
CrossConformalRegressor,
JackknifeAfterBootstrapRegressor,
diff --git a/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py b/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py
index 4668d75f9..504579248 100644
--- a/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py
+++ b/examples/regression/1-quickstart/plot_homoscedastic_1d_data.py
@@ -23,7 +23,7 @@
from sklearn.model_selection import train_test_split
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie_v1.regression import (
CrossConformalRegressor,
JackknifeAfterBootstrapRegressor,
diff --git a/examples/regression/1-quickstart/plot_prefit.py b/examples/regression/1-quickstart/plot_prefit.py
index 83b68ee2c..22714a2ac 100644
--- a/examples/regression/1-quickstart/plot_prefit.py
+++ b/examples/regression/1-quickstart/plot_prefit.py
@@ -26,7 +26,7 @@
from matplotlib import pyplot as plt
from sklearn.neural_network import MLPRegressor
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import regression_coverage_score
from mapie_v1.regression import SplitConformalRegressor, ConformalizedQuantileRegressor
from mapie_v1.utils import train_conformalize_test_split
diff --git a/examples/regression/2-advanced-analysis/plot_both_uncertainties.py b/examples/regression/2-advanced-analysis/plot_both_uncertainties.py
index 6e87cb273..574164bbd 100644
--- a/examples/regression/2-advanced-analysis/plot_both_uncertainties.py
+++ b/examples/regression/2-advanced-analysis/plot_both_uncertainties.py
@@ -19,7 +19,7 @@
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie_v1.regression import (
CrossConformalRegressor,
ConformalizedQuantileRegressor,
diff --git a/examples/regression/2-advanced-analysis/plot_conditional_coverage.py b/examples/regression/2-advanced-analysis/plot_conditional_coverage.py
index 62f0b72b6..f9a6b52dc 100644
--- a/examples/regression/2-advanced-analysis/plot_conditional_coverage.py
+++ b/examples/regression/2-advanced-analysis/plot_conditional_coverage.py
@@ -26,7 +26,7 @@
from lightgbm import LGBMRegressor
from sklearn.model_selection import train_test_split
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.conformity_scores import (GammaConformityScore,
ResidualNormalisedScore)
from mapie.metrics import (hsic, regression_coverage_score_v2, regression_ssc,
diff --git a/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py b/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py
index 3ac2f5de0..249338548 100644
--- a/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py
+++ b/examples/regression/2-advanced-analysis/plot_timeseries_enbpi.py
@@ -34,7 +34,7 @@
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import RandomizedSearchCV, TimeSeriesSplit
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import (regression_coverage_score,
regression_mean_width_score)
from mapie.regression import MapieTimeSeriesRegressor
diff --git a/examples/regression/3-scientific-articles/plot_barber2020_simulations.py b/examples/regression/3-scientific-articles/plot_barber2020_simulations.py
index a3071cf34..9021ab70c 100644
--- a/examples/regression/3-scientific-articles/plot_barber2020_simulations.py
+++ b/examples/regression/3-scientific-articles/plot_barber2020_simulations.py
@@ -35,7 +35,7 @@
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import (regression_coverage_score,
regression_mean_width_score)
from mapie_v1.regression import CrossConformalRegressor
diff --git a/examples/regression/3-scientific-articles/plot_kim2020_simulations.py b/examples/regression/3-scientific-articles/plot_kim2020_simulations.py
index a795b2480..45ceb0477 100644
--- a/examples/regression/3-scientific-articles/plot_kim2020_simulations.py
+++ b/examples/regression/3-scientific-articles/plot_kim2020_simulations.py
@@ -45,7 +45,7 @@
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.metrics import (regression_coverage_score,
regression_mean_width_score)
from mapie_v1.regression import (
diff --git a/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py b/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py
index 46acc788f..d62a1efc3 100644
--- a/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py
+++ b/examples/regression/3-scientific-articles/plot_zaffran2022_comparison.py
@@ -45,7 +45,7 @@
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import PredefinedSplit
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.conformity_scores import AbsoluteConformityScore
from mapie.time_series_regression import MapieTimeSeriesRegressor
diff --git a/mapie/_compatibility.py b/mapie/_compatibility.py
deleted file mode 100644
index 5ead5c201..000000000
--- a/mapie/_compatibility.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from typing import Any
-
-import numpy as np
-from packaging.version import parse as parse_version
-
-from ._typing import ArrayLike, NDArray
-
-
-def np_quantile_version_below_122(
- a: ArrayLike,
- q: ArrayLike,
- method: str = "linear",
- **kwargs: Any
-) -> NDArray:
- """Wrapper of np.quantile function for numpy version < 1.22."""
- return np.quantile(a, q, interpolation=method, **kwargs) # type: ignore
-
-
-def np_quantile_version_above_122(
- a: ArrayLike,
- q: ArrayLike,
- method: str = "linear",
- **kwargs: Any
-) -> NDArray:
- """Wrapper of np.quantile function for numpy version >= 1.22."""
- return np.quantile(a, q, method=method, **kwargs) # type: ignore
-
-
-def np_nanquantile_version_below_122(
- a: ArrayLike,
- q: ArrayLike,
- method: str = "linear",
- **kwargs: Any
-) -> NDArray:
- """Wrapper of np.quantile function for numpy version < 1.22."""
- # Does not work if `a` is of dtype object. Converting `a` to a float array
- # is necessary in order to use this function safely.
- return np.nanquantile(a, q, interpolation=method, **kwargs)
-
-
-def np_nanquantile_version_above_122(
- a: ArrayLike,
- q: ArrayLike,
- method: str = "linear",
- **kwargs: Any
-) -> NDArray:
- """Wrapper of np.quantile function for numpy version >= 1.22."""
- return np.nanquantile(a, q, method=method, **kwargs) # type: ignore
-
-
-numpy_version = parse_version(np.__version__)
-if numpy_version < parse_version("1.22"):
- np_quantile = np_quantile_version_below_122
- np_nanquantile = np_nanquantile_version_below_122
-
-else:
- np_quantile = np_quantile_version_above_122
- np_nanquantile = np_nanquantile_version_above_122
diff --git a/mapie/_typing.py b/mapie/_typing.py
deleted file mode 100644
index af5839e8c..000000000
--- a/mapie/_typing.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from numpy.typing import ArrayLike, NDArray
-
-__all__ = ["ArrayLike", "NDArray"]
diff --git a/mapie/aggregation_functions.py b/mapie/aggregation_functions.py
index ad9a8181c..ad35f2214 100644
--- a/mapie/aggregation_functions.py
+++ b/mapie/aggregation_functions.py
@@ -2,7 +2,7 @@
import numpy as np
-from ._typing import NDArray
+from numpy.typing import NDArray
def phi1D(
diff --git a/mapie/calibration.py b/mapie/calibration.py
index ea3834a38..09edf9957 100644
--- a/mapie/calibration.py
+++ b/mapie/calibration.py
@@ -12,7 +12,7 @@
from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted,
indexable)
-from ._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from .utils import (check_estimator_classification,
check_estimator_fit_predict, check_n_features_in,
check_null_weight, fit_estimator, get_calib_set)
diff --git a/mapie/classification.py b/mapie/classification.py
index fb73ad7ec..da8cd04b1 100644
--- a/mapie/classification.py
+++ b/mapie/classification.py
@@ -10,7 +10,7 @@
from sklearn.utils import check_random_state
from sklearn.utils.validation import (_check_y, check_is_fitted, indexable)
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseClassificationScore
from mapie.conformity_scores.sets.raps import RAPSConformityScore
from mapie.conformity_scores.utils import (
diff --git a/mapie/conformity_scores/bounds/absolute.py b/mapie/conformity_scores/bounds/absolute.py
index 90c1c3e94..7a53d3cf5 100644
--- a/mapie/conformity_scores/bounds/absolute.py
+++ b/mapie/conformity_scores/bounds/absolute.py
@@ -1,6 +1,6 @@
import numpy as np
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseRegressionScore
diff --git a/mapie/conformity_scores/bounds/gamma.py b/mapie/conformity_scores/bounds/gamma.py
index 09f161e02..5eb05b031 100644
--- a/mapie/conformity_scores/bounds/gamma.py
+++ b/mapie/conformity_scores/bounds/gamma.py
@@ -1,6 +1,6 @@
import numpy as np
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseRegressionScore
diff --git a/mapie/conformity_scores/bounds/residuals.py b/mapie/conformity_scores/bounds/residuals.py
index 5ce0d799a..f41a257f4 100644
--- a/mapie/conformity_scores/bounds/residuals.py
+++ b/mapie/conformity_scores/bounds/residuals.py
@@ -9,7 +9,7 @@
from sklearn.utils.validation import (check_is_fitted, check_random_state,
indexable)
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseRegressionScore
diff --git a/mapie/conformity_scores/classification.py b/mapie/conformity_scores/classification.py
index 5dda679cf..0239089d6 100644
--- a/mapie/conformity_scores/classification.py
+++ b/mapie/conformity_scores/classification.py
@@ -6,7 +6,7 @@
from mapie.conformity_scores.interface import BaseConformityScore
from mapie.estimator.classifier import EnsembleClassifier
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
class BaseClassificationScore(BaseConformityScore, metaclass=ABCMeta):
diff --git a/mapie/conformity_scores/conformity_scores.py b/mapie/conformity_scores/conformity_scores.py
index e6953a81d..691f76163 100644
--- a/mapie/conformity_scores/conformity_scores.py
+++ b/mapie/conformity_scores/conformity_scores.py
@@ -4,7 +4,7 @@
from mapie.conformity_scores.regression import BaseConformityScore
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
@deprecated(
diff --git a/mapie/conformity_scores/interface.py b/mapie/conformity_scores/interface.py
index 07345d3e4..e8dd3834b 100644
--- a/mapie/conformity_scores/interface.py
+++ b/mapie/conformity_scores/interface.py
@@ -4,8 +4,7 @@
import numpy as np
from sklearn.base import BaseEstimator
-from mapie._compatibility import np_nanquantile
-from mapie._typing import NDArray
+from numpy.typing import NDArray
class BaseConformityScore(metaclass=ABCMeta):
@@ -155,7 +154,7 @@ def get_quantile(
# Otherwise, the quantile is calculated as the corrected lower quantile
# of the signed conformity scores.
quantile = signed * np.column_stack([
- np_nanquantile(
+ np.nanquantile(
signed * conformity_scores, _alpha_cor,
axis=axis, method="lower"
) if not (unbounded and _alpha >= 1) else np.inf * np.ones(n_ref)
diff --git a/mapie/conformity_scores/regression.py b/mapie/conformity_scores/regression.py
index 35c3985f1..e28867f17 100644
--- a/mapie/conformity_scores/regression.py
+++ b/mapie/conformity_scores/regression.py
@@ -7,9 +7,8 @@
from mapie.conformity_scores.interface import BaseConformityScore
from mapie.estimator.regressor import EnsembleRegressor
-from mapie._compatibility import np_nanquantile
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
class BaseRegressionScore(BaseConformityScore, metaclass=ABCMeta):
@@ -238,13 +237,13 @@ def _beta_optimize(
num=len(lower_bounds),
endpoint=True,
)
- one_alpha_beta = np_nanquantile(
+ one_alpha_beta = np.nanquantile(
upper_bounds.astype(float),
1 - _alpha + betas,
axis=1,
method="higher",
)
- beta = np_nanquantile(
+ beta = np.nanquantile(
lower_bounds.astype(float),
betas,
axis=1,
diff --git a/mapie/conformity_scores/sets/aps.py b/mapie/conformity_scores/sets/aps.py
index 9847f8b7d..5ed36021f 100644
--- a/mapie/conformity_scores/sets/aps.py
+++ b/mapie/conformity_scores/sets/aps.py
@@ -11,7 +11,7 @@
from mapie.estimator.classifier import EnsembleClassifier
from mapie._machine_precision import EPSILON
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.utils import compute_quantiles
diff --git a/mapie/conformity_scores/sets/lac.py b/mapie/conformity_scores/sets/lac.py
index e5f088158..0a94e0258 100644
--- a/mapie/conformity_scores/sets/lac.py
+++ b/mapie/conformity_scores/sets/lac.py
@@ -7,7 +7,7 @@
from mapie.estimator.classifier import EnsembleClassifier
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.utils import compute_quantiles
diff --git a/mapie/conformity_scores/sets/naive.py b/mapie/conformity_scores/sets/naive.py
index 09bafa181..1a2a868e7 100644
--- a/mapie/conformity_scores/sets/naive.py
+++ b/mapie/conformity_scores/sets/naive.py
@@ -9,7 +9,7 @@
from mapie.estimator.classifier import EnsembleClassifier
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
class NaiveConformityScore(BaseClassificationScore):
diff --git a/mapie/conformity_scores/sets/raps.py b/mapie/conformity_scores/sets/raps.py
index 435c135ba..78dc356e7 100644
--- a/mapie/conformity_scores/sets/raps.py
+++ b/mapie/conformity_scores/sets/raps.py
@@ -11,7 +11,7 @@
from mapie.estimator.classifier import EnsembleClassifier
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import classification_mean_width_score
from mapie.utils import check_alpha_and_n_samples, compute_quantiles
diff --git a/mapie/conformity_scores/sets/topk.py b/mapie/conformity_scores/sets/topk.py
index cfad29a0a..3ec248b5b 100644
--- a/mapie/conformity_scores/sets/topk.py
+++ b/mapie/conformity_scores/sets/topk.py
@@ -9,7 +9,7 @@
from mapie.estimator.classifier import EnsembleClassifier
from mapie._machine_precision import EPSILON
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.utils import compute_quantiles
diff --git a/mapie/conformity_scores/sets/utils.py b/mapie/conformity_scores/sets/utils.py
index 5912607fb..46ad064cc 100644
--- a/mapie/conformity_scores/sets/utils.py
+++ b/mapie/conformity_scores/sets/utils.py
@@ -1,7 +1,7 @@
from typing import Optional, Union
import numpy as np
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie._machine_precision import EPSILON
diff --git a/mapie/conformity_scores/utils.py b/mapie/conformity_scores/utils.py
index 59f171d93..d0271f40f 100644
--- a/mapie/conformity_scores/utils.py
+++ b/mapie/conformity_scores/utils.py
@@ -12,7 +12,7 @@
RAPSConformityScore, TopKConformityScore
)
-from mapie._typing import ArrayLike
+from numpy.typing import ArrayLike
METHOD_SCORE_MAP = {
diff --git a/mapie/control_risk/ltt.py b/mapie/control_risk/ltt.py
index 67686df54..9b7d7e124 100644
--- a/mapie/control_risk/ltt.py
+++ b/mapie/control_risk/ltt.py
@@ -3,7 +3,7 @@
import numpy as np
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from .p_values import compute_hoeffdding_bentkus_p_value
diff --git a/mapie/control_risk/p_values.py b/mapie/control_risk/p_values.py
index 63623f3e5..81800cd5b 100644
--- a/mapie/control_risk/p_values.py
+++ b/mapie/control_risk/p_values.py
@@ -3,7 +3,7 @@
import numpy as np
from scipy.stats import binom
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.utils import check_alpha
diff --git a/mapie/control_risk/risks.py b/mapie/control_risk/risks.py
index 76bbf6c7b..490be62a6 100644
--- a/mapie/control_risk/risks.py
+++ b/mapie/control_risk/risks.py
@@ -3,7 +3,7 @@
import numpy as np
from sklearn.utils.validation import column_or_1d
-from mapie._typing import NDArray
+from numpy.typing import NDArray
def compute_risk_recall(
diff --git a/mapie/estimator/classifier.py b/mapie/estimator/classifier.py
index 9cd45e64e..e5eeb5a64 100644
--- a/mapie/estimator/classifier.py
+++ b/mapie/estimator/classifier.py
@@ -9,7 +9,7 @@
from sklearn.utils import _safe_indexing
from sklearn.utils.validation import _num_samples, check_is_fitted
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.utils import check_no_agg_cv, fit_estimator, fix_number_of_classes
diff --git a/mapie/estimator/regressor.py b/mapie/estimator/regressor.py
index a5c8c0fb2..be03fe4dc 100644
--- a/mapie/estimator/regressor.py
+++ b/mapie/estimator/regressor.py
@@ -9,7 +9,7 @@
from sklearn.utils import _safe_indexing, deprecated
from sklearn.utils.validation import _num_samples, check_is_fitted
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.aggregation_functions import aggregate_all, phi2D
from mapie.utils import (check_nan_in_aposteriori_prediction, check_no_agg_cv,
fit_estimator)
diff --git a/mapie/metrics.py b/mapie/metrics.py
index 9990f4cb9..97d9d2ee7 100644
--- a/mapie/metrics.py
+++ b/mapie/metrics.py
@@ -6,7 +6,7 @@
from sklearn.utils.validation import check_array, column_or_1d
from ._machine_precision import EPSILON
-from ._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from .utils import (calc_bins, check_alpha, check_array_inf, check_array_nan,
check_array_shape_classification, check_split_strategy,
check_array_shape_regression, check_arrays_length,
diff --git a/mapie/mondrian.py b/mapie/mondrian.py
index d461a8498..564816583 100644
--- a/mapie/mondrian.py
+++ b/mapie/mondrian.py
@@ -24,7 +24,7 @@
MapieTimeSeriesRegressor
)
from mapie.utils import check_alpha
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
class MondrianCP(BaseEstimator):
diff --git a/mapie/multi_label_classification.py b/mapie/multi_label_classification.py
index e47a8e5e5..01a9130a4 100644
--- a/mapie/multi_label_classification.py
+++ b/mapie/multi_label_classification.py
@@ -14,7 +14,7 @@
from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted,
indexable)
-from ._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from .control_risk.crc_rcps import find_lambda_star, get_r_hat_plus
from .control_risk.ltt import find_lambda_control_star, ltt_procedure
from .control_risk.risks import compute_risk_precision, compute_risk_recall
diff --git a/mapie/regression/quantile_regression.py b/mapie/regression/quantile_regression.py
index 1b18731ff..ec62b3026 100644
--- a/mapie/regression/quantile_regression.py
+++ b/mapie/regression/quantile_regression.py
@@ -11,8 +11,7 @@
from sklearn.utils.validation import (_check_y, _num_samples, check_is_fitted,
indexable)
-from mapie._compatibility import np_quantile
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.utils import (check_alpha_and_n_samples,
check_defined_variables_predict_cqr,
check_estimator_fit_predict, check_lower_upper_bounds,
@@ -745,17 +744,17 @@ def predict(
if symmetry:
quantile = np.full(
2,
- np_quantile(
+ np.quantile(
self.conformity_scores_[2], q, method="higher"
)
)
else:
quantile = np.array(
[
- np_quantile(
+ np.quantile(
self.conformity_scores_[0], q, method="higher"
),
- np_quantile(
+ np.quantile(
self.conformity_scores_[1], q, method="higher"
)
]
diff --git a/mapie/regression/regression.py b/mapie/regression/regression.py
index 0a9025d44..88963dd39 100644
--- a/mapie/regression/regression.py
+++ b/mapie/regression/regression.py
@@ -10,7 +10,7 @@
from sklearn.utils import check_random_state
from sklearn.utils.validation import _check_y, check_is_fitted, indexable
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import (BaseRegressionScore,
ResidualNormalisedScore)
from mapie.conformity_scores.utils import check_regression_conformity_score
diff --git a/mapie/regression/time_series_regression.py b/mapie/regression/time_series_regression.py
index e4e6f5520..3d74e2fec 100644
--- a/mapie/regression/time_series_regression.py
+++ b/mapie/regression/time_series_regression.py
@@ -8,7 +8,7 @@
from sklearn.model_selection import BaseCrossValidator
from sklearn.utils.validation import check_is_fitted
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseRegressionScore
from mapie.regression import MapieRegressor
from mapie.utils import check_alpha, check_gamma
diff --git a/mapie/subsample.py b/mapie/subsample.py
index 88293bc5e..3bef3c393 100644
--- a/mapie/subsample.py
+++ b/mapie/subsample.py
@@ -9,7 +9,7 @@
from sklearn.utils import check_random_state, resample
from sklearn.utils.validation import _num_samples
-from ._typing import NDArray
+from numpy.typing import NDArray
from .utils import check_n_samples
diff --git a/mapie/tests/test_classification.py b/mapie/tests/test_classification.py
index d04c3683b..9ea7d6e13 100644
--- a/mapie/tests/test_classification.py
+++ b/mapie/tests/test_classification.py
@@ -22,7 +22,7 @@
from sklearn.utils.validation import check_is_fitted
from typing_extensions import TypedDict
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.classification import MapieClassifier
from mapie.conformity_scores import LACConformityScore
from mapie.conformity_scores.utils import METHOD_SCORE_MAP
diff --git a/mapie/tests/test_common.py b/mapie/tests/test_common.py
index 328350135..557da1a76 100644
--- a/mapie/tests/test_common.py
+++ b/mapie/tests/test_common.py
@@ -11,7 +11,7 @@
from sklearn.utils.estimator_checks import parametrize_with_checks
from sklearn.utils.validation import check_is_fitted
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.classification import MapieClassifier
from mapie.regression import MapieQuantileRegressor, MapieRegressor
diff --git a/mapie/tests/test_conformity_scores_bounds.py b/mapie/tests/test_conformity_scores_bounds.py
index bd7b9209d..ac30e7a57 100644
--- a/mapie/tests/test_conformity_scores_bounds.py
+++ b/mapie/tests/test_conformity_scores_bounds.py
@@ -5,7 +5,7 @@
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import (
AbsoluteConformityScore, BaseRegressionScore, GammaConformityScore,
ResidualNormalisedScore
diff --git a/mapie/tests/test_conformity_scores_sets.py b/mapie/tests/test_conformity_scores_sets.py
index f8aa1e9ab..02b86032a 100644
--- a/mapie/tests/test_conformity_scores_sets.py
+++ b/mapie/tests/test_conformity_scores_sets.py
@@ -5,7 +5,7 @@
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.classification import MapieClassifier
from mapie.conformity_scores import BaseClassificationScore
from mapie.conformity_scores.sets import (
diff --git a/mapie/tests/test_conformity_scores_utils.py b/mapie/tests/test_conformity_scores_utils.py
index 9d07fa8bc..4636d2396 100644
--- a/mapie/tests/test_conformity_scores_utils.py
+++ b/mapie/tests/test_conformity_scores_utils.py
@@ -4,7 +4,7 @@
import pytest
from mapie.conformity_scores.sets.utils import get_true_label_position
-from mapie._typing import NDArray
+from numpy.typing import NDArray
Y_TRUE_PROBA_PLACE = [
[
diff --git a/mapie/tests/test_control_risk.py b/mapie/tests/test_control_risk.py
index f1171335b..66eaab09f 100644
--- a/mapie/tests/test_control_risk.py
+++ b/mapie/tests/test_control_risk.py
@@ -7,7 +7,7 @@
import numpy as np
import pytest
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.control_risk.ltt import find_lambda_control_star, ltt_procedure
from mapie.control_risk.p_values import compute_hoeffdding_bentkus_p_value
from mapie.control_risk.risks import (compute_risk_precision,
diff --git a/mapie/tests/test_metrics.py b/mapie/tests/test_metrics.py
index 5607c2b98..ec05bc652 100644
--- a/mapie/tests/test_metrics.py
+++ b/mapie/tests/test_metrics.py
@@ -8,7 +8,7 @@
from numpy.random import RandomState
from typing_extensions import TypedDict
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.metrics import (add_jitter, classification_coverage_score,
classification_coverage_score_v2,
classification_mean_width_score, classification_ssc,
diff --git a/mapie/tests/test_multi_label_classification.py b/mapie/tests/test_multi_label_classification.py
index ad21c027a..4ce0021e2 100644
--- a/mapie/tests/test_multi_label_classification.py
+++ b/mapie/tests/test_multi_label_classification.py
@@ -13,7 +13,7 @@
from sklearn.utils.validation import check_is_fitted
from typing_extensions import TypedDict
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.multi_label_classification import MapieMultiLabelClassifier
Params = TypedDict(
diff --git a/mapie/tests/test_quantile_regression.py b/mapie/tests/test_quantile_regression.py
index ca463ae51..8b017e8dd 100644
--- a/mapie/tests/test_quantile_regression.py
+++ b/mapie/tests/test_quantile_regression.py
@@ -18,7 +18,7 @@
from sklearn.utils.validation import check_is_fitted
from typing_extensions import TypedDict
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.metrics import regression_coverage_score
from mapie.regression import MapieQuantileRegressor
diff --git a/mapie/tests/test_regression.py b/mapie/tests/test_regression.py
index bcf34c7e4..6a298c215 100644
--- a/mapie/tests/test_regression.py
+++ b/mapie/tests/test_regression.py
@@ -24,7 +24,7 @@
from sklearn.utils.validation import check_is_fitted
from typing_extensions import TypedDict
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.aggregation_functions import aggregate_all
from mapie.conformity_scores import (
AbsoluteConformityScore, BaseRegressionScore, GammaConformityScore,
diff --git a/mapie/tests/test_time_series_regression.py b/mapie/tests/test_time_series_regression.py
index bc594a435..a4220ee09 100644
--- a/mapie/tests/test_time_series_regression.py
+++ b/mapie/tests/test_time_series_regression.py
@@ -10,7 +10,7 @@
from sklearn.utils.estimator_checks import check_estimator
from typing_extensions import TypedDict
-from mapie._typing import NDArray
+from numpy.typing import NDArray
from mapie.aggregation_functions import aggregate_all
from mapie.conformity_scores import AbsoluteConformityScore
from mapie.metrics import regression_coverage_score
diff --git a/mapie/tests/test_utils.py b/mapie/tests/test_utils.py
index 871a3af16..057ee0335 100644
--- a/mapie/tests/test_utils.py
+++ b/mapie/tests/test_utils.py
@@ -13,7 +13,7 @@
ShuffleSplit)
from sklearn.utils.validation import check_is_fitted
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.regression import MapieQuantileRegressor
from mapie.utils import (check_alpha, check_alpha_and_n_samples,
check_array_inf, check_array_nan, check_arrays_length,
diff --git a/mapie/utils.py b/mapie/utils.py
index b7fbf0047..b40e9fb22 100644
--- a/mapie/utils.py
+++ b/mapie/utils.py
@@ -15,8 +15,7 @@
from sklearn.utils.validation import (_check_sample_weight, _num_features,
check_is_fitted, column_or_1d)
-from ._compatibility import np_quantile
-from ._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
SPLIT_STRATEGIES = ["uniform", "quantile", "array split"]
@@ -718,7 +717,7 @@ def compute_quantiles(vector: NDArray, alpha: NDArray) -> NDArray:
if len(vector.shape) <= 2:
quantiles_ = np.stack(
[
- np_quantile(
+ np.quantile(
vector,
((n + 1) * (1 - _alpha)) / n,
method="higher",
diff --git a/mapie_v1/classification.py b/mapie_v1/classification.py
index 35b0ebf56..aeb35847c 100644
--- a/mapie_v1/classification.py
+++ b/mapie_v1/classification.py
@@ -8,7 +8,7 @@
from sklearn.model_selection import BaseCrossValidator
from sklearn.linear_model import LogisticRegression
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.classification import MapieClassifier
from mapie.conformity_scores import BaseClassificationScore
from mapie_v1.utils import (
diff --git a/mapie_v1/regression.py b/mapie_v1/regression.py
index f2b18963d..cf34f0dee 100644
--- a/mapie_v1/regression.py
+++ b/mapie_v1/regression.py
@@ -8,7 +8,7 @@
from sklearn.pipeline import Pipeline
from mapie.subsample import Subsample
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import BaseRegressionScore
from mapie.regression import MapieRegressor, MapieQuantileRegressor
from mapie.utils import check_estimator_fit_predict
diff --git a/mapie_v1/utils.py b/mapie_v1/utils.py
index 1afa0257d..1deec7dcd 100644
--- a/mapie_v1/utils.py
+++ b/mapie_v1/utils.py
@@ -2,7 +2,7 @@
from typing import Union, Tuple, cast, Optional, Iterable
from collections.abc import Iterable as IterableType
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from sklearn.model_selection import BaseCrossValidator
from sklearn.model_selection import train_test_split
from decimal import Decimal
diff --git a/pyproject.toml b/pyproject.toml
index a00f28078..abdd14598 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,12 +16,11 @@ maintainers = [
{name = "Louis Lacombe", email = "louis.lacombe@capgemini.com"},
{name = "Vincent Blot", email = "vincent.blot@capgemini.com"},
]
-requires-python = ">=3.7"
+requires-python = ">=3.9"
dependencies = [
"scikit-learn<1.6.0",
"scipy",
- "numpy>=1.21",
- "packaging"
+ "numpy>=1.22"
]
classifiers = [
"Intended Audience :: Science/Research",
diff --git a/tests_v1/test_functional/test_non_regression_classification.py b/tests_v1/test_functional/test_non_regression_classification.py
index eb6fbaf9f..db762b392 100644
--- a/tests_v1/test_functional/test_non_regression_classification.py
+++ b/tests_v1/test_functional/test_non_regression_classification.py
@@ -16,7 +16,7 @@
DummyClassifierWithFitAndPredictParams,
train_test_split_shuffle,
)
-from mapie._typing import ArrayLike
+from numpy.typing import ArrayLike
RANDOM_STATE = 1
diff --git a/tests_v1/test_functional/test_non_regression_regression.py b/tests_v1/test_functional/test_non_regression_regression.py
index 5a3d22f5a..28799687f 100644
--- a/tests_v1/test_functional/test_non_regression_regression.py
+++ b/tests_v1/test_functional/test_non_regression_regression.py
@@ -12,7 +12,7 @@
from sklearn.model_selection import train_test_split
from mapie.subsample import Subsample
-from mapie._typing import ArrayLike, NDArray
+from numpy.typing import ArrayLike, NDArray
from mapie.conformity_scores import GammaConformityScore, \
AbsoluteConformityScore, ResidualNormalisedScore
from mapie_v1.regression import SplitConformalRegressor, \
diff --git a/tests_v1/test_functional/utils.py b/tests_v1/test_functional/utils.py
index bd41315e8..576f3054d 100644
--- a/tests_v1/test_functional/utils.py
+++ b/tests_v1/test_functional/utils.py
@@ -4,7 +4,7 @@
from sklearn.base import BaseEstimator, ClassifierMixin
from typing_extensions import Self
-from mapie._typing import NDArray, ArrayLike
+from numpy.typing import NDArray, ArrayLike
import inspect
from sklearn.model_selection import ShuffleSplit