[PYTHON] Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse

Verwandeln Sie 2D-Daten mithilfe der Python-Matplotlib sofort in ein Diagramm Der zweite Teil der Serie "In einem Augenblick mit matplotlib of python illustrieren" folgt. Wie auch immer, für diejenigen, die leicht ** einen hervorragenden Zyklus mit eindimensionalen Zeitreihendaten finden möchten, wie unten gezeigt **.

image

Mit Python,

Mach alles auf einmal.

1. Code

Stellen Sie die folgenden Klassen im Voraus ein.

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 :Zeitachsenwert
         - f :Datenwert
         - time_unit :Zeitachseneinheit
         - Po :Leistungsspektrumsdichte
        """
        assert t.size == f.size  #Stellen Sie sicher, dass die Länge der Zeitachse und die Länge der Daten gleich sind
        assert np.unique(np.diff(t)).size == 1  #Stellen Sie sicher, dass alle Zeitintervalle konstant sind
        self.time_unit = time_unit   #Zeiteinheit
        T = (t[1] - t[0]) * t.size
        self.period = 1.0 / (np.arange(t.size / 2)[1:] / T)

        #Berechnen Sie die Dichte des Leistungsspektrums
        f = f - np.average(f)         #Null den Durchschnitt.
        F = fftpack.fft(f)                          #Schnelle Fourier-Transformation
        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):
        #Zeichnen Sie die Leistungsspektrumsdichte über die Zeit auf der horizontalen Achse
        fig, ax = plt.subplots(figsize=(fsizex, fsizey))   #Angabe der Größe der Figur
        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:   #Zeichnen Sie eine Linie, in der der Leistungsspektrumdichtewert größer als der Schwellenwert ist, und beschreiben Sie den Periodenwert.
            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

Wie Sie sehen können, [FFT (diskrete Fourier-Transformation)](https://ja.wikipedia.org/wiki/%E9%AB%98%E9%80%9F%E3] in chronologischer Reihenfolge mit der fft-Funktion von scipy % 83% 95% E3% 83% BC% E3% 83% AA% E3% 82% A8% E5% A4% 89% E6% 8F% 9B) wird durchgeführt, um die Leistungsspektrumsdichte zu berechnen. Der Zeitraum, in dem die Leistungsspektrumsdichte einen größeren Wert als die Umgebung aufweist, ist der Zeitraum, der in der Zeitreihe vorherrscht.

2. Überprüfung

Erstellen Sie Ihre eigenen Zeitreihendaten und überprüfen Sie damit den obigen Code.

#coding:utf-8

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

#Zeitreihendaten erstellen
#Monatliche Daten für 30 Jahre(Das heißt, die Anzahl der Daten beträgt 360)
#Großes Jahr(=12 Monate)10 Jahre schrittweise zusätzlich zum Zyklus(=120 Monate)Zu jeder Zeit ein wenig Lärm
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

#Zeichnung der ursprünglichen Zeitreihe
plt.figure(figsize=(20, 6))
plt.plot(t, f)
plt.xlim(0, N)
plt.xlabel('Month')
plt.show()

#Zeichnung herausragender Zyklen
spectra = Spectra(t, f, 'Month')
plt = spectra.draw_with_time()
plt.show()

3. Ergebnis

Das ursprüngliche Zeitreihendatendiagramm sieht wie oben in diesem Beitrag aus. Und das Diagramm des ausstehenden Zyklus ist wie folgt.

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

Wie Sie sehen, ist es ein hervorragender Zyklus.

Es extrahierte wunderbar. Wenn sich die Werte an beiden Enden der ursprünglichen Zeitreihendaten erheblich unterscheiden, wird [Fensterfunktion](https://ja.wikipedia.org/wiki/%E7%AA%93%E9%96%A2%] Verarbeiten Sie die Daten in eine für die Spektralanalyse geeignete Form, z. B. durch Aufbringen von E6% 95% B0).


Verweise

Recommended Posts

Veranschaulichen Sie sofort die vorherrschende Periode in Zeitreihendaten mithilfe der Spektralanalyse
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Zeichnen Sie Zeitreihendaten in Python mit Pandas und Matplotlib
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Was Sie bei der Zeitreihendatenanalyse (einschließlich Reflexion) nicht tun sollten
Zeitreihenanalyse 3 Vorverarbeitung von Zeitreihendaten
Leistungsfähigkeit von Vorhersagemethoden in der Zeitreihendatenanalyse Halboptimierung (SARIMA) [Memo]
Holen Sie sich mit Python Zeitreihendaten von k-db.com
Verkürzung der Analysezeit von Openpose mithilfe von Sound
Lesen von Zeitreihendaten in PyTorch
Vorhersage aus verschiedenen Daten in Python mit dem Zeitreihen-Vorhersage-Tool Facebook Prophet
Big-Data-Analyse mit dem Datenflusskontroll-Framework Luigi
Python: Zeitreihenanalyse
Datenanalyse mit xarray
RNN_LSTM1 Zeitreihenanalyse
Zeitreihenanalyse 1 Grundlagen
Analyse der Lebensdauer der Technologie mit Qiita-Artikeldaten ~ Überlebenszeitanalyse mithilfe des Inhaltsprotokolls ~
So berechnen Sie die Summe oder den Durchschnitt von Zeitreihen-CSV-Daten in einem Augenblick
Herausforderung für die zukünftige Umsatzprognose: ② Zeitreihenanalyse mit PyFlux
Ich habe versucht, die Zeit und die Zeit der C-Sprache zu veranschaulichen
Zeitreihenanalyse Teil 4 VAR
Zeitreihenanalyse Teil 3 Prognose
[Python] Zeichnen Sie Zeitreihendaten
Zeitreihenanalyse Teil 1 Autokorrelation
Datenanalyse mit Python-Pandas
[Unerwartet bekannt? ] Einführung eines echten Tages in der Datenanalyse
Zum ersten Mal versuchte ein Programmieranfänger eine einfache Datenanalyse mit Programmierung
<Pandas> Umgang mit Zeitreihendaten in der Pivot-Tabelle
[Statistik] [Zeitreihenanalyse] Zeichnen Sie das ARMA-Modell und erfassen Sie die Tendenz.
Versuchen Sie vorerst, FireBase Cloud Firestore mit Python zu verwenden