Rééchantillonner des séries chronologiques / des données spectrales pour réduire les dimensions [Python: SciPy]

2019er mars 3

Il s'agit d'une méthode lorsque vous souhaitez éclaircir les données de séries chronologiques / de spectre dans le DataFrame en Python.

Avec "pandas.DataFrame.resample", vous devez définir l'heure comme D (quotidiennement) et W (hebdomadaire) avec l'argument.Si vous souhaitez éclaircir les données de séries chronologiques ou les données de spectre qui n'ont pas de colonne de date et d'heure, vous pouvez utiliser la méthode suivante.

Qu'est-ce que les séries chronologiques / données spectrales?

Des séries temporelles / données spectrales sont observées à intervalles réguliers le long d'un certain axe.La série de données s'applique.Par exemple, les variations des prix des actions et des spectres d'absorption.

Exemple de données de séries chronologiques Exemple de données spectrales
・ Transition des conditions de température et de précipitation
・ Changements des conditions de circulation
· Ventes quotidiennes
・ Modifications des cours des actions
・ Modifications des prix Bitcoin
・ Données vocales
-Spectre d'absorption composé (IR, UV)
・ Spectre des corps célestes

Bien que chaque classification soit différente, les données présentent les caractéristiques similaires suivantes.

  1. Les points adjacents à un point de mesure prennent des valeurs proches
  2. Le bruit est inclus dans le long terme (large gamme)

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

Rééchantillonnage de séries chronologiques / données spectrales

Lors de la création d'un modèle de prédiction basé sur des séries temporelles / des données spectrales, si des données à tous les points de mesure sont utilisées, un grand nombre d'entités seront créées.Comme cela conduit à un surajustement, la réduction de dimension par sous-échantillonnage est efficace pour améliorer les performances de généralisation.

Quoi utiliser: SciPy (scipy.signal)

Logiciel open source pour les mathématiques, les sciences et l'ingénierieÉcosystème Ware (un assortiment de bibliothèques informatiques scientifiques avancées).

Il peut effectuer un traitement arithmétique numérique plus avancé que NumPy et peut facilement exécuter une intégration numérique, un traitement du signal, une optimisation, des statistiques, etc. à partir de constantes physiques, de matrices éparses et de distributions de probabilités.

scipy.signal est un module lié au traitement des formes d'onde dans scipy.

  • scipy.signal.decimate

import numpy as np à partir du signal d'importation scipy # Créer les données de forme d'onde sous-jacentes à 40 points x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # Sous-échantillonnage en 20 points basés sur les données x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.decimate (y, 2) #Downsampling to 2/1 # Tracez le résultat sur un graphique% matplotlib inline plt.plot (x, y, '.-', label = 'data') plt.plot (x_down, y_down, 'rs-', label = 'sous-échantillonné', alpha = 0.5) plt.legend () plt.show ( )
Sous-échantillonnage avec scipy.signal.decimate
Sous-échantillonnage avec scipy.signal.decimate

scipy.signal.decimate effectue un traitement anti-crénelage et des sous-échantillons (le traitement anti-crénelage est un traitement destiné à éliminer la distorsion lors de l'échantillonnage à partir de données continues à intervalles réguliers).Il est rééchantillonné sous une forme similaire à celle avec les points de données réduits en l'état.

Référence:https://docs.scipy.org/doc/scipy-1.2.1/reference/generated/scipy.signal.decimate.html

  • scipy.signal.resample

#Créer 40 données de forme d'onde de base x = np.linspace (0, 10, 40, endpoint = False) y = np.cos (-x ** 2/6) # 2.5 fois basé sur les données Suréchantillonnage à 100 points x_up = np .linspace (0, 10, 100, endpoint = False) y_up = signal.resample (y, 100) # Sous-échantillonnage à la moitié de 20 points en fonction des données x_down = np.linspace (0, 10, 20, endpoint = False) y_down = signal.resample (y, 20) #Plot the result on a graph import matplotlib.pyplot as 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 = 'sous-échantillonné', alpha = 0.5) plt.legend () plt.show ()
Données de forme d'onde traitées par scipy.signal.resample
Données de forme d'onde traitées par scipy.signal.resample

Puisque scipy.signal.resample est rééchantillonné en utilisant la transformée de Fourier, il est basé sur l'hypothèse que le signal est périodique.Si la périodicité n'est pas satisfaite, comme à la fin des données ci-dessus, la valeur s'écartera considérablement.

À propos, scipy.signal.resample peut également être sur-échantillonné.
La ligne bleue est le point de données d'origine, la verte est le tracé après le suréchantillonnage et le rouge est le tracé après le sous-échantillonnage.

 

Concours d'analyse vocale KaggleIl existe également un exemple d'utilisation dans, donc ce sera utile.

Référence:https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.signal.resample.html

Appliquer à DataFrame

Les lignes correspondent à chaque point de mesure et les colonnes à chaque bloc de données échantillon.

import pandas as pd # Créer des données à stocker dans la trame de données y1 = np.cos (-x ** 2/6) * 1/2 y2 = np.cos (x) * 1/3 df1 = pd.DataFrame ( {{'y': y, 'y1': y1, 'y2': y2}) # Sous-échantillonnage df1_down = signal.decimate (df1, 2, axis = 0) df1_down = pd.DataFrame (df1_down, columns = ['y_down ',' y1_down ',' y2_down '], index = np.linspace (0, 10, 20, endpoint = False)) # Afficher les données sous-échantillonnées et tracer print (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)
Points de données avant et après le sous-échantillonnage
Avant le sous-échantillonnage Après le sous-échantillonnage

Même s'il est sous-échantillonné des 40 points d'origine à 1 points, ce qui équivaut à 2/20, la forme d'onde est maintenue avec une grande précision et il semble qu'il y ait peu de perte d'information même si elle est utilisée comme quantité de fonction.

Un exemple de bloc de données avec des lignes pour chaque échantillon et des colonnes pour chaque point de mesure
Lorsque la ligne correspond à chaque échantillon et que la colonne correspond à chaque point de mesure

Si la ligne ci-dessus correspond à chaque échantillon et que la colonne est une trame de données de chaque point de mesure (données dites ordonnées), l'argumentaxis=1Si c'est le cas, tout va bien.