[英]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}')
請記住:
這個解是近似的。
您應該找到插入到savgol_filter()
function 的window_length
和polyorder
參數的最佳參數。
如果您的最大值所在的區域嘈雜,您可以使用max_value = y_denoised [max_index][0]
而不是max_value = y_real[max_index][0]
。
注意:此解決方案基於此其他 Stack Overflow答案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.