---
name: bi-adaptive-threshold
description: 通过量化历史数据的自然波动幅度，自适应计算判定阈值。当需要从数据本身确定阈值（如波动阈值、影响度阈值等）、而非使用固定值时调用。仅适用于日/周粒度阈值确定。
---
# bi-adaptive-threshold

基于标准差衡量数据的自然波动幅度，从数值序列中自适应计算阈值，常见场景：

- **异常检测**：确定指标波动率的异常阈值
- **影响度判定**：确定事件影响度的显著性阈值
- **其他需要从数据分布中推导合理边界的场景**

> **适用范围**：仅适用于日粒度和周粒度的阈值计算。

## 执行步骤

### 1：数据准备

包含时间序列数据的 CSV 文件，至少包含以下两列：

| 列     | 说明                       | 示例       |
| ------ | -------------------------- | ---------- |
| 日期列 | 时间标识                   | 日期       |
| 数值列 | 需要计算阈值的目标数值序列 | 访问用户数 |

示例：

```csv
日期,访问用户数
2025-01-01,10000
2025-01-02,10500
2025-01-03,9800
```

若上游步骤已产出可用数据文件则直接使用，否则自行取数。默认取近 90 天数据，若可用数据不足 90 天则取全部。

### 2：执行阈值计算

按以下优先级选择计算方式，命中即停：

#### 方式一：使用脚本

路径： `scripts/adaptive_threshold.py`

原理：

1. 检查数据量是否充足（即：数据行数 < `最少数据行数`），不足则直接返回 `默认阈值`
2. 计算变化率序列，用 IQR 围栏法（四分位距 × `IQR 倍数`）剔除极端异常值
3. 通过 ruptures 库检测结构性变化点，将数据划分为若干分段
4. 取最后一段平稳区间：
   * 若最后一段不足 `最少数据行数`，说明稳定数据不够，可能处于业务初期，返回 `默认阈值`；
   * 计算该段数据标准差，若标准差 ≥ `阈值上限`，说明当前仍处于剧烈波动期，返回 `默认阈值`
5. 最终阈值 = 标准差 × `标准差倍数`，并限制在 [`阈值下限`, `阈值上限`] 范围内，避免阈值过于敏感或过于迟钝

若脚本**适用**于当前场景，按以下方式调用：

**参数**：

| 参数                | 说明                                              | 默认值              |
| ------------------- | ------------------------------------------------- | ------------------- |
| --input-file        | 输入数据文件路径                                  | （必填）            |
| --date-col          | 日期列名                                          | （必填）            |
| --metric-col        | 数值列名                                          | （必填）            |
| --default-threshold | 默认阈值，按指标类型区分，详见下方说明            | （必填）            |
| --min-periods       | 最少数据行数                                      | 30                  |
| --iqr-multiplier    | IQR 倍数                                          | 1.5                 |
| --std-multiplier    | 标准差倍数                                        | 3.0                 |
| --threshold-min     | 阈值下限                                          | 0.05                |
| --threshold-max     | 阈值上限                                          | 0.20                |
| --ruptures-method   | ruptures 库的变化点检测算法（pelt/binseg/window） | pelt                |
| --ruptures-penalty  | ruptures 库的变化点检测的惩罚系数，值越大分段越少 | None (自动计算)     |

> `--default-threshold` 是数据不足或波动剧烈时的兜底值，调用时应根据指标类型传入不同的值：
>
> - **量值指标**：默认 10%（即 `--default-threshold 0.10`）
> - **率值指标**：根据率值所在区间差异化设置：
>   - 率值在 [40%, 60%]：±5%（即 `--default-threshold 0.05`）
>   - 率值在 [20%, 40%) 或 (60%, 80%]：±3%（即 `--default-threshold 0.03`）
>   - 率值在 [0%, 20%) 或 (80%, 100%]：±2%（即 `--default-threshold 0.02`）

**调用示例**：

```bash
python scripts/adaptive_threshold.py \
  --input-file data.csv \
  --date-col "日期" \
  --metric-col "访问用户数"
```

**输出格式**：

```
# 正常
threshold: 0.14

# 数据不足
threshold: 0.10 (数据不足，使用默认阈值)

# 波动剧烈
threshold: 0.10 (波动剧烈，使用默认阈值)
```

#### 方式二：自行实现

若脚本不适用于当前场景（如数据结构不匹配、场景特殊、用户有自定义需求等），基于上述核心思想自行实现阈值计算。
