python - Pandas:如何检测数据框中的峰值点(异常值)?
问题描述
我有一个带有几个速度值的熊猫数据框,这些速度值是连续移动的,但它是一个传感器数据,所以我们经常在某些点中间得到错误,移动平均值似乎也无济于事,所以我可以用什么方法用于从数据中删除这些异常值或峰值点?
例子:
data points = {0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9}
在这个数据中,如果我看到点 4、4、5、6 完全是异常值,那么在我使用 5 分钟窗框的滚动平均值来平滑这些值之前,我仍然得到了这些类型的很多光点,我想删除,任何人都可以建议我任何技术来摆脱这些点。
如果您在这里看到数据如何显示一些我必须删除的异常点?任何想法有什么可能的方法来摆脱这些点?
解决方案
我真的认为使用scipy.stats.zscore()的 z-score是这里的方法。看看这篇文章中的相关问题。在那里,他们专注于在消除潜在异常值之前使用哪种方法。在我看来,您的挑战有点简单,因为从提供的数据来看,无需转换数据即可识别潜在的异常值非常简单。下面是一个执行此操作的代码片段。但请记住,什么看起来像异常值和看起来不像异常值将完全取决于您的数据集。而在去除了一些异常值之后,以前看起来不像异常值的东西,现在突然变得如此了。看一看:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import stats
# your data (as a list)
data = [0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9]
# initial plot
df1 = pd.DataFrame(data = data)
df1.columns = ['data']
df1.plot(style = 'o')
# Function to identify and remove outliers
def outliers(df, level):
# 1. temporary dataframe
df = df1.copy(deep = True)
# 2. Select a level for a Z-score to identify and remove outliers
df_Z = df[(np.abs(stats.zscore(df)) < level).all(axis=1)]
ix_keep = df_Z.index
# 3. Subset the raw dataframe with the indexes you'd like to keep
df_keep = df.loc[ix_keep]
return(df_keep)
原始数据:
测试运行 1:Z 分数 = 4:
如您所见,由于级别设置得太高,没有删除任何数据。
测试运行 2:Z 分数 = 2:
现在我们正在取得进展。两个异常值已被删除,但仍有一些可疑数据。
试运行 3:Z 分数 = 1.2:
这看起来真的很好。剩下的数据现在似乎比以前分布得更均匀了。但现在原始数据点突出显示的数据点开始看起来有点像潜在的异常值。那么该停在哪里呢?这将完全取决于你!
编辑:这是一个简单的复制和粘贴的全部内容:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import stats
# your data (as a list)
data = [0.5,0.5,0.7,0.6,0.5,0.7,0.5,0.4,0.6,4,0.5,0.5,4,5,6,0.4,0.7,0.8,0.9]
# initial plot
df1 = pd.DataFrame(data = data)
df1.columns = ['data']
df1.plot(style = 'o')
# Function to identify and remove outliers
def outliers(df, level):
# 1. temporary dataframe
df = df1.copy(deep = True)
# 2. Select a level for a Z-score to identify and remove outliers
df_Z = df[(np.abs(stats.zscore(df)) < level).all(axis=1)]
ix_keep = df_Z.index
# 3. Subset the raw dataframe with the indexes you'd like to keep
df_keep = df.loc[ix_keep]
return(df_keep)
# remove outliers
level = 1.2
print("df_clean = outliers(df = df1, level = " + str(level)+')')
df_clean = outliers(df = df1, level = level)
# final plot
df_clean.plot(style = 'o')
推荐阅读
- c# - 为我的 Visual Studio 程序连接的数据库在运行程序时不会将数据放入表中
- excel - VBA动态单元格范围调整大小
- reactjs - React 酶测试嵌套组件
- c++ - 除非某些参数发生变化,否则让函数只计算一次语句的最简单方法?
- python - 'Options' 对象没有属性 'set_preference' 错误在 Selenium ChromeDriver 和 Chrome 中通过 Python 使用 ChromeOptions
- python - 如何按条件重新启动循环
- java - 在 Windows 上运行 xperfasm JMH 分析器时出错:xperf:错误:NT 内核记录器:无效标志。(0x3ec)
- nix - nix:覆盖 pybind11 中的 doCheck
- asp.net-mvc - 从 PagedList 中隐藏 Url 参数
- kubernetes - 如何在 kubernetes 中获取 pod 数量(可用或终止)?