iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >基于Python的时间序列异常值检测
  • 222
分享到

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

python异常值检测PycaretPyOD 2023-09-10 18:09:08 222人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

  今天我们介绍一下使用python做时间序列数据分析和预测中异常值检测的方法,常用的异常值检测方法有以下几种: 3sigma: 基于正太分布,当数据值超过±3个标准差(3sigma)时为异常值。z-score : z标准分数,它测量数据值

 

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

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

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

导入时间序列数据

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

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

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

 

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

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

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

3sigma

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

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

# 3sigmadef 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

fig, ax = plt.subplots(figsize=(10,4))a = df1.loc[df1['anomaly'] == 1, ['y']] #anomalyax.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();

 z-score

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

 

# Z-Scoredef 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时便相当于3sigmathreshold=2df2 = z_score(df.copy(),threshold)df2[df2.anomaly==1]

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 或者 异常值

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 xupper_limit   else 0)    return dfdf3 = box_plot(df.copy())df3[df3.anomaly==1]

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();

 多维度异常检测法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

 接下来我们使用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();

 

 

 

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

 总结

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

参考资料

Pycaret 文档

PyOD文档

 

来源地址:https://blog.csdn.net/weixin_42608414/article/details/129270747

--结束END--

本文标题: 基于Python的时间序列异常值检测

本文链接: https://www.lsjlt.com/news/402518.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Python的时间序列异常值检测
      今天我们介绍一下使用python做时间序列数据分析和预测中异常值检测的方法,常用的异常值检测方法有以下几种: 3sigma: 基于正太分布,当数据值超过±3个标准差(3sigma)时为异常值。z-score : z标准分数,它测量数据值...
    99+
    2023-09-10
    python 异常值检测 Pycaret PyOD
  • 基于LOF算法的异常值检测
    目录 LOF算法简介Sklearn官网LOF算法应用实例1Sklearn官网LOF算法应用实例2基于LOF算法鸢尾花数据集异常值检测读取数据构造数据可视化,画出可疑异常点LOF算法 LOF算法简介 LOF异常检测算法是一种基...
    99+
    2023-08-30
    算法 数据分析 异常值检测
  • Python基于LightGBM进行时间序列预测
    目录前言特征代码结果前言 当我们考虑时间序列的增强树时,通常会想到 M5 比赛,其中前十名中有很大一部分使用了 LightGBM。但是当在单变量情况下使用增强树时,由于没有大量的外生...
    99+
    2024-04-02
  • Python基于LightGBM进行时间序列预测的示例分析
    这篇文章主要介绍了Python基于LightGBM进行时间序列预测的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言当我们考虑时间序列的增强树时,通常会想到 M5 ...
    99+
    2023-06-29
  • 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比
    时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-BiLSTM、BiLSTM时间序列预测对比效果一览基本描述程序设计参考资料 效果一览...
    99+
    2023-08-30
    PSO-BiLSTM BiLSTM PSO 时间序列预测
  • 学习笔记:基于Transformer的时间序列预测模型
    1 一些准备的说明 为了便于读者理解,笔者将采取一个盾构机掘进参数预测的实际项目进行Transformer模型的说明。此外,该贴更多用于本人的学习记录,适合于对Transformer模型已经有一定了解...
    99+
    2023-09-02
    transformer 深度学习 python
  • PHP 中基于 Elasticsearch 的异常检测与预警系统
    引言:异常检测与预警系统在现代软件开发中起着至关重要的作用。它能够帮助开发人员及时发现和解决潜在的问题,提升系统的稳定性和可靠性。在本文中,我们将介绍如何使用 PHP 结合 Elasticsearch 实现异常检测与预警系统,并提供代码示例...
    99+
    2023-10-21
    PHP elasticsearch 异常检测与预警系统
  • Python数据分析基础之异常值检测和处理方式
    目录1 什么是异常值?2 异常值的检测方法1. 简单统计2. 3∂原则3. 箱型图4. 基于模型检测5. 基于近邻度的离群点检测6. 基于聚类的方法来做异常点检测7. 专门...
    99+
    2024-04-02
  • 基于 PyTorch + LSTM 进行时间序列预测(附完整源码)
    时间序列数据,顾名思义是一种随时间变化的数据类型。 例如,24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络(LSTM)能够捕捉时间序列数据中的模式,因...
    99+
    2023-09-09
    pytorch lstm python
  • GluonTS是用于时间序列预测的工具吗
    是的,GluonTS是一个用于时间序列预测的开源工具包,它基于MXNet框架,提供了一组灵活的模型和算法,可以用于时间序列预测、异常...
    99+
    2024-04-02
  • python使用ARIMA进行时间序列的预测(基础教程)
    时间序列就是以时间为索引的数据,比如下面这种形式 数据链接:https://pan.baidu.com/s/1KHmCbk9ygIeRHn97oeZVMg 提取码:s0k5 python使用ARIMA...
    99+
    2023-09-04
    python
  • Python数据异常值检测和处理的示例分析
    这篇文章主要介绍Python数据异常值检测和处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1 什么是异常值?在机器学习中,异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预...
    99+
    2023-06-29
  • Python之异常值检测和处理方式是什么
    这篇文章主要讲解了“Python之异常值检测和处理方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python之异常值检测和处理方式是什么”吧!1 什么是异常值?在机器学习中,异常检...
    99+
    2023-07-02
  • 基于MongoDB的实时日志分析与异常检测系统搭建经验总结
    随着互联网和移动设备的普及,日志数据的产生量也在不断增加,如何高效地对日志数据进行分析和检测异常成为了一个非常重要的问题。本文将介绍如何基于MongoDB搭建一个实时日志分析和异常检测系统,并分享一些经验总结。一、MongoDB简介Mong...
    99+
    2023-11-03
    MongoDB 异常检测 实时日志分析
  • Python中怎么检验时间序列的平稳性
    Python中怎么检验时间序列的平稳性,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。首先我们还是来简单介绍一下平稳性检验的相关概念。图1. 平稳性序列的相关公式...
    99+
    2023-06-16
  • Python怎么实现LSTM时间序列预测
    本篇内容主要讲解“Python怎么实现LSTM时间序列预测”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么实现LSTM时间序列预测”吧!参考数据:数据一共两列,左边是日期,右边是乘...
    99+
    2023-06-02
  • 组合预测模型 | ARIMA-LSTM时间序列预测(Python)
    组合预测模型 | ARIMA-LSTM时间序列预测(Python) 目录 组合预测模型 | ARIMA-LSTM时间序列预测(Python)预测结果基本介绍程序设计参考资料 预测...
    99+
    2023-08-31
    python lstm 机器学习 ARIMA-LSTM 时间序列预测
  • Python时间序列的实现
    目录1. datetime模块1.1 datetime对象1.2 字符串和datatime的相互转换2. 时间序列基础3. 重采样及频率转换4. 时间序列可视化5. 窗口函数5.1 ...
    99+
    2023-02-28
    Python 时间序列
  • MySQL中怎么实现基于时间序列的数据计算
    在MySQL中实现基于时间序列的数据计算可以通过使用日期和时间函数以及聚合函数来实现。以下是一些常用的时间序列数据计算方法: 计算...
    99+
    2024-04-29
    MySQL
  • Python关于时间序列calendar模块的深入讲解
    大家好,在之前的文章中详细介绍了time和datetime模块的使用。这两个模块更多的是用于处理时间和日期相关的问题。 本文介绍的是第三个模块calendar,则主要是用于解决日历方...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作