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 **.
Mit Python,
Mach alles auf einmal.
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.
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()
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!
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