異なる標準偏差基準を使用して、2つのパスでパンダシリーズオブジェクトの外れ値チェックを実行しています。ただし、そのために2つのループを使用すると、実行速度が非常に遅くなります。このステップをスピードアップするためのパンダの「トリック」はあるのだろうか。
これが私が使用しているコードです(本当に醜いコードに警告します!):
def find_outlier(point, window, n):
return np.abs(point - nanmean(window)) >= n * nanstd(window)
def despike(self, std1=2, std2=20, block=100, keep=0):
res = self.values.copy()
# First run with std1:
for k, point in enumerate(res):
if k <= block:
window = res[k:k + block]
elif k >= len(res) - block:
window = res[k - block:k]
else:
window = res[k - block:k + block]
window = window[~np.isnan(window)]
if np.abs(point - window.mean()) >= std1 * window.std():
res[k] = np.NaN
# Second run with std2:
for k, point in enumerate(res):
if k <= block:
window = res[k:k + block]
elif k >= len(res) - block:
window = res[k - block:k]
else:
window = res[k - block:k + block]
window = window[~np.isnan(window)]
if np.abs(point - window.mean()) >= std2 * window.std():
res[k] = np.NaN
return Series(res, index=self.index, name=self.name)