2017-10-17 16 views
0

저는 고속 푸리에 변환 신호를위한 DataFrame을 가지고 있습니다.롤 표준 편차를 사용하여 팬더 데이터 프레임에서 이상치를 검출합니다.

주파수가 Hz 인 열과 해당 진폭이 다른 열이 있습니다.

몇 가지 표준 편차보다 높거나 낮은 최종 데이터 프레임의 예외 값을 제외하거나 제외하기 위해 간단한 부울 함수를 사용할 수있는 몇 년 전에 작성된 게시물을 읽었습니다.

df = pd.DataFrame({'Data':np.random.normal(size=200)}) # example dataset of normally distributed data. 
df[~(np.abs(df.Data-df.Data.mean())>(3*df.Data.std()))] # or if you prefer the other way around 

문제는 신호가 50,000Hz까지 주파수가 증가함에 따라 몇 가지 크기 (최대 10,000 배 더 작음)가 떨어지는 것입니다. 따라서 첫 번째 50Hz에서 "봉우리"이상 값만 가져 오므로 3 표준 편차 이상의 값만 내보내는 함수는 사용할 수 없습니다.

롤링 평균의 3 표준 편차를 초과하는 이상치를 내 데이터 프레임에서 내보낼 수있는 방법이 있습니까?

+0

그래서 내 데이터 프레임의 다른 열에 필터링하기 전에 (내 평균 + 3SD보다 큰) 모든 값을 추가하려고합니다. N1 [ 'Peaks'] = (N1 [ 'Cell 1-1']> N1 [ 'Filter'])'숫자를 얻는 방법이 있습니까? Cell 1-1 및 Filter 열은 데이터 및 필터 값입니다. – Jack

답변

0

빠른 예제를 통해 가장 잘 설명 할 수 있습니다. 기본적으로 기존 데이터를 롤링 평균과 3 표준 편차의 새로운 열과 롤링 기준으로 비교합니다.

import pandas as pd 
import numpy as np 
np.random.seed(123) 
df = pd.DataFrame({'Data':np.random.normal(size=200)}) 

# Create a few outliers (3 of them, at index locations 10, 55, 80) 
df.iloc[[10, 55, 80]] = 40.  

r = df.rolling(window=20) # Create a rolling object (no computation yet) 
mps = r.mean() + 3. * r.std() # Combine a mean and stdev on that object 

print(df[df.Data > mps.Data]) # Boolean filter 
#  Data 
# 55 40.0 
# 80 40.0 

다른 장소 NaN이 함께 만 특이점에 새로운 열 필터를 추가하는 방법 :

여기
df['Peaks'] = df['Data'].where(df.Data > mps.Data, np.nan) 

print(df.iloc[50:60]) 
     Data Peaks 
50 -1.29409 NaN 
51 -1.03879 NaN 
52 1.74371 NaN 
53 -0.79806 NaN 
54 0.02968 NaN 
55 40.00000 40.0 
56 0.89071 NaN 
57 1.75489 NaN 
58 1.49564 NaN 
59 1.06939 NaN 

.where 복귀

self 동일 형상의 물체와 그 대응하는 항목 이다 self에서 cond이 True이고 그렇지 않으면 other입니다.