Volver a muestrear datos de series de tiempo / espectro para reducir las dimensiones [Python: SciPy]

2019/3/26

Este es un método cuando desea reducir los datos de series de tiempo / espectro en el DataFrame en Python.

Con "pandas.DataFrame.resample", debe establecer el tiempo como D (diario) y W (semanal) con el argumento.Si desea reducir los datos de series de tiempo o los datos de espectro que no tienen una columna de fecha y hora, puede utilizar el siguiente método.

¿Qué son los datos de series de tiempo / espectro?

Los datos de series de tiempo / espectrales se observan a intervalos regulares a lo largo de un cierto eje.Se aplica la serie de datos.Por ejemplo, cambios en los precios de las acciones y espectros de absorción.

Ejemplo de datos de series de tiempo Ejemplo de datos espectrales
・ Transición de las condiciones de temperatura y precipitación
・ Cambios en las condiciones del tráfico
· Ventas diarias
・ Cambios en los precios de las acciones
・ Cambios en los precios de Bitcoin
・ Datos de voz
-Espectro de absorción compuesto (IR, UV)
・ Espectro de cuerpos celestes

Aunque cada clasificación es diferente, los datos tienen las siguientes características similares.

  1. Los puntos adyacentes a un punto de medición toman valores cercanos
  2. El ruido se incluye a largo plazo (amplia gama)

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

Re-muestreo de series de tiempo / datos espectrales

Al crear un modelo de predicción basado en datos de series de tiempo / espectro, si se utilizan datos en todos los puntos de medición, se creará una gran cantidad de características.Dado que esto conduce a un sobreajuste, la reducción de dimensión mediante la reducción de la resolución es eficaz para mejorar el rendimiento de generalización.

Qué usar: SciPy (scipy.signal)

Software de código abierto para matemáticas, ciencias e ingenieríaEcosistema Ware (una variedad de bibliotecas informáticas científicas avanzadas).

Puede realizar un procesamiento aritmético numérico más avanzado que NumPy, y puede ejecutar fácilmente integración numérica, procesamiento de señales, optimización, estadísticas, etc. a partir de constantes físicas, matrices dispersas y distribuciones de probabilidad.

scipy.signal es un módulo relacionado con el procesamiento de formas de onda en scipy.

  • scipy.señal.diezmar

import numpy as np from scipy import signal # Crea los datos de forma de onda de 40 puntos subyacentes x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # Reducción de resolución a 20 puntos basados ​​en datos x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.decimate (y, 2) #Muestreo a 2/1 # Trace el resultado en un gráfico% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sample', alpha = 0.5) plt.legend () plt.show ( )
Reducción de resolución con scipy.signal.decimate
Reducción de resolución con scipy.signal.decimate

scipy.signal.decimate realiza un procesamiento de suavizado y reducción de muestras (el procesamiento de suavizado se procesa para eliminar la distorsión cuando se toman muestras de datos continuos a intervalos regulares).Se vuelve a muestrear en una forma similar a la que tiene los puntos de datos reducidos.

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

  • scipy.señal.remuestreo

#Crear 40 datos de forma de onda base x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # 2.5 veces basado en los datos Upsampling a 100 puntos x_up = np .linspace (0, 10, 100, endpoint = False) y_up = signal.resample (y, 100) # Reducción de resolución a la mitad de 20 puntos según los datos x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.resample (y, 20) #Trace el resultado en un gráfico import matplotlib.pyplot como plt% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_up, y_up , 'go-', label = 'up-sample', alpha = 0.3) plt.legend () plt.show () plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'down-sample', alpha = 0.5) plt.legend () plt.show ()
Datos de forma de onda procesados ​​por scipy.signal.resample
Datos de forma de onda procesados ​​por scipy.signal.resample

Dado que scipy.signal.resample es un remuestreo que utiliza la transformada de Fourier, se basa en el supuesto de que la señal es periódica.Si no se satisface la periodicidad, como al final de los datos anteriores, el valor se desviará significativamente.

Por cierto, scipy.signal.resample también puede ser un muestreo ascendente.
La línea azul es el punto de datos original, el verde es el gráfico después del muestreo superior y el rojo es el gráfico después del muestreo reducido.

 

concurso de análisis de voz kaggleTambién hay un ejemplo de uso en, por lo que será útil.

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

Aplicar a DataFrame

Las filas son para cada punto de medición y las columnas son para cada marco de datos de muestra.

importar pandas como pd # Crear datos para ser almacenados en el marco de datos 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, columnas = ['y_down ',' y1_down ',' y2_down '], index = np.linspace (0, 10, 20, endpoint = False)) # Mostrar datos muestreados y trazar impresión (df1.head (10)) print (df1_down.head) ( 10)) df1.plot (tipo = 'línea', marcador = '.') Df1_down.plot (tipo = 'línea', marcador = '.')
df1.head (10) df1_down.head (10)
 df1.head (10) df1_down.head (10)
Puntos de datos antes y después de la reducción de resolución
Antes de reducir la resolución Después de reducir la resolución

Incluso si se reduce de los 40 puntos originales a 1 puntos, que es 2/20, la forma de onda se mantiene con alta precisión y parece que hay poca pérdida de información incluso si se usa como una cantidad de características.

Un ejemplo de un marco de datos con filas para cada muestra y columnas para cada punto de medición.
Cuando la fila es cada muestra y la columna es cada punto de medición

Si la fila anterior es cada muestra y la columna es un marco de datos de cada punto de medición (los llamados datos ordenados), el argumentoaxis=1Si es así, está bien.