Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ license = { text = "Apache-2.0" }
readme = "README.md"

dependencies = [
"river>=0.22.0",
"scipy>=1.15.3",
]

Expand All @@ -23,12 +22,14 @@ dependencies = [

sklearn = ["scikit-learn>=1.6.1"]

huggingface = ["scipy>=1.15.2", "transformers[torch]>=4.52.3"]
huggingface = ["transformers[torch]>=4.52.3"]

polars = ["polars>=1.31.0"]

pandas = ["pandas>=2.2.3"]

river = ["river>=0.22.0"]


# -------------------------------------------------

Expand Down
2 changes: 1 addition & 1 deletion src/ml3_drift/analysis/analyzer/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def analyze(
else:
categorical_columns_ids = []

if len(continuous_columns_ids) == 0 and len(categorical_columns_ids) == 0:
if not continuous_columns_ids and not categorical_columns_ids:
raise ValueError(
"At least one of continuous_columns or categorical_columns must be provided."
Comment thread
GiovanniGiacometti marked this conversation as resolved.
)
Expand Down
13 changes: 12 additions & 1 deletion src/ml3_drift/monitoring/algorithms/online/adwin.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
from ml3_drift.monitoring.base.online_monitorning_algorithm import (
OnlineMonitorningAlgorithm,
)
from river.drift.adwin import ADWIN as RiverADWIN

RIVER = True
try:
from river.drift.adwin import ADWIN as RiverADWIN
except ModuleNotFoundError:
RIVER = False


class ADWIN(OnlineMonitorningAlgorithm, UnivariateMonitoringAlgorithm):
Expand All @@ -31,7 +36,13 @@ def __init__(
max_buckets: int = 5,
min_window_length: int = 5,
grace_period: int = 10,
*args,
**kwargs,
) -> None:
if not RIVER:
raise ModuleNotFoundError(
"River library is required for ADWIN algorithm. Please install it using pip install/ uv add ml3-drift[river]"
)
self.p_value = p_value
self.clock = clock
self.max_buckets = max_buckets
Expand Down
13 changes: 12 additions & 1 deletion src/ml3_drift/monitoring/algorithms/online/kswin.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,12 @@
from ml3_drift.monitoring.base.online_monitorning_algorithm import (
OnlineMonitorningAlgorithm,
)
from river.drift.kswin import KSWIN as RiverKSWIN

RIVER = True
try:
from river.drift.kswin import KSWIN as RiverKSWIN
except ModuleNotFoundError:
RIVER = False


class KSWIN(OnlineMonitorningAlgorithm, UnivariateMonitoringAlgorithm):
Expand All @@ -30,7 +35,13 @@ def __init__(
window_size: int = 100,
stat_size: int = 30,
seed: int | None = None,
*args,
**kwargs,
) -> None:
if not RIVER:
raise ModuleNotFoundError(
"River library is required for KSWIN algorithm. Please install it using pip install/ uv add ml3-drift[river]"
)
self.p_value = p_value
self.window_size = window_size
self.stat_size = stat_size
Expand Down
13 changes: 12 additions & 1 deletion src/ml3_drift/monitoring/algorithms/online/page_hinkley.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,12 @@
from ml3_drift.monitoring.base.online_monitorning_algorithm import (
OnlineMonitorningAlgorithm,
)
from river.drift.page_hinkley import PageHinkley as RiverPageHinkley

RIVER = True
try:
from river.drift.page_hinkley import PageHinkley as RiverPageHinkley
except ModuleNotFoundError:
RIVER = False


class PageHinkley(OnlineMonitorningAlgorithm, UnivariateMonitoringAlgorithm):
Expand All @@ -33,7 +38,13 @@ def __init__(
threshold: int = 50,
mode: str = "both",
seed: int | None = None,
*args,
**kwargs,
) -> None:
if not RIVER:
raise ModuleNotFoundError(
"River library is required for PageHinkley algorithm. Please install it using pip install/ uv add ml3-drift[river]"
)
self.min_instances = min_instances
self.delta = delta
Comment thread
GiovanniGiacometti marked this conversation as resolved.
self.alpha = alpha
Expand Down
2 changes: 1 addition & 1 deletion tests/test_analyzer/test_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def test_batch_analyzer_null_columns():
n_samples=n_samples,
n_cont=n_cont,
n_cat=n_cat,
data_format="pandas",
data_format="numpy",
seed=2,
)

Expand Down
10 changes: 10 additions & 0 deletions tests/test_monitoring/test_online/test_univariate.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
import pytest
from tests.conftest import is_module_available
import numpy as np
from ml3_drift.monitoring.algorithms.online.adwin import ADWIN
from ml3_drift.monitoring.algorithms.online.kswin import KSWIN
from ml3_drift.monitoring.algorithms.online.page_hinkley import PageHinkley

if not is_module_available("river"):
with pytest.raises(ModuleNotFoundError):
ADWIN()
KSWIN()
PageHinkley()
# Prevent tests from running if sklearn is not available
pytest.skip(allow_module_level=True)

Comment thread
GiovanniGiacometti marked this conversation as resolved.

class TestContinuousUnivariateOnlineAlgorithms:
def test_kswin_univariate_one_drift(self, abrupt_univariate_online_drift_info):
Expand Down
9 changes: 4 additions & 5 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.