时间序列异常值处理方法

news2024/12/23 3:09:27

文章目录

  • 一、删除法
  • 二、替换法
  • 三、插值法
  • 四、滑动窗口
  • 五、基于模型的替换

时间序列相关参考文章:
时间序列预测算法—ARIMA
时间序列预测算法—Prophet
时间序列分类任务—tsfresh
python时间序列处理
有季节效应的非平稳序列分析
时间序列异常值检测方法
时间序列异常值处理方法

一、删除法

import pandas as pd
from scipy.stats import zscore
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False    # 负号正常显示

data = pd.read_excel('data.xlsx')
data['ZScore'] = zscore(data['电量'])
 
outliers_removed = data[data['ZScore'].abs() <= 3]
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))
 
axes[0].plot(data['date'],data['电量'], color='blue', alpha=0.6)
axes[0].set_title('Original Data')
axes[0].set_xlabel('date')
axes[0].set_ylabel('电量')
axes[0].grid(True)
 
axes[1].plot(outliers_removed['date'],outliers_removed['电量'], color='green', alpha=0.6)
axes[1].set_title('Cleaned Data')
axes[1].set_xlabel('date')
axes[1].set_ylabel('电量')
axes[1].grid(True)
plt.show()

在这里插入图片描述

二、替换法

  替换法中包括均值中位数众数等。下图只展示中位数可视化方法,均值,众数修改计算条件同中位数。

import pandas as pd
from scipy.stats import zscore
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False    # 负号正常显示

# 读取数据
data = pd.read_excel('data.xlsx')

# 计算 Z-score
data['ZScore'] = zscore(data['电量'])

# 设置阈值来识别异常值,Z-score 大于 3 的被认为是异常值
threshold = 3

# 计算中位数
median_value = data['电量'].median()  #26659.4476
#mean_value = data['电量'].mean()  #26533.86 均值

# 将异常值替换为中位数,生成新的数据集
cleaned_data = data.copy()  # 创建数据的副本
cleaned_data['电量'] = cleaned_data.apply(
    lambda row: median_value if abs(row['ZScore']) > threshold else row['电量'], axis=1
)

# 重新计算 Z-score 以确认替换后的数据
cleaned_data['ZScore'] = zscore(cleaned_data['电量'])

# 绘图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))

# 原始数据图
axes[0].plot(data['date'], data['电量'], color='blue', alpha=0.7)
axes[0].set_title('Original Data with Outliers')
axes[0].set_xlabel('Date')
axes[0].set_ylabel('电量')
axes[0].grid(True)

# 清理后的数据图
axes[1].plot(cleaned_data['date'], cleaned_data['电量'], color='green', alpha=0.7)
axes[1].set_title('Cleaned Data (Outliers Replaced)')
axes[1].set_xlabel('Date')
axes[1].set_ylabel('电量')
axes[1].grid(True)
plt.show()

在这里插入图片描述

三、插值法

  线性插值:使用邻近的正常值进行插值。通常适用于时间序列数据,替换方法就是在异常值前后点之间进行线性插值。方法:value = (time_series[i-1] + time_series[i+1]) / 2 或者使用更复杂的插值函数。
  多项式插值:适用于时间序列变化呈非线性趋势时,可以使用低次多项式进行插值。
  前向/后向填充:对于短期的突发异常,可以选择用前一个或后一个正常值来填充,特别是对于电力、金融等行业的数据。方法:value = previous_value 或 value = next_value

  • 线性插值
import pandas as pd
from scipy.stats import zscore
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False    # 负号正常显示

data = pd.read_excel('data.xlsx')
data['ZScore'] = zscore(data['电量']) # 计算 Z-score

threshold = 3 # 设置阈值来识别异常值,Z-score 大于 3 的被认为是异常值
outliers = abs(data['ZScore']) > threshold # 标记异常值位置

replaced_data = data.copy()
# 将异常值标记为 NaN(缺失值),以便进行插值
replaced_data['电量'] = replaced_data['电量'].where(~outliers, other=None)
replaced_data['电量'] = replaced_data['电量'].interpolate(method='linear') # 使用线性插值替换异常值

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))
# 原始数据图
axes[0].plot(data['date'], data['电量'], color='blue', alpha=0.7)
axes[0].set_title('Original Data with Outliers')
axes[0].set_xlabel('Date')
axes[0].set_ylabel('电量')
axes[0].grid(True)
# 清理后的数据图
axes[1].plot(replaced_data['date'], replaced_data['电量'], color='green', alpha=0.7)
axes[1].set_title('Cleaned Data (Outliers Replaced with Linear Interpolation)')
axes[1].set_xlabel('Date')
axes[1].set_ylabel('电量')
axes[1].grid(True)
plt.show()

在这里插入图片描述

  • 前后项填充
import pandas as pd
from scipy.stats import zscore
import matplotlib.pyplot as plt
# 设置中文显示和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False    # 负号正常显示

data = pd.read_excel('data.xlsx')
data['ZScore'] = zscore(data['电量']) # 计算 Z-score

threshold = 3 # 设置阈值来识别异常值,Z-score 大于 3 的被认为是异常值
outliers = abs(data['ZScore']) > threshold # 标记异常值位置

replaced_data = data.copy()
replaced_data['电量'] = replaced_data['电量'].where(~outliers, other=None) # 将异常值标记为 NaN(缺失值)

# 使用前向填充法(前后值插值)
# replaced_data['电量'] = replaced_data['电量'].ffill() # 前向填充
replaced_data['电量'] = replaced_data['电量'].bfill()  # 后向填充(若前向无值)

fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))
# 原始数据图
axes[0].plot(data['date'], data['电量'], color='blue', alpha=0.7)
axes[0].set_title('Original Data with Outliers')
axes[0].set_xlabel('Date')
axes[0].set_ylabel('电量')
axes[0].grid(True)

# 清理后的数据图
axes[1].plot(replaced_data['date'], replaced_data['电量'], color='green', alpha=0.7)
axes[1].set_title('Cleaned Data (Outliers Replaced with Forward/Backward Fill)')
axes[1].set_xlabel('Date')
axes[1].set_ylabel('电量')
axes[1].grid(True)
plt.show()

在这里插入图片描述

四、滑动窗口

  使用滑动窗口方法计算异常值的周围均值、中值或其他统计量,将异常值替换为滑动窗口内的均值或中值。例如,使用一个固定大小的窗口,在窗口内计算统计量,并用窗口中心的统计值替换异常点。

import pandas as pd
from scipy.stats import zscore
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体
plt.rcParams['axes.unicode_minus'] = False    # 负号正常显示


data = pd.read_excel('data.xlsx')

# 计算 Z-score
data['ZScore'] = zscore(data['电量'])

# 设置阈值来识别异常值,Z-score 大于 3 的被认为是异常值
threshold = 3

# 设置异常值前后的窗口大小
window_size = 3

# # 用附近的平均值替换异常值
# for i in range(window_size, len(data) - window_size):  # 遍历数据,跳过前后 window_size 天
#     # 检查当前点是否是异常值
#     if abs(data['ZScore'][i]) > threshold:
#         # 获取当前点的前后窗口数据,计算窗口内的平均值
#         window_values = data['电量'][i - window_size:i + window_size + 1]
#         mean_value = window_values.mean()
        
#         # 替换异常值为附近的平均值
#         replaced_data.loc[i, '电量'] = mean_value 

# 使用 rolling() 函数计算窗口内的均值 (如:前后 3 天,即 7 天窗口)
rolling_mean = data['电量'].rolling(window=2*window_size + 1, min_periods=1).mean()

# 创建数据副本以保存清理后的数据
replaced_data = data.copy()

# 替换异常值为附近的平均值
for i in range(window_size, len(data) - window_size):  # 遍历数据,跳过前后 window_size 天
    if abs(data['ZScore'][i]) > threshold:  # 如果是异常值
        replaced_data.loc[i, '电量'] = rolling_mean[i]  # 用滚动窗口均值替换异常值


# 重新计算 Z-score 以确认替换后的数据
replaced_data['ZScore'] = zscore(replaced_data['电量'])

# 绘图
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 6))

# 原始数据图
axes[0].plot(data['date'], data['电量'], color='blue', alpha=0.7)
axes[0].set_title('Original Data with Outliers')
axes[0].set_xlabel('Date')
axes[0].set_ylabel('电量')
axes[0].grid(True)

# 替换后的数据图
axes[1].plot(replaced_data['date'], replaced_data['电量'], color='green', alpha=0.7)
axes[1].set_title('Data with Outliers Replaced by Nearby Mean')
axes[1].set_xlabel('Date')
axes[1].set_ylabel('电量')
axes[1].grid(True)

# 显示图表
plt.show()

在这里插入图片描述

五、基于模型的替换

  如果时间序列的数据模式较为复杂,简单的替换方法可能无法较好地处理异常。此时可以使用基于模型的方法来替代异常值:
  ARIMA 模型:使用时间序列建模的方法(如 ARIMA)来预测每个时刻的值,异常值可以通过模型的预测值进行替代。可参考时间序列ARIMA
  LSTM 或其他深度学习方法:对于具有长时间依赖性的序列数据,可以训练 LSTM 等神经网络模型来预测序列值,并用模型预测值替换异常值。
  在某些情况下,数据的异常值与其他特征存在一定的关系,可以使用回归模型(如线性回归、决策树回归)根据其他变量预测异常值的合理范围。
  线性回归法:可以利用时间序列的历史数据和其他相关变量来预测异常值的合理值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2264016.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【报错】node:internal/modules/cjs/loader:936

报错问题&#xff1a; 当执行npm run dev后&#xff0c;出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的&#xff0c;解决此问题的一种方法就是重新安装所需的模块。 解决办法&#xff1a; 删除npm install 所下载在项目里的node_modules文件执行操作&…

故障诊断 | 一个小创新:特征提取+KAN分类

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

javac 编译java文件源码 怎么生成 ast语法树 步骤详解

在 javac 中&#xff0c;编译源代码并生成抽象语法树&#xff08;AST&#xff09;是一个多步骤的过程&#xff0c;涉及从源码解析到最终生成字节码。以下是详细步骤&#xff0c;描述了如何使用 javac 编译源码并生成 AST。 1. 准备源文件 javac 首先需要源文件。这些源文件是…

人工智能入门是先看西瓜书还是先看花书?

在人工智能入门时&#xff0c;关于先看《机器学习》&#xff08;西瓜书&#xff09;还是先看《深度学习》&#xff08;花书&#xff09;的问题&#xff0c;实际上取决于个人的学习目标和背景。 《机器学习》&#xff08;西瓜书&#xff09;由周志华教授撰写&#xff0c;是一本…

Linux 安装Nginx 并配置启动 (已实测)

文章目录 一、安装Nginx二、配置 Nginx 为系统服务 一、安装Nginx 安装依赖&#xff0c;确保Nginx编译和运行正常&#xff0c;打开终端执行以下命令 yum install -y wget gcc-c pcre-devel zlib-devel openssl-devel下载Nginx # 例如&#xff0c;下载Nginx 1.24.0版本 wget …

Linux 下的 GPT 和 MBR 分区表详解

文章目录 Linux 下的 GPT 和 MBR 分区表详解一、分区表的作用二、MBR&#xff08;Master Boot Record&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 三、GPT&#xff08;GUID Partition Table&#xff09;1. **特点**2. **优点**3. **缺点**4. **适用场景** 四…

10. 虚拟机VMware Workstation Pro下共享Ubuntu和Win11文件夹

本文记录当前最新版虚拟机VMware Workstation Pro&#xff08;2024.12&#xff09;如何在win11下共享文件&#xff0c;以实现Windows与Ubuntu互传文件的目的。 1. 创建共享文件夹 1.1 先关闭虚拟机的客户机&#xff0c;打开虚拟机设置 1.2 在虚拟机设置界面找到“选项”->“…

有哪些免费的 ERP 软件可供选择?哪些 ERP 软件使用体验较好?

想找个 “免费” 的 ERP 软件&#xff1f; 咱得知道&#xff0c;ERP 那可是涉及财务、人力、供应链、采购、销售等好多方面的重要企业软件。功能这么全&#xff0c;能免费才怪呢&#xff01;真要是有免费的&#xff0c;早就火遍大江南北&#xff0c;说不定把市场都垄断了&…

2024 年的科技趋势

2024 年在科技领域有着诸多重大进展与突破。从人工智能、量子计算到基因组医学、可再生能源以及新兴技术重塑了众多行业。随着元宇宙等趋势的兴起以及太空探索取得的进步&#xff0c;未来在接下来的岁月里有望继续取得进展与突破。让我们来探讨一下定义 2024 年的一些关键趋势&…

python rabbitmq实现简单/持久/广播/组播/topic/rpc消息异步发送可配置Django

windows首先安装rabbitmq 点击参考安装 1、环境介绍 Python 3.10.16 其他通过pip安装的版本(Django、pika、celery这几个必须要有最好版本一致) amqp 5.3.1 asgiref 3.8.1 async-timeout 5.0.1 billiard 4.2.1 celery 5.4.0 …

厦门凯酷全科技有限公司短视频带货可靠吗?

在当今这个数字化时代&#xff0c;抖音作为短视频和直播带货的领军平台&#xff0c;已经吸引了无数商家的目光。而在这一片繁荣的电商蓝海中&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&#xff09;凭借其专业的团队、丰富的经验和创新的服务模式&#…

从源码分析swift GCD_DispatchGroup

前言&#xff1a; 最近在写需求的时候用到了DispatchGroup&#xff0c;一直没有深入去学习&#xff0c;既然遇到了那么就总结下吧。。。。 基本介绍&#xff1a; 任务组&#xff08;DispatchGroup&#xff09; DispatchGroup 可以将多个任务组合在一起并且监听它们的完成状态。…

在C#中使用资源保存图像和文本和其他数据并在运行时加载

资源是您可以构建到应用程序中的图像、字符串、文本文件和其他数据。您的程序可以在运行时加载资源以显示新图片、文本或其他内容。 要将资源添加到项目&#xff0c;请打开“项目”菜单并选择最底部的“属性”命令。在“属性”页面上&#xff0c;单击“资源”选项卡。现在&…

基于MATLAB的图像增强

目录 一、背景及意义介绍背景图像采集过程中的局限性 意义 二、概述三、代码结构及说明&#xff08;一&#xff09;整体结构&#xff08;二&#xff09;亮度增强部分&#xff08;三&#xff09;对比度增强部分&#xff08;四&#xff09;锐度增强部分 四、复现步骤&#xff08;…

电脑丢失dll文件一键修复的多种方法分析,电脑故障修复攻略

电脑在使用过程中&#xff0c;有时会遇到DLL文件丢失的情况&#xff0c;这可能导致软件无法正常运行或系统出现故障。当面对这种状况时&#xff0c;不必过于慌张&#xff0c;因为有多种有效的修复方法可供选择。下面我们一起来看看电脑丢失dll文件的多种解决方法。 一.了解什么…

android EditText密码自动填充适配

android上的密码&#xff08;其实不仅仅是密码&#xff0c;可以是用户名也可以是邮箱&#xff09;自动填充&#xff0c;是需要考虑适配的。 官方文档&#xff1a;https://developer.android.com/identity/autofill/autofill-optimize?hlzh-cn 什么是自动填充 手机厂商一般会…

GO--堆(have TODO)

堆 堆&#xff08;Heap&#xff09;是一种特殊的数据结构。它是一棵完全二叉树&#xff08;完全二叉树是指除了最后一层外&#xff0c;每一层上的节点数都是满的&#xff0c;并且最后一层的节点都集中在左边&#xff09;&#xff0c;结放在数组&#xff08;切片&#xff09;中…

Yolov11学习笔记

YOLOv11学习笔记 1.conda环境变量配置 1.1pycharm中新建conda虚拟环境 在win11系统中&#xff0c;创建的conda虚拟环境不会在conda的安装目录下&#xff0c; 而是会在C:\Users\Admin.conda\envs 比如我的anaconda安装目录在F:\anaconda3 但是生成的虚拟环境在C:\Users\Adm…

算法 计算大的长方形容器中,存放一排小长形容器,计算出小长形容器中最后一个元素的x坐标的位置的实现方法

1、先上个图&#xff1a; 2、说明 1&#xff09;中间的蓝色长方形是里面的橙色长方形的容器&#xff0c;比如第一个图中width2width3&#xff0c;因为只有一个&#xff0c;第二个图中有二个小的长方形&#xff0c;也就是说width22width3&#xff0c;第三个图中有3个小长方形&a…

不同版本的 Redis 的键值对内存占用情况示例

不同版本的 Redis 的键值对内存占用情况示例 文章目录 不同版本的 Redis 的键值对内存占用情况示例Redis 6.0redisObjectdictEntrysds&#x1f340; 数据结构&#x1f340; sdslen() 函数&#x1f340; sdsReqType() 函数&#x1f340; sdsHdrSize() 函数 内存分配 - malloc() …