Skip to content

Aid Class

Automatic Identification of Demand patterns.

Usage

from polars_statistics import Aid

classifier = Aid(
    intermittent_threshold: float = 0.3,  # Zero proportion threshold
    ic: str = "aicc",                     # "aic", "aicc", "bic"
)

result = classifier.classify(y)  # y: 1D numpy array

AidResult Properties

result.demand_type        # str: "regular" or "intermittent"
result.distribution       # str: best-fit distribution name
result.is_fractional      # bool: whether data has fractional values
result.mean               # float: estimated mean
result.variance           # float: estimated variance
result.zero_proportion    # float: proportion of zeros
result.n_observations     # int: number of observations
result.anomalies          # list[str]: per-observation anomaly flags
result.ic_values          # dict: IC values for each candidate distribution

Convenience Methods

result.is_regular()           # bool
result.is_intermittent()      # bool
result.has_stockouts()        # bool
result.is_new_product()       # bool (leading zeros pattern)
result.is_obsolete_product()  # bool (trailing zeros pattern)
result.anomaly_counts()       # dict: counts by anomaly type

Example

import numpy as np
from polars_statistics import Aid

# Simulate intermittent demand
np.random.seed(42)
demand = np.random.poisson(2, 100)
demand[np.random.rand(100) < 0.3] = 0  # 30% zeros

# Classify
classifier = Aid(intermittent_threshold=0.3)
result = classifier.classify(demand)

print(f"Demand type: {result.demand_type}")
print(f"Distribution: {result.distribution}")
print(f"Zero proportion: {result.zero_proportion:.2%}")
print(f"Has stockouts: {result.has_stockouts()}")
print(f"Anomaly counts: {result.anomaly_counts()}")

Supported Distributions

Category Distributions
Count poisson, negative_binomial, geometric
Continuous normal, gamma, lognormal, rectified_normal

See Also