Erneutes Abtasten von Zeitreihen / Spektrumsdaten zur Reduzierung der Dimensionen [Python: SciPy]

2019/3/26

Dies ist eine Methode, wenn Sie die Zeitreihen- / Spektrumsdaten im DataFrame in Python ausdünnen möchten.

Bei "pandas.DataFrame.resample" müssen Sie die Zeit wie D (täglich) und W (wöchentlich) mit dem Argument festlegen.Wenn Sie Zeitreihendaten oder Spektrumsdaten ohne Datums- und Zeitspalte ausdünnen möchten, können Sie die folgende Methode verwenden.

Was sind Zeitreihen- / Spektrumsdaten?

Zeitreihen- / Spektraldaten werden in regelmäßigen Abständen entlang einer bestimmten Achse beobachtet.Es gilt die Datenreihe.Zum Beispiel Änderungen der Aktienkurse und Absorptionsspektren.

Beispiel für Zeitreihendaten Beispiel für Spektraldaten
・ Übergang von Temperatur und Niederschlagsbedingungen
・ Änderungen der Verkehrsbedingungen
· Tägliche Verkäufe
・ Änderungen der Aktienkurse
・ Änderungen der Bitcoin-Preise
・ Sprachdaten
-Verbindungsabsorptionsspektrum (IR, UV)
・ Spektrum von Himmelskörpern

Obwohl jede Klassifizierung unterschiedlich ist, weisen die Daten die folgenden ähnlichen Merkmale auf.

  1. Punkte neben einem Messpunkt nehmen enge Werte an
  2. Lärm ist langfristig enthalten (breites Spektrum)

参照: https://kotobank.jp/word/%E6%99%82%E7%B3%BB%E5%88%97%E3%83%87%E3%83%BC%E3%82%BF-1329677 https://datachemeng.com/preprocessspectratimeseriesdata/

Erneutes Abtasten von Zeitreihen / Spektraldaten

Wenn beim Erstellen eines Vorhersagemodells basierend auf Zeitreihen / Spektraldaten Daten an allen Messpunkten verwendet werden, wird eine große Anzahl von Merkmalen erstellt.Da dies zu einer Überanpassung führt, ist eine Dimensionsreduzierung durch Downsampling zur Verbesserung der Generalisierungsleistung wirksam.

Was zu verwenden: SciPy (scipy.signal)

Open Source Software für Mathematik, Naturwissenschaften und IngenieurwissenschaftenWare-Ökosystem (eine Auswahl fortschrittlicher wissenschaftlicher Computerbibliotheken).

Es kann eine fortgeschrittenere numerische arithmetische Verarbeitung als NumPy ausführen und kann auf einfache Weise numerische Integration, Signalverarbeitung, Optimierung, Statistik usw. aus physikalischen Konstanten, spärlichen Matrizen und Wahrscheinlichkeitsverteilungen ausführen.

scipy.signal ist ein Modul zur Wellenformverarbeitung in scipy.

  • scipy.signal.dezimieren

importiere numpy als np aus dem scipy-Importsignal # Erstelle die zugrunde liegenden 40-Punkt-Wellenformdaten x = np.linspace (0, 10, 40, Endpunkt = False) y = np.cos (-x ** 2/6) # Downsampling auf 20 Punkte basierend auf Daten x_down = np.linspace (0, 10, 20, Endpunkt = False) y_down = signal.decimate (y, 2) #Downsampling auf 2/1 # Zeichnen Sie das Ergebnis in einem Diagramm% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sampled', alpha = 0.5) plt.legend () plt.show ( )
Downsampling mit scipy.signal.decimate
Downsampling mit scipy.signal.decimate

scipy.signal.decimate führt eine Anti-Aliasing-Verarbeitung und Downsamples durch (Antialiasing-Verarbeitung wird verarbeitet, um Verzerrungen beim Abtasten aus kontinuierlichen Daten in regelmäßigen Abständen zu vermeiden).Es wird in einer ähnlichen Form wie der mit reduzierten Datenpunkten neu abgetastet.

Referenz:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • Scipy.Signal.Resample.

#Erstellen Sie 40 Basiswellenformdaten x = np.linspace (0, 10, 40, Endpunkt = False) y = np.cos (-x ** 2/6) # 2.5-mal basierend auf den Daten Upsampling auf 100 Punkte x_up = np .linspace (0, 10, 100, Endpunkt = False) y_up = signal.resample (y, 100) # Downsampling auf die Hälfte von 20 Punkten basierend auf Daten x_down = np.linspace (0, 10, 20, Endpunkt = False) y_down = signal.resample (y, 20) # Zeichnen Sie das Ergebnis in einen Diagrammimport matplotlib.pyplot als plt% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_up, y_up , 'go-', label = 'up-sampled', alpha = 0.3) plt.legend () plt.show () plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sampled', alpha = 0.5) plt.legend () plt.show ()
Von scipy.signal.resample verarbeitete Wellenformdaten
Von scipy.signal.resample verarbeitete Wellenformdaten

Da scipy.signal.resample unter Verwendung der Fourier-Transformation erneut abtastet, basiert es auf der Annahme, dass das Signal periodisch ist.Wenn die Periodizität nicht erfüllt ist, z. B. am Ende der obigen Daten, weicht der Wert erheblich ab.

Übrigens kann scipy.signal.resample auch ein Up-Sampling sein.
Die blaue Linie ist der ursprüngliche Datenpunkt, das Grün ist das Diagramm nach dem Upsampling und das Rot ist das Diagramm nach dem Downsampling.

 

kaggle Sprachanalyse WettbewerbEs gibt auch ein Verwendungsbeispiel in, daher ist es hilfreich.

Referenz:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

Auf DataFrame anwenden

Zeilen sind für jeden Messpunkt und Spalten sind für jeden Probendatenrahmen.

Pandas als pd importieren # Daten erstellen, die im Datenrahmen gespeichert werden sollen y1 = np.cos (-x ** 2/6) * 1/2 y2 = np.cos (x) * 1/3 df1 = pd.DataFrame ( {{'y': y, 'y1': y1, 'y2': y2}) # Downsampling df1_down = signal.decimate (df1, 2, Achse = 0) df1_down = pd.DataFrame (df1_down, Spalten = ['y_down ',' y1_down ',' y2_down '], index = np.linspace (0, 10, 20, Endpunkt = False)) # Downsampled-Daten anzeigen & Plotdruck (df1.head (10)) print (df1_down.head) ( 10)) df1.plot (kind = 'line', marker = '.') Df1_down.plot (kind = 'line', marker = '.')
df1.head (10) df1_down.head (10)
 df1.head (10) df1_down.head (10)
Datenpunkte vor und nach dem Downsampling
Vor dem Downsampling Nach dem Downsampling

Selbst wenn es von den ursprünglichen 40 Punkten auf 1 Punkte heruntergesampelt wird, was 2/20 ist, wird die Wellenform mit hoher Genauigkeit beibehalten, und es scheint, dass es kaum zu Informationsverlusten kommt, selbst wenn sie als Merkmalsmenge verwendet wird.

Ein Beispiel für einen Datenrahmen mit Zeilen für jede Probe und Spalten für jeden Messpunkt
Wenn die Zeile jede Probe und die Spalte jeder Messpunkt ist

Wenn die obige Zeile jede Probe ist und die Spalte ein Datenrahmen jedes Messpunktes ist (sogenannte geordnete Daten), ist das Argumentaxis=1Wenn ja, ist es OK.