Metadata-Version: 2.4
Name: drift-lite
Version: 0.1.0
Summary: 
Author: alien1403
Author-email: hanghicelrazvanmihai@gmail.com
Requires-Python: >=3.12
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Dist: numpy (>=2.4.6,<3.0.0)
Requires-Dist: pandas (>=3.0.3,<4.0.0)
Requires-Dist: scikit-learn (>=1.9.0,<2.0.0)
Requires-Dist: scipy (>=1.17.1,<2.0.0)
Description-Content-Type: text/markdown

# drift-lite

A comprehensive, lightweight wrapper for scikit-learn models that detects data drift and target drift in production using advanced statistical tests.

## Why use `drift-lite`?

Deployed machine learning models degrade over time as the real-world data distribution shifts away from the training distribution. `drift-lite` automatically monitors incoming inference requests and alerts you via customizable callbacks if the data distribution shifts significantly.

**Features:**
- Multiple Statistical Metrics (Kolmogorov-Smirnov, Wasserstein Distance, Chi-Square, Population Stability Index)
- Target Drift Detection (Monitors changes in model predictions)
- First-class Pandas DataFrame Support
- Extensible Callback System (e.g., Webhooks, Logging)

## Installation

```bash
pip install drift-lite pandas
```

## Quick Start

```python
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from drift_lite import DriftWrapper, DriftConfig, FeatureConfig, LoggingCallback

# 1. Prepare your training data
df_train = pd.DataFrame(np.random.normal(0, 1, (1000, 2)), columns=["feature_A", "feature_B"])
y_train = np.random.randint(0, 2, 1000)

# 2. Configure the drift monitor
config = DriftConfig(
    window_size=100,
    detect_target_drift=True,
    features={
        "feature_A": FeatureConfig(type="continuous", metric="ks", threshold=0.05),
        "feature_B": FeatureConfig(type="continuous", metric="wasserstein", threshold=0.5)
    }
)

# 3. Wrap your model
base_model = RandomForestClassifier()
model = DriftWrapper(
    base_model, 
    config=config,
    callbacks=[LoggingCallback()]
)

# 4. Fit the model (it automatically saves a baseline of df_train)
model.fit(df_train, y_train)

# 5. Predict in production
# Normal data (No warning)
df_normal = pd.DataFrame(np.random.normal(0, 1, (100, 2)), columns=["feature_A", "feature_B"])
model.predict(df_normal)

# Drifted data (Emits logging warnings and webhooks)
df_drifted = pd.DataFrame(np.random.normal(2, 1.5, (100, 2)), columns=["feature_A", "feature_B"])
model.predict(df_drifted) 
# WARNING: Data drift detected on 'feature_A' using ks (score=0.0001, threshold=0.0500)
# WARNING: Data drift detected on 'model_target' using ks (score=0.0123, threshold=0.0500)
```

## Creating Custom Callbacks

```python
from drift_lite.callbacks import BaseCallback

class SlackAlertCallback(BaseCallback):
    def on_drift_detected(self, feature_name, score, metric_name, threshold):
        # Ping slack webhook here
        print(f"Alerting slack: {feature_name} has drifted!")
```

