2017-10-17 6 views
0

Ich habe einen DataFrame für ein schnelles Fourier-transformiertes Signal.Ausreißer in einem Pandas-Datenframe mit einer rollenden Standardabweichung ermitteln

Es gibt eine Spalte für die Frequenz in Hz und eine andere Spalte für die entsprechende Amplitude.

Ich habe einen Beitrag gelesen, der vor ein paar Jahren gemacht wurde, dass Sie eine einfache boolesche Funktion verwenden können, um Ausreißer im endgültigen Datenrahmen auszuschließen oder nur einzuschließen, die über oder unter ein paar Standardabweichungen liegen.

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 

Das Problem ist, dass mein Signal mehr Größenordnung abfällt (bis zu 10 000 mal kleiner) mit zunehmender Frequenz bis zu 50 000 Hz. Daher kann ich keine Funktion verwenden, die nur Werte über 3 Standardabweichungen exportiert, da ich nur die "Spitzen" -Ausreißer von den ersten 50 Hz aufnehmen werde.

Gibt es eine Möglichkeit, Ausreißer in meinem Datenrahmen zu exportieren, die über 3 Rolling Standardabweichungen eines Rolling Means liegen?

+0

Also versuche ich alle Werte, die gefiltert werden (größer als meine Mittelwert + 3SD) in eine andere Spalte in meinem Dataframe vor dem Export. Im Moment zeigen sie nur als wahr oder falsch von 'N1 ['Peaks] = (N1 [' Cell 1-1 ']> N1 [' Filter '])' Gibt es eine Möglichkeit, die Zahlen stattdessen zu bekommen? Die Spalten Zelle 1-1 und Filter sind nur Werte für meine Daten und Filter. – Jack

Antwort

0

Dies ist vielleicht am besten mit einem schnellen Beispiel veranschaulicht. Im Grunde vergleichen Sie Ihre vorhandenen Daten mit einer neuen Spalte, die den rollenden Mittelwert plus drei Standardabweichungen darstellt, auch rollierend.

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 

Um eine neue Spalte Filterung nur für Ausreißer, mit NaN anderer Stelle hinzu:

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 

Hier .where kehrt

Ein Gegenstand der gleichen Form wie self und deren entsprechende Einträge sind von self wo cond ist True und ansonsten sind von other.

Verwandte Themen