[PYTHON] Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale

Transformez instantanément les données 2D en diagramme à l'aide de matplotlib de python Le deuxième de la série "Illustrer en un instant avec matplotlib de python" suit. Quoi qu'il en soit, pour ceux qui veulent facilement ** trouver un cycle exceptionnel avec des données chronologiques unidimensionnelles comme indiqué ci-dessous **.

image

En utilisant python,

Faites tout en même temps.

1. Code

Définissez les classes suivantes à l'avance.

spectra.py


# coding:utf-8

from scipy import fftpack
import numpy as np
import matplotlib.pyplot as plt


class Spectra(object):
    def __init__(self, t, f, time_unit):
        """
         - t :Valeur de l'axe des temps
         - f :Valeur des données
         - time_unit :Unité de l'axe des temps
         - Po :Densité du spectre de puissance
        """
        assert t.size == f.size  #Assurez-vous que la longueur de l'axe des temps et la longueur des données sont identiques
        assert np.unique(np.diff(t)).size == 1  #Assurez-vous que tous les intervalles de temps sont constants
        self.time_unit = time_unit   #Unité de temps
        T = (t[1] - t[0]) * t.size
        self.period = 1.0 / (np.arange(t.size / 2)[1:] / T)

        #Calculer la densité spectrale de puissance
        f = f - np.average(f)         #Zéro la moyenne.
        F = fftpack.fft(f)                          #Transformée de Fourier Rapide
        self.Po = np.abs(F[1:(t.size // 2)]) ** 2 / T

    def draw_with_time(self, fsizex=8, fsizey=6, print_flg=True, threshold=1.0):
        #Tracez la densité spectrale de puissance au fil du temps sur l'axe horizontal
        fig, ax = plt.subplots(figsize=(fsizex, fsizey))   #Spécifier la taille de la figure
        ax.set_yscale('log')
        ax.set_xscale('log')
        ax.set_xlabel(self.time_unit)
        ax.set_ylabel("Power Spectrum Density")
        ax.plot(self.period, self.Po)
        if print_flg:   #Tracez une ligne où la valeur de densité spectrale de puissance est supérieure au seuil et décrivez la valeur de période.
            dominant_periods = self.period[self.Po > threshold]
            print(dominant_periods, self.time_unit +
                  ' components are dominant!')
            for dominant_period in dominant_periods:
                plt.axvline(x=dominant_period, linewidth=0.5, color='k')
                ax.text(dominant_period, threshold,
                        str(round(dominant_period, 3)))

        return plt

Comme vous pouvez le voir, [FFT (transformée de Fourier discrète)](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3 % 83% 95% E3% 83% BC% E3% 83% AA% E3% 82% A8% E5% A4% 89% E6% 8F% 9B) est effectuée pour calculer la densité spectrale de puissance. La période à laquelle la densité spectrale de puissance montre une valeur plus grande que l'environnement est la période prédominante dans la série temporelle.

2. Vérification

Créez vos propres données de séries chronologiques et utilisez-les pour vérifier le code ci-dessus.

#coding:utf-8

import numpy as np
import matplotlib.pyplot as plt
from spectra import Spectra

#Création de données de séries chronologiques
#Données mensuelles sur 30 ans(Autrement dit, le nombre de données est de 360)
#Grande année(=12 mois)10 ans progressifs en plus du cycle(=120 mois)Un peu de bruit à chaque fois
N = 360
t = np.arange(0, N)
td = t * np.pi / 6.0
f = np.sin(td) + 35.0 + 0.2 * np.sin(td * 0.1) + np.random.randn(N) * 0.1

#Dessin de la série chronologique originale
plt.figure(figsize=(20, 6))
plt.plot(t, f)
plt.xlim(0, N)
plt.xlabel('Month')
plt.show()

#Dessin de cycles exceptionnels
spectra = Spectra(t, f, 'Month')
plt = spectra.draw_with_time()
plt.show()

3. Résultat

Le diagramme de données de série chronologique d'origine ressemble à celui en haut de cet article. Et le diagramme du cycle exceptionnel est le suivant.

[ 120. 12.] Month components are dominant! image

Comme vous pouvez le voir, c ’est un cycle exceptionnel.

Il a extrait à merveille. Si les valeurs aux deux extrémités des données de la série chronologique d'origine sont sensiblement différentes, [Window function](https://ja.wikipedia.org/wiki/%E7%AA%93%E9%96%A2%] Traitez les données sous une forme adaptée à l'analyse spectrale, par exemple en appliquant E6% 95% B0).


Les références

Recommended Posts

Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Graphique des données de séries chronologiques en Python à l'aide de pandas et matplotlib
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Puissance des méthodes de prédiction dans l'analyse de données chronologiques Semi-optimisation (SARIMA) [Memo]
Obtenez des données de séries chronologiques de k-db.com avec Python
Raccourcir le temps d'analyse d'Openpose à l'aide du son
Comment lire les données de séries chronologiques dans PyTorch
Prédire à partir de diverses données en Python à l'aide de l'outil de prédiction de séries chronologiques Facebook Prophet
Analyse de Big Data à l'aide du framework de contrôle de flux de données Luigi
Python: analyse des séries chronologiques
Analyse des données à l'aide de xarray
Analyse des séries chronologiques RNN_LSTM1
Analyse des séries chronologiques 1 Principes de base
Analyse de la vie de la technologie avec les données d'articles Qiita ~ Analyse du temps de survie à l'aide du journal de contenu ~
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux
J'ai essayé d'illustrer le temps et le temps du langage C
Analyse des séries chronologiques partie 4 VAR
Analyse de séries chronologiques Partie 3 Prévisions
[Python] Tracer des données de séries chronologiques
Analyse de séries chronologiques Partie 1 Autocorrélation
Analyse de données à l'aide de pandas python
[Connu de façon inattendue? ] Présentation d'une vraie journée dans le département d'analyse des données
Le premier débutant en programmation à essayer une analyse de données simple avec programmation
<Pandas> Comment gérer les données de séries chronologiques dans le tableau croisé dynamique
[Statistiques] [Analyse des séries chronologiques] Tracez le modèle ARMA et saisissez la tendance.
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment