【问题标题】:Pandas- find max not counting outliersPandas-找到不计算异常值的最大值
【发布时间】:2020-10-27 02:41:04
【问题描述】:

我有一个数据框,其中每一列代表一个地理点,每一行代表一天中的一分钟。每个单元格的值是 CFS 中该点的水流。下面是这些时间流序列之一的图表。

基本上,我需要计算白天每个位置的最大流量的绝对值,在这种情况下是 187 cfs 的驼峰。但是,存在不稳定性,因此 DF.abs().max() 返回 1197 cfs。我需要以某种方式删除计算中的异常值。如您所见,异常值没有模式,但如果您查看图表,没有 2 个连续时间点的流量变化不应超过 x%。我应该提一下,这些点有 15K,所以最快的解决方案就是最好的。

任何人都知道我如何在 python 中完成这项工作,或者至少知道我想要做什么的统计词?谢谢!

【问题讨论】:

  • 这能回答你的问题吗? Detect and exclude outliers in Pandas data frame
  • 不,所有这些答案都依赖于 Z 分数、标准差或 IQR。如果您查看上图,虽然真正的最大值为 187,但存在一个值为 200、另一个值为 150 等的异常值,因此任何灵敏度截止都不起作用。解决方案需要考虑点与其相邻点的关系。
  • 我确信有一些我从未听说过的统计词,一些 scipy 函数会解决它。
  • 你能分享样本数据并手动注释哪些点是异常值吗?我可以在图表上看到远离主线的点组。你认为它是一组异常值吗?
  • OP,如果你仔细看,这是一个非常有趣且有些微妙的问题。本质上,您需要做的是建立一个模型,了解当传感器正常工作时数据的外观,然后使用它以一种或多种方式将点分类为正常或奇怪。 (当您确实将点分类为奇怪时,我的建议是输出一份关于它们的单独报告——您发现奇怪值的时间戳和值,以及有多少。)首先您需要理清如何建模 OK/奇怪的点,然后想想计算。试试关于模型的 stats.stackexchange.com。

标签: python pandas scipy statistics


【解决方案1】:

在我看来,您正在寻找的统计词平滑去噪 数据。

这是我的尝试:

# Importing packages
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter

# Creating a curve with a local maximum to simulate "ideal data"
x = np.arange(start=-1, stop=1, step=0.001)
y_ideal = 10**-(x**2)

# Adding some randomly distributed outliers to simulate "real data"
y_real = y_ideal.copy()
np.random.seed(0)
for i in range(50):
    x_index = np.random.choice(len(x))
    y_real[x_index] = np.random.randint(-3, 5)

# Denoising with Savitzky-Golay (window size = 501, polynomial order = 3)
y_denoised = savgol_filter(y_real, window_length=501, polyorder=3)
# You should optimize these values to fit your needs

# Getting the index of the maximum value from the "denoised data"
max_index = np.where(y_denoised == np.amax(y_denoised))[0]

# Recovering the maximum value and reporting
max_value = y_real[max_index][0]
print(f'The maximum value is around {max_value:.5f}')

请记住:

  1. 这个解决方案是近似的

  2. 您应该找到插入savgol_filter() 函数的window_lengthpolyorder 参数的最佳参数。

  3. 如果你的最大值所在的区域比较嘈杂,你可以用max_value = y_denoised [max_index][0]代替max_value = y_real[max_index][0]

注意:此解决方案基于另一个 Stack Overflow answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多