Ricampionamento di serie temporali / dati dello spettro per ridurre le dimensioni [Python: SciPy]

2019 年 3 月 26 日

Questo è un metodo quando si desidera ridurre i dati delle serie temporali / dello spettro nel DataFrame in Python.

Con "pandas.DataFrame.resample", devi impostare l'ora come D (giornaliero) e W (settimanale) con l'argomento.Se si desidera ridurre i dati delle serie temporali o i dati dello spettro che non hanno una colonna di data e ora, è possibile utilizzare il metodo seguente.

Cosa sono i dati delle serie temporali / dello spettro?

I dati di serie temporali / spettrali vengono osservati a intervalli regolari lungo un certo asse.Si applica la serie di dati.Ad esempio, variazioni dei prezzi delle azioni e spettri di assorbimento.

Esempio di dati di serie temporali Esempio di dati spettrali
・ Transizione delle condizioni di temperatura e precipitazione
・ Cambiamenti nelle condizioni del traffico
・ Vendite giornaliere
・ Variazioni dei prezzi delle azioni
・ Cambiamenti nei prezzi dei Bitcoin
・ Dati vocali
-Spettro di assorbimento composto (IR, UV)
・ Spettro dei corpi celesti

Sebbene ogni classificazione sia diversa, i dati hanno le seguenti caratteristiche simili.

  1. I punti adiacenti a un punto di misurazione assumono valori vicini
  2. Il rumore è incluso a lungo termine (ampia gamma)

参照: 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/

Ricampionamento di serie temporali / dati spettrali

Quando si crea un modello di previsione basato su serie temporali / dati spettrali, se vengono utilizzati dati in tutti i punti di misurazione, verrà creato un numero enorme di caratteristiche.Poiché questo porta all'overfitting, la riduzione delle dimensioni mediante il downsampling è efficace per migliorare le prestazioni di generalizzazione.

Cosa usare: SciPy (scipy.signal)

Software open source per matematica, scienza e ingegneriaEcosistema Ware (un assortimento di librerie di calcolo scientifico avanzato).

Può eseguire un'elaborazione aritmetica numerica più avanzata di NumPy e può eseguire facilmente l'integrazione numerica, l'elaborazione del segnale, l'ottimizzazione, le statistiche, ecc. Da costanti fisiche, matrici sparse e distribuzioni di probabilità.

scipy.signal è un modulo relativo all'elaborazione della forma d'onda in scipy.

  • segnale.scipy.decimare

import numpy as np from scipy import signal # Crea i dati sottostanti della forma d'onda a 40 punti x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # Downsampling a 20 punti in base ai dati x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.decimate (y, 2) #Downsampling a 2/1 #Plot il risultato su un grafico% 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 con scipy.signal.decimate
Downsampling con scipy.signal.decimate

scipy.signal.decimate esegue l'elaborazione anti-aliasing e downsamples (l'elaborazione anti-aliasing è l'elaborazione per eliminare la distorsione durante il campionamento da dati continui a intervalli regolari).Viene ricampionato in una forma simile a quella con i punti dati ridotti così com'è.

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

  • scipy.signal.resample

# Crea 40 dati di forma d'onda di base x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # 2.5 volte in base ai dati Upsampling a 100 punti x_up = np .linspace (0, 10, 100, endpoint = False) y_up = signal.resample (y, 100) # Downsampling a metà 20 punti in base ai dati x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.resample (y, 20) #Porta il risultato su un grafico import matplotlib.pyplot come 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 ()
Dati della forma d'onda elaborati da scipy.signal.resample
Dati della forma d'onda elaborati da scipy.signal.resample

Poiché scipy.signal.resample è un ricampionamento che utilizza la trasformata di Fourier, si basa sul presupposto che il segnale sia periodico.Se la periodicità non è soddisfatta, come alla fine dei dati di cui sopra, il valore si discosterà in modo significativo.

A proposito, scipy.signal.resample può anche essere un up-sampling.
La linea blu è il punto dati originale, il verde è il grafico dopo l'upsampling e il rosso è il grafico dopo il downsampling.

 

concorso di analisi vocale kaggleC'è anche un esempio di utilizzo in, quindi sarà utile.

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

Applica a DataFrame

Le righe sono per ogni punto di misurazione e le colonne per ogni frame di dati campione.

import pandas as pd # Crea i dati da memorizzare nel data frame 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, axis = 0) df1_down = pd.DataFrame (df1_down, colonne = ['y_down ',' y1_down ',' y2_down '], index = np.linspace (0, 10, 20, endpoint = False)) # Visualizza dati sottocampionati e stampa grafico (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)
Punti dati prima e dopo il downsampling
Prima del downsampling Dopo il downsampling

Anche se viene sottocampionato dai 40 punti originali a 1 punti, che è 2/20, la forma d'onda viene mantenuta con elevata precisione e sembra che ci sia poca perdita di informazioni anche se viene utilizzata come quantità di caratteristiche.

Un esempio di un data frame con righe per ogni campione e colonne per ogni punto di misurazione
Quando la riga è ogni campione e la colonna è ogni punto di misurazione

Se la riga sopra è ogni campione e la colonna è un frame di dati di ogni punto di misurazione (i cosiddetti dati ordinati), l'argomentoaxis=1Se è così, va bene.