## 工作流程示意 ```Java 原始序列 ─► 取最近 N 点 ─► 排序 ─► 取第 p% 位置的值 = rolling quantile ↑ │ 每来新点就滑窗◄───────────────────────────┘ ``` ## 什么是 *rolling quantile*(滑动分位数)? | 关键词 | 含义 | |--------|------| | **Quantile(分位数)** | 把一批数据从小到大排序后,处在 *p* 百分位位置的值;常见如中位数(50 th percentile)、P90、P95 等。| | **Rolling / Sliding Window(滑动窗口)** | 只取最近 *N *个观测值,而不是整段历史;窗口每来一条新数据就向前滑动一格。| | **Rolling Quantile(滑动分位数)** | 对“最近 N 个样本”计算分位数,再随着时间滚动不断更新。它给出的**阈值是动态的**,能跟着数据本身的趋势、波动及时调整。| --- ### 为什么要用它? 1. **动态阈值** - 固定阈值容易在高峰期狂报警、低谷期漏报警。 - 用滑动窗口里的 P95/P99 做阈值,可以自动适应当前水平。 2. **对异常更敏感** - 分位数对极端值不敏感(相比均值+σ);把异常点本身踢出阈值计算范围,更容易把下一次异常揪出来。 3. **实现简单、无模型依赖** - 在监控、风控、数据库延迟告警等场景常当“自适应基线”的第一步。 --- ### 示例:pandas 里三行搞定 ```python import pandas as pd # 假设 ts 是按分钟采样的序列 ts = pd.Series([...], index=...) # e.g. CPU 使用率 window = 60 # 60 分钟窗口 p = 0.95 # 95 分位 threshold = ts.rolling(window).quantile(p) alerts = ts > threshold # 动态报警判定 ``` > `rolling().quantile()` 内部会在窗口滑动时重新排序并取分位,所以阈值实时更新。 --- ### 选型&注意事项 | 关注点 | 建议 | |---------|------| | **窗口大小 (N)** | 太小→阈值抖动;太大→跟不上趋势。常用 1–3 倍典型周期(如 1 天 PV 就用最近 1–3 天)。| | **百分位 (p)** | 衡量允许的“正常尖峰”比例。常见 P90~P99;业务对异常容忍度越低,p 设得越低。| | **性能** | 全表重排序 O(N log N)。流式高频数据可用 *t-digest*、Greenwald-Khanna 等**近似分位算法**。| | **节假日/季节性** | 如果节假日行为截然不同,可分场景分别维护 rolling quantile,或先做周期剔除再算。| | **与其他指标配合** | 常把 rolling quantile 当作“基线”阈值,再叠加固定下限、同比/环比等多维规则。| --- ## 小结 - **rolling quantile = 滑动窗口 + 分位数** - 作用:**给数据流提供自适应、抗极值的动态阈值**,在监控告警、异常检测、风控限额等场景非常实用。 - 关键是窗口长度和百分位配置;如遇高频海量数据可用近似算法减轻计算压力。