簡體   English   中英

Pandas-找到不計算異常值的最大值

[英]Pandas- find max not counting outliers

我有一個 dataframe ,其中每一列代表一個地理點,每一行代表一天中的一分鍾。 每個單元格的值是 CFS 中該點的水流。 下面是這些時間流系列之一的圖表。

基本上,我需要計算白天每個位置的最大流量的絕對值,在這種情況下是 187 cfs 的駝峰。 但是,存在不穩定性,因此 DF.abs().max() 返回 1197 cfs。 我需要以某種方式刪除計算中的異常值。 如您所見,異常值沒有模式,但如果您查看圖表,沒有 2 個連續時間點的流量變化不應超過 x%。 我應該提一下,這些點有 15K,所以最快的解決方案是最好的。

任何人都知道我如何在 python 中實現這一點,或者至少知道我想要做什么的統計詞? 謝謝!

在此處輸入圖像描述

在此處輸入圖像描述

在我看來,您正在尋找的統計詞平滑去噪數據。

這是我的嘗試:

# 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() function 的window_lengthpolyorder參數的最佳參數。

  3. 如果您的最大值所在的區域嘈雜,您可以使用max_value = y_denoised [max_index][0]而不是max_value = y_real[max_index][0]

注意:此解決方案基於此其他 Stack Overflow答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM