点击上方卡片关注我
设置星标 学习更多技能
在物联网、金融交易、系统监控等领域,时间序列数据的异常检测至关重要。ADTK是Arundo Analytics开源的Python时间序列异常检测库,专注于无监督异常检测场景。该库提供了丰富的检测算法,包括阈值检测、季节性分解、变化点检测等,支持规则组合和管道式处理。与传统机器学习方法相比,ADTK更注重可解释性和易用性,让工程师无需深厚的统计学背景就能快速部署异常检测系统,及时发现数据中的突变、漂移和异常模式。
使用pip安装ADTK库:
pip install adtk运行以下代码验证安装:
import adtkfrom adtk.data import validate_seriesprint(adtk.__version__)如果能正常输出版本号,说明安装成功。
阈值检测是最直观的异常识别方法,当数值超出预设范围时标记为异常。下面的代码展示如何使用ThresholdAD检测器,设置上下边界值来识别异常点。
from adtk.detector import ThresholdADfrom adtk.data import validate_seriesimport pandas as pd# 创建示例时间序列数据s = pd.Series([1, 2, 3, 100, 2, 3, 2, -50, 3], index=pd.date_range('2023-01-01', periods=9, freq='D'))s = validate_series(s)# 设置阈值检测器threshold_detector = ThresholdAD(high=10, low=0)anomalies = threshold_detector.detect(s)print("检测到的异常点:")print(anomalies[anomalies == True])许多时间序列数据具有周期性模式,如日访问量、月销售额等。季节性ESD检测器通过分解趋势和季节性成分,识别残差中的异常点。下面的代码演示如何使用SeasonalAD检测器,它会自动学习数据的周期模式,然后标记出偏离正常季节性波动的异常值。
from adtk.detector import SeasonalAD# 创建具有季节性的数据dates = pd.date_range('2023-01-01', periods=100, freq='D')values = [10 + 5*np.sin(2*np.pi*i/7) for i in range(100)]values[50] = 50# 插入异常点s = pd.Series(values, index=dates)s = validate_series(s)# 季节性异常检测seasonal_detector = SeasonalAD(c=3.0, side='both')anomalies = seasonal_detector.detect(s)print(f"检测到 {anomalies.sum()} 个异常点")变化点检测用于识别时间序列中统计特性发生显著变化的时刻,如均值突变、方差改变等。下面的代码使用PersistAD检测器,它能够发现数据分布的持续性变化。
from adtk.detector import PersistAD# 创建有变化点的数据s = pd.Series( [1]*20 + [2]*20 + [1.5]*20, index=pd.date_range('2023-01-01', periods=60, freq='H'))s = validate_series(s)# 检测持续性变化persist_detector = PersistAD(c=3.0, side='positive')anomalies = persist_detector.detect(s)print("变化点位置:")print(s[anomalies])ADTK支持将数据转换和异常检测串联成管道,实现端到端的自动化处理。下面的代码展示如何构建一个检测管道,先对原始数据进行滚动平均平滑处理,然后应用四分位数异常检测器。Pipeline的设计让我们能够复用预处理逻辑,确保训练和预测阶段使用相同的数据处理流程,这在生产环境部署时特别重要。
from adtk.pipe import Pipelinefrom adtk.transformer import RollingAggregatefrom adtk.detector import InterQuartileRangeAD# 构建检测管道pipe = Pipeline([ ("rolling_mean", RollingAggregate(agg='mean', window=5)), ("iqr_detector", InterQuartileRangeAD(c=1.5))])# 执行管道s = pd.Series(np.random.randn(100), index=pd.date_range('2023-01-01', periods=100, freq='D'))s.iloc[50] = 10# 添加异常点s = validate_series(s)anomalies = pipe.fit_detect(s)print(f"管道检测到 {anomalies.sum()} 个异常")实际场景中,单一检测器可能无法覆盖所有异常类型。ADTK允许通过逻辑运算符组合多个检测器的结果。下面的示例展示如何同时使用阈值检测和统计检测,通过OR运算符合并结果,只要任一检测器报警就标记为异常。也可以使用AND运算符要求多个检测器同时触发,降低误报率。
from adtk.detector import ThresholdAD, QuantileADfrom adtk.aggregator import OrAggregator# 创建多个检测器threshold_ad = ThresholdAD(high=5, low=-5)quantile_ad = QuantileAD(high=0.99, low=0.01)# 组合检测器combined_detector = OrAggregator([ ("threshold", threshold_ad), ("quantile", quantile_ad)])s = pd.Series(np.random.randn(100), index=pd.date_range('2023-01-01', periods=100, freq='D'))s.iloc[[30, 70]] = [10, -10]s = validate_series(s)anomalies = combined_detector.detect(s)print(f"组合检测器发现 {anomalies.sum()} 个异常")ADTK提供了便捷的可视化方法,帮助分析异常检测结果。下面的代码展示如何使用plot函数同时绘制原始序列和异常点标记,异常点会以红色高亮显示。通过可视化可以快速验证检测器的效果,判断是否存在误报或漏报。
from adtk.visualization import plot# 执行检测detector = InterQuartileRangeAD(c=1.5)s = pd.Series(np.random.randn(200), index=pd.date_range('2023-01-01', periods=200, freq='H'))s.iloc[[50, 100, 150]] = [5, -5, 6]s = validate_series(s)anomalies = detector.fit_detect(s)# 可视化结果plot(s, anomaly=anomalies, ts_linewidth=1, ts_markersize=3, anomaly_color='red', anomaly_tag="marker", anomaly_markersize=5)# 导出异常详情anomaly_details = s[anomalies]print("异常点详情:")print(anomaly_details)ADTK是一个专注于时间序列异常检测的实用工具库,通过提供多样化的无监督检测算法和灵活的组合机制,让异常检测系统的构建变得简单高效。其管道式设计和Pandas兼容性使其能够无缝集成到现有的数据处理流程中。从简单的阈值判断到复杂的季节性分解,ADTK涵盖了大多数实际场景的需求。可视化功能和可解释性设计让算法输出易于理解和调试,这在生产环境中尤为重要。
如果在编程工具充值使用上遇到麻烦,推荐一个牛逼的中转工具!一次性搞定 Codex 、Claude Code和 gemini,内容介绍和付费兑换详见文末阅读原文。
📘 我们整理了一份《AI 编程出海蓝皮书》,汇集了过去几个月团队在出海实战中沉淀下来的核心经验。内容持续更新ing
从需求、工具、部署、收款,到 SEO、推广、引流,一步步带你搞懂普通人也能启动的出海路径。这份资料能帮你快速入门、少踩坑。
扫码或微信搜索 257735添加微信,回复【出海资料】即可免费领取。

网站SEO必备工具:Google Search Console 使用教程