Volver a muestrear datos de series de tiempo / espectro para reducir las dimensiones [Python: SciPy]
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.
- Los puntos adyacentes a un punto de medición toman valores cercanos
- 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 ( )
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 ()
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 = '.')
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.
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=1
Si es así, está bien.
discusión
Lista de comentarios
Aún no hay comentarios