基于Python的时间序列异常值检测

这篇具有很好参考价值的文章主要介绍了基于Python的时间序列异常值检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于Python的时间序列异常值检测 

今天我们介绍一下使用python做时间序列数据分析和预测中异常值检测的方法,常用的异常值检测方法有以下几种:

  • 3sigma: 基于正太分布,当数据值超过±3个标准差(3sigma)时为异常值。
  • z-score : z标准分数,它测量数据值到平均值的距离,当数据与平均值相差2个标准差时z-score为2,如果将z-score为3作为异常值判断标准时,便相当于3sigma。
  • 箱体法(box): 它基于数据的四分位值来判断异常值。
  • 多维度异常值判断法,通过数据特征的多个维度综合判断数据是否为异常值。

注:3sigma,z-score,箱体法(box)都是从数据值本身的单一维度去分析和判断异常值,从而有一定的局限性, 然而多维度异常值判断法更注重从数据特征的各个维度去分析和判断异常值,显然多维度异常值判断法更为科学和精准。

导入时间序列数据

我们的数据来自于某商业零售门店的每日客流量数据,客流量数据直接关系到门店销售业绩,所以有必要对客流量数据进行分析。

基于Python的时间序列异常值检测

数据中的 y 列代表了客流量,这里数据的时间范围为2020.1至2023.1 ,接下来我们查看数据的趋势图。

plt.figure(figsize=(10,4),dpi=100)
plt.plot(df)
plt.title("客流量趋势")
plt.show()

 基于Python的时间序列异常值检测

 下面我们查看客流量数据的热力图分布:

calplot.calplot(df.y,suptitle='客流量分布',cmap='YlGn');

基于Python的时间序列异常值检测

 从热力图的颜色深浅变化,我们也能发现客流量逐年在减少,这可能和疫情持续有关。

3sigma

依据正太分布异常值分布在3个标准差以外的位置,如下图所示:

基于Python的时间序列异常值检测

下面我们来计算数据的±3个标准以外的位置,落在这两个位置内的数据点即为异常值:

# 3sigma
def three_sigma(df):
    mean=df.y.mean()
    std=df.y.std()
    upper_limit=mean+3*std
    lower_limit=mean-3*std
    df['anomaly']=df.y.apply(lambda x: 1 if (x>upper_limit )
                              or (x<lower_limit) else 0)
    return df
df1 = three_sigma(df.copy())
df1[df1.anomaly==1]

基于Python的时间序列异常值检测

fig, ax = plt.subplots(figsize=(10,4))
a = df1.loc[df1['anomaly'] == 1, ['y']] #anomaly
ax.plot(df.index, df['y'], color='blue', label='正常值')
ax.scatter(a.index,a['y'], color='red', label='异常值')
plt.title(f'3sigma')
plt.xlabel('date')
plt.ylabel('y')
plt.legend()
plt.show();

基于Python的时间序列异常值检测

 z-score

z-score测量数据值到平均值的距离,异常值的判断依据为给定的距离阈值,一般情况下阈值可以设置在大于2个标准差的任意位置(依据业务和经验来确定阈值)。如果将z-score为3作为异常值判定的阈值时,便相当于3sigma。

基于Python的时间序列异常值检测

 文章来源地址https://www.toymoban.com/news/detail-423238.html

# Z-Score
def z_score(df,threshold):
    mean=df.y.mean()
    std=df.y.std()
    df['z_score']=df.y.apply(lambda x:abs(x-mean)/std)
    df['anomaly']=df.z_score.apply(lambda x: 1 if x>threshold else 0)
    return df

#设置阈值为2或3,当阈值为3时便相当于3sigma
threshold=2
df2 = z_score(df.copy(),threshold)
df2[df2.anomaly==1]

基于Python的时间序列异常值检测

fig, ax = plt.subplots(figsize=(10,4))
a = df2.loc[df2['anomaly'] == 1, ['y']] 
ax.plot(df.index, df['y'], color='blue', label='正常值')
ax.scatter(a.index,a['y'], color='red', label='异常值')
plt.title(f'Z-score, {threshold=}')
plt.xlabel('date')
plt.ylabel('y')
plt.legend()
plt.show();

箱体法(box)

 箱体法(box)基于数据的四分位值来判断异常值。异常值>Q3+1.5*IQR 或者 异常值<Q1-1.5*IQR

基于Python的时间序列异常值检测

def box_plot(df):
    q1=np.nanpercentile(df.y,25)
    q3=np.nanpercentile(df.y,75)
    iqr=q3-q1
    lower_limit=q1-1.5*iqr
    upper_limit=q3+1.5*iqr
    df['anomaly']=df.y.apply(lambda x: 1 if x<lower_limit or x>upper_limit  
                             else 0)
    return df
df3 = box_plot(df.copy())
df3[df3.anomaly==1]

基于Python的时间序列异常值检测

fig, ax = plt.subplots(figsize=(10,4))
a = df3.loc[df3['anomaly'] == 1, ['y']] 
ax.plot(df.index, df['y'], color='blue', label='正常值')
ax.scatter(a.index,a['y'], color='red', label='异常值')
plt.title(f'Box-plot')
plt.xlabel('date')
plt.ylabel('y')
plt.legend()
plt.show();

基于Python的时间序列异常值检测

 多维度异常检测法PyOD

异常检测算法工具库(PyOD) 可以从数据的多个特征维度来检测异常值,所以我们可以将时间序列数据的日期特征分解成多个和时间相关的其它特征,同时我们还需要设置一个异常值比例,一般情况下我们设置异常值比例在5%以下。这里我们使用的是Pycaret的异常值检测模型,该模型是对PyOD进行了再次包装,使之调用更为简单,感兴趣的朋友可以去查看Pycaret和PyOD的相关文档。这里我们首先将日期字段进行分解,从原始的日期字段中我们可以拆分出年,月,日,星期,季度等和时间相关的特征:

from pycaret.anomaly import AnomalyExperiment
# 分解日期特征
def create_features(df):        
    df['year'] = df.index.year #年 
    df['month'] = df.index.month #月
    df['dayofmonth'] = df.index.day #日
    df['dayofweek'] = df.index.dayofweek #星期
    df['quarter'] = df.index.quarter #季度
    df['weekend'] = df.dayofweek.apply(lambda x: 1 if x > 5 else 0) #是否周末
    df['dayofyear'] = df.index.dayofyear   #年中第几天
    df['weekofyear'] = df.index.weekofyear #年中第几月
    df['is_month_start']=df.index.is_month_start
    df['is_month_end']=df.index.is_month_end
    return df
#创建特征
df4 = create_features(df.copy())
df4

基于Python的时间序列异常值检测

 接下来我们使用Pycaret的anomaly模型对新数据集进行建模和预测,同时我们仍然需要设置一个异常值比例的阈值fraction:

#异常值算法:'knn','cluster','iforest','svm'等。
alg='knn'#异常值算法
fraction=0.02 #异常值比例 0.02,0.03,0.04,0.05
#创建异常值模型
exp = AnomalyExperiment()
r = exp.setup(df4.copy(), session_id = 123,verbose=False)
model = exp.create_model(alg, fraction=fraction,verbose=False)
model_results = exp.assign_model(model,verbose=False)
#获取检测结果
df5 = pd.merge(df.reset_index(),model_results[['Anomaly']],
               left_index=True, right_index=True)
df5.set_index('date',inplace=True)

fig, ax = plt.subplots(figsize=(10,4))
a = df5.loc[df5['Anomaly'] == 1, ['y']] 
ax.plot(df5.index, df5['y'], color='blue', label='正常值')
ax.scatter(a.index,a['y'], color='red', label='异常值')
plt.title(f'Pycaret.anomaly {fraction=}')
plt.xlabel('date')
plt.ylabel('y')
plt.legend()
plt.show();

基于Python的时间序列异常值检测

 基于Python的时间序列异常值检测

 基于Python的时间序列异常值检测

 基于Python的时间序列异常值检测

 这里我们还有多种异常值算法可以选择,有兴趣的朋友可以自己去尝试不同的异常值算法:

基于Python的时间序列异常值检测

 总结

今天我们介绍几种常用的异常值检测方法,其中3sigma,z-score,箱体法(box)都是从数据值本身的单一维度去分析和判断异常值,从而有一定的局限性, 而多维度异常值判断法更注重从数据特征的各个维度去分析和判断异常值,显然多维度异常值判断法更为科学和精准。

参考资料

Pycaret 文档

PyOD文档

 

到了这里,关于基于Python的时间序列异常值检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【阅读论文】USAD:多变量时间序列上的无监督异常检测

    USAD : UnSupervised Anomaly Detection on Multivariate Time Series IT系统的自动监控是Orange目前面临的挑战。考虑到其IT运营所达到的规模和复杂性,随着时间的推移,用于推断正常和异常行为的测量所需的传感器数量急剧增加,使得传统的基于专家的监督方法变得缓慢或容易出错。在本文中

    2024年02月12日
    浏览(45)
  • 融合transformer和对抗学习的多变量时间序列异常检测算法TranAD论文和代码解读...

    今天的文章来自VLDB TranAD: Deep Transformer Networks for Anomaly Detection in Multivariate Time Series Data 论文链接:https://arxiv.org/pdf/2201.07284v6.pdf 代码地址:https://github.com/imperial-qore/TranAD 在文章中提出了对于多变量异常检测的几个有挑战性的问题 缺乏异常的label 大数据量 在现实应用中需要尽

    2023年04月09日
    浏览(88)
  • python:Pettitt突变检测(以NDVI时间序列为例)

    作者:CSDN @ _养乐多_ 本文将介绍标准正态同质性检验(Standard Normal Homogeneity Test,SNHT) 突变点检测代码。以 NDVI 时间序列为例。输入数据可以是csv,一列NDVI值,一列时间。代码可以扩展到遥感时间序列突变检测(突变年份、突变幅度等)中。 结果如下图所示, 一、准备数据

    2024年04月10日
    浏览(48)
  • [开源] 基于GRU的时间序列预测模型python代码

    基于GRU的时间序列预测模型python代码分享给大家,记得点赞哦 更多时间序列预测代码获取: 时间序列预测算法全集合--深度学习

    2024年04月09日
    浏览(37)
  • Python数据分析案例42——基于Attention-BiGRU的时间序列数据预测

    承接上一篇的学术缝合,排列组合模型,本次继续缝合模型演示。 Python数据分析案例41——基于CNN-BiLSTM的沪深300收盘价预测-CSDN博客 虽然我自己基于各种循环神经网络做时间序列的预测已经做烂了.....但是还是会有很多刚读研究生或者是别的领域过来的小白来问这些神经网络

    2024年04月15日
    浏览(37)
  • 风速预测 | Python基于CEEMDAN-CNN-Transformer+ARIMA的风速时间序列预测

    效果一览 基本介绍 CEEMDAN-CNN-Transformer+ARIMA是一种用于风速时间序列预测的模型,结合了不同的技术和算法。收集风速时间序列数据,并确保数据的质量和完整性。这些数据通常包括风速的观测值和时间戳。CEEMDAN分解:使用集合经验模态分解(CEEMDAN)将风速时间序列分解为多

    2024年01月25日
    浏览(36)
  • 时间序列之拐点检测(changepoints detection)算法

    对于时间拐点问题,其实就是找changepoint的问题,业务场景比如机器的缩扩容,业务的升级回滚等,都会让一些指标发生这样的现象, 如下图。(这种场景比较理想,现实情况要复杂得多) 为了检测这个区域,需要使用changepoint detector:ruptures ruptures 是专门用于检测时间序列数

    2024年02月20日
    浏览(44)
  • 金融时间序列分析:Python基于garch模型预测上证指数波动率、计算var和var穿透率、双尾检验

    目录 一、收益率波动效应的分析 1.1  收益率序列平稳性检验 1.2 建立AR(p)模型 1.3 Ljung-Box混成检验残差序列的相关性,判断是否有ARCH效应 1.4 建立ARCH模型  二、GARCH模型与波动率预测 2.1 建立GARCH模型 2.2 波动率预测 三、正态分布的假设下通过波动率计算VaR  四、厚尾分布的假

    2024年02月04日
    浏览(50)
  • 时间序列分析——基于R | 第2章 时间序列的预处理习题代码

    1.1判断该序列是否平稳 1.2样本自相关系数 1.3序列自相关图 2.1绘制时序图,判断平稳性 从时序图中可以看出,该序列存在较明显的季节性,同时也存在一定的趋势性。 2.2计算样本自相关系数 2.3绘制自相关图 从自相关图中可以看出,该序列存在较强的季节性和自相关性,不具

    2023年04月18日
    浏览(221)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包