如何检测离群值?

时间:2019-07-26 07:26:50

标签: python outliers

我有一个价值河公里的图,该值在图表上应该是平滑的,因为它代表了维克勒的轨迹,并且公里数不能跳跃。 我找到了一个scipy.signal库和find_peaks function 但是我找不到合适的参数。 我读到最好的是prominence,但是找不到我需要的峰。 我也尝试使用距离,但结果也令我不满意

x = df.river_km

# find peaks
#peaks, _ = find_peaks(x, distance = 150)
peaks, properties = find_peaks(x, prominence=1)

我的结果:enter image description here 我所期望的:enter image description here

2 个答案:

答案 0 :(得分:0)

您可以尝试使用prominence值,我尝试这样做,并且通过调整突出值获得不同的结果。我想您的范围太大,因此设置了{{1} }值1会给您带来不好的结果。

  

峰的突出度衡量一个峰从信号周围的基线中突出多少,并定义为峰与其最低轮廓线之间的垂直距离。

prominence

import matplotlib.pyplot as plt from scipy.misc import electrocardiogram from scipy.signal import find_peaks import numpy as np x = np.cumsum(np.random.randn(1000,100)) peaks, _ = find_peaks(x, prominence=1) plt.plot(x) plt.plot(peaks, x[peaks], "x") plt.show() 的值为1 prominence value of 1

prominence的值为10 enter image description here

prominence的值为100 enter image description here

OR

您只需传入prominence的distance参数即可,x-axis

答案 1 :(得分:0)

使用与您相似的模拟数据(峰值高度为100-150个单位),以下操作非常有效:

import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import find_peaks

x = np.array(1400 - 0.002 * np.linspace(0,700_000,700_000))
# add peaks 100 - 150 units high
for i in range(70_000,630_000,70_000):
    x[i] += np.random.rand()*50+100

peaks, _ = find_peaks(x, threshold=100)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()

enter image description here

在这种模拟情况下,默认设置(即find_peaks(x))产生的结果相同。

threshold参数指定曲线上峰的最小雾化度(如果给出两个值,则为最小和最大仰角)。

您可能还想先消除任何nan的可能性:

  

警告   对于包含NaN的数据,此函数可能返回意外结果。   为避免这种情况,应删除或替换NaN。