6种时序异常检测思路总结!

↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

 Datawhale干货 

内容:异常检测,来源:Coggle数据科学

时序异常检测并不困难,如果你找对方法则可以在今年KDD比赛中获取比较好的成绩。本文将使用tsod库完成简单的异常检测。

tsod介绍

tsod可以完成时序数据的异常检测,是一个比较新的库,但使用起来非常方便。

https://github.com/DHI/tsod

https://github.com/DHI/tsod/blob/main/notebooks/Getting%20started.ipynb

区间异常检测

如果我们能提前确定好指标的范围,则可以依次进行判定异常。

# 最小值与最大值
rd = tsod.RangeDetector(min_value=0.01, max_value=2.0)

res = rd.detect(series)
series[res]

将识别结果进行展示:

常数波动检测

cd = tsod.ConstantValueDetector()

res = cd.detect(series)
series[res]

将识别结果进行展示:

范围+常数组合检测

combined = tsod.CombinedDetector([tsod.RangeDetector(max_value=2.0),
                                     tsod.ConstantValueDetector()])

res = combined.detect(series)
series[res]

将识别结果进行展示:

梯度固定检测

cgd = tsod.ConstantGradientDetector()
res = cgd.detect(series)

将识别结果进行展示:

滚动聚合加方差检测

rsd = tsod.RollingStandardDeviationDetector(window_size=10, center=True)

rsd.fit(normal_data)

将识别结果进行展示:

一阶差分检测

drd = tsod.DiffDetector()
drd.fit(normal_data)

将识别结果进行展示:

交流群

 KDD 顶会赛事交流群

  • 特邀分享:郑冠杰,上海交通大学助理教授,美国宾州州立大学博士

  • 内容:KDD Cup 赛题3背景知识及解析

  • 时间:本周六晚 20:00 - 20:30

  • 公众号后台回复 “kdd” 可邀请进群

整理不易,三连

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,需要使用pandas库读入时序数据。之后,可以使用scipy库中的seasonal_decompose函数对时序数据进行分解,得到趋势、季节性和残差等三部分。对残差部分进行统计分析,如均值、标准差、峰度等,并与预定的阈值进行比较。如果发现异常,则可以使用pyculiarity库中的detect_ts函数进行时间序列异常检测,得到异常种类和异常所属时间点。 ``` import pandas as pd from scipy.stats import variation from scipy.stats import skew from scipy.stats import kurtosis from statsmodels.tsa.seasonal import seasonal_decompose from pyculiarity import detect_ts #读入时序数据 data = pd.read_csv("data.csv") #时序数据分解 result = seasonal_decompose(data, model='multiplicative') residual = result.resid #统计分析残差部分 mean = residual.mean() std = residual.std() var = variation(residual) skewness = skew(residual) kurt = kurtosis(residual) #阈值设置 mean_threshold = 0.1 std_threshold = 0.1 var_threshold = 0.1 skewness_threshold = 0.1 kurt_threshold = 0.1 #判断是否存在异常 if abs(mean) > mean_threshold or abs(std) > std_threshold or abs(var) > var_threshold or abs(skewness) > skewness_threshold or abs(kurt) > kurt_threshold: #时间序列异常检测 result = detect_ts(residual) print("异常种类: ",result['anomaly_type']) print("异常所属时间点: ",result['anomaly_points']) else: print("无异常") ``` ### 回答2: 为了判断时序数据是否发生频率变化异常,可以编写一个Python程序。主要的思路是计算时间序列数据中每个时间点的间隔,并将这些间隔与一个预设的阈值进行比较,如果某个间隔大于阈值,则可以判定该时间点存在异常。 以下是示例代码: ```python import numpy as np def detect_frequency_anomaly(time_series, threshold): # 初始化异常类别和时间点列表 anomaly_types = [] anomaly_time_points = [] # 计算时间序列数据的间隔 intervals = np.diff(time_series) # 判断每个间隔是否超过阈值 for i in range(len(intervals)): if intervals[i] > threshold: # 添加异常类别和相应时间点 anomaly_types.append("频率变化异常") anomaly_time_points.append(i+1) # 注意这里加1是因为索引从0开始 # 返回异常类别和异常时间点 return anomaly_types, anomaly_time_points ``` 在这个示例代码中,`time_series`是输入的时间序列数据,`threshold`是预设的阈值。函数将返回两个列表,`anomaly_types`存储异常类别,`anomaly_time_points`存储异常所属时间点。 你可以根据实际情况使用这个函数来判断时序数据中是否存在频率变化异常。 ### 回答3: 要编写一个Python程序来判断时序数据是否发生频率变化异常,并返回异常种类和异常所属时间点,可以按照以下步骤进行: 1. 首先,将时序数据加载到程序中。可以使用Python的pandas库来读取时序数据文件,例如使用`pd.read_csv()`函数。 2. 接下来,计算每个时间点之间的时间间隔。可以使用pandas的`diff()`函数,将时间序列数据转换为时间间隔序列。 3. 接着,计算时间间隔的均值和标准差。可以使用pandas的`mean()`和`std()`函数。 4. 计算时间间隔序列中每个时间间隔的偏差。偏差可以通过将每个时间间隔减去均值,并除以标准差来计算。 5. 根据计算得到的偏差序列,定义一个阈值,用于判断是否发生异常。如果某个时间点的偏差超过阈值,则判断为频率变化异常。 6. 最后,将异常种类和异常所属时间点返回。可以将异常种类定义为超过阈值的上界或下界,异常所属时间点即为该时间点对应的原始时序数据的时间点。 下面是一个简单的示例代码: ```python import pandas as pd def detect_frequency_anomaly(time_series_data, threshold): # 计算时间间隔序列 time_intervals = time_series_data.diff() # 计算时间间隔的均值和标准差 mean_interval = time_intervals.mean() std_interval = time_intervals.std() # 计算时间间隔的偏差 deviations = (time_intervals - mean_interval) / std_interval # 判断是否发生异常 anomalies = deviations.abs() > threshold # 提取异常种类和异常所属时间点 anomaly_indexes = anomalies[anomalies].index anomaly_types = anomalies[anomalies].apply(lambda x: '上界' if x else '下界') return zip(anomaly_types, anomaly_indexes) # 读取时序数据文件 time_series_data = pd.read_csv('data.csv') # 设定阈值 threshold = 2.0 # 判断频率变化异常,并返回结果 results = detect_frequency_anomaly(time_series_data, threshold) # 输出异常种类和异常所属时间点 for anomaly_type, anomaly_index in results: print(f'异常种类:{anomaly_type},异常所属时间点:{anomaly_index}') ``` 请注意,这只是一个简单的示例代码,并且假设时序数据已经被加载到名为`data.csv`的文件中。在实际应用中,你可能需要根据具体的数据类型和分析需求来进行相应的修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值