Benützer:


Modi finden

Storyboard

Der beste Weg, um die Ähnlichkeit temporärer Segmente zu bestimmen, ist die Korrelation dieser mit dem aktuellen Segment.

Um das Verfahren zu analysieren, wird ein aktuelles Segment genommen, das in der Vergangenheit liegt, um ein späteres Segment zu haben, das verwendet werden kann, um die Qualität der Prognose zu bewerten.

Die Korrelation wird des letzten Segments mit ähnlichen Segmenten in der Vergangenheit durchgeführt, die dieselben Jahreszeiten abdecken. Es wird das Segment ausgewählt, das die höchste Korrelation aufweist.

>Modell

ID:(1912, 0)



Lesen von Daten aus Bildern

Bedingung

>Top


Um die Daten zu erhalten, müssen alle Bilder durchlaufen werden, wobei die entsprechenden Pixel gelesen werden:

import os
from os.path import exists
from PIL import Image

# build date array
sdate = []
year = 2010
month = 6
    
while year < 2022 or (year == 2022 and month < 6):
    sdate.append(str(year) + \'-\' + str(month).zfill(2))
    if month < 12:
        month = month + 1
    else:
        month = 1
        year = year + 1

# load data (pixels from each image)
num = 0
val = []
for n in range(len(sdate)):

    file_name = \'../NASA/\' + vdir[nm] + \'/\' + vdir[nm] + \'_\' + sdate[n] + \'.PNG\'n    if exists(file_name):

        im_var = Image.open(file_name)
        # if needed resize
        var_width, var_height = im_var.size
        if var_width != width or var_height != height:
            im_resize = im_var.resize((width, height),resample=Image.NEAREST)
            im_var = im_resize
                
        pix_var = im_var.load()
    
        if pix_var[i,j] < 255:
            val.append(min_var[nm] + (max_var[nm] - min_var[nm])*pix_var[i,j]/254)
        else:
            val.append(9999)
        num = num + 1
        
if 144 != num:
    print(\'Number or records:\',num)
    sys.exit()

ID:(14332, 0)



Problem mit fehlenden Daten

Bedingung

>Top


Um fehlende Daten (mit den Werten 9999 oder -9999) zu liefern, fahren wir fort, die Werte zu interpolieren. Liegen sie an den Extremen, wird aus dem Mittelwert der Skala interpoliert:

# Eliminate missing values
x = []    
min_range = []
max_range = []
cnt_range = []
delta_range = []
val_range = []
sta = 0
for i in range(len(val)):
    # case first point unknown
    if i == 0 and (val[0] == 9999 or val[0] == -9999):
        min_range.append(0)
        cnt_range.append(1)
        sta = 1
    # no case selected
    if sta == 0:
        # check if range is starting and setup in case
        if val[i] == 9999 or val[i] == -9999:
            min_range.append(i)
            cnt_range.append(1)
            sta = 1
    # case in progress
    else:
        # is finishing
        if val[i] != 9999 and val[i] != -9999:
            max_range.append(i-1)
            delta_range.append(0)
            val_range.append(0)
            sta = 0
        # not finish
        else:
            cnt_range[len(cnt_range)-1] = cnt_range[len(cnt_range)-1] + 1
    x.append(val[i])

# close if case in progress
if sta == 1:
    max_range.append(len(val)-1)
    delta_range.append(0)
    val_range.append(0)

# setup delta and val    
for i in range(len(cnt_range)):
    
    # if last point
    if max_range[i] == len(x) - 1:
        delta_range[i] = (max_var[nm] + min_var[nm])/2
    else:
        delta_range[i] = x[max_range[i] + 1]
    print(\'max\',max_range[i],x[max_range[i] + 1])
        
    # if first point
    if min_range[i] == 0:
        delta_range[i] = delta_range[i] - (max_var[nm] + min_var[nm])/2
        val_range[i] = (max_var[nm] + min_var[nm])/2
    else:
        delta_range[i] = delta_range[i] - x[min_range[i] - 1]
        val_range[i] = x[min_range[i] - 1]
    print(\'min\',min_range[i],x[min_range[i] - 1])
        
    for n in range(min_range[i],max_range[i] + 1):
        x[n] = val_range[i] + delta_range[i]*(n - min_range[i] + 1)/(max_range[i] - min_range[i] + 2)

ID:(14319, 0)



Berechnung des Trends durch Regression

Bedingung

>Top


Um den Trend innerhalb des Signals zu erhalten, führen wir eine Regression mit allen Zeitpunkten durch, mit denen es modelliert wird:

# Seteo de datos
sxy = 0
sx = 0
sy = 0
sx2 = 0
N = 0

# calculo de sumas    
for i in range(nmon):
    
# calculo de sumas    
for i in range(x):
    
    # sumas
    sxy = sxy + i*x[i]
    sx = sx + i
    sy = sy + x[i]
    sx2 = sx2 + i**2
    N = N + 1
    
# calculate coefficients
d = N*sx2 - sx**2
if d != 0:
    a = (sx2*sy - sx*sxy)/d1
    b = (N*sxy - sx*sy)/d1

ID:(14317, 0)



Die Zeitreihen vorbereiten

Bild

>Top


Para obtener los modos se debe primero restar la tendencia. Esto se logra restando la función obtenida de la regresión:

z = []    
for i in range(len(x)):
    z.append(x[i] - a - b*i)


Con ello se obtiene una nueva función que oscila en torno de cero:

ID:(14318, 0)



Berechnung von Modi

Bild

>Top


Los modos se obtienen realizando la transformada de Fourier:

import numpy np
from numpy.fft import fft, ifft

Z = fft(z)
T = len(Z)
t = np.arange(N)
df = 1/T


con lo que se obtiene un diagrama en que se ve cada modo:



Nota: las lineas corresponde a valores complejos. La representación es en función del valor absoluto:

import matplotlib.pyplot as plt

plt.figure(figsize = (14, 6))
plt.stem(freq, np.abs(Z), \'b\', markerfmt=\' \', basefmt=\'-b\')
plt.title(unt_var[nm]+\' Spectrum\')
plt.xlabel(\'Freq (Hz)\')
plt.ylabel(\'FFT Amplitude |X(freq)|\')
plt.yscale(\'log\')
plt.xlim(0,0.5)
plt.show()

ID:(14333, 0)



Filterung im Jahresmodus

Bild

>Top


El espectro esta compuesto de tres partes:

- la oscilación anual
- los modos de periodo mayor que un año
- las fluctuaciones

Los primeros son la onda base con frecuencia de 1/12 y sus armónicos. Las frecuencias menores debajo de la frecuencia base y los modos entre los armónicos que corresponden a las fluctuaciones. Para obtener el modelo se eliminan las fluctuaciones lo que se logra simplemente anulando los valores del espectro:

Zm = []

for i in range(len(Z)):
    if i < imax:
        # frecuencias bajas
        Zm.append(Z[i])
    elif i % imax == 0:
        # modos anuales
        Zm.append(Z[i])
    else:
        # frecuencias altas
        Zm.append(complex(0,0))


con lo que se obtiene un diagrama en que se ve cada modo:

ID:(14335, 0)



Jährliche Modellmodi

Bild

>Top


Si se consideran solo los modos anuales se puede filtrar aquella parte de la serie temporal:

ID:(14334, 0)



Jährliche Modellzeitreihen

Bild

>Top


Si se calcula la transformada de Fourier inversa se puede obtener la forma de la curva para estos modos.

from numpy.fft import fft, ifft

X = ifft(Z)


En este caso se obtiene una serie temporal de la forma:

ID:(14338, 0)



Modi des Niederfrequenzmodells

Bild

>Top


Si se consideran solo los modos de frecuencias menores, se puede filtrar aquella parte de la serie temporal:

ID:(14336, 0)



Zeitreihen des Nebenfrequenzmodells

Bild

>Top


Si se calcula la transformada de Fourier inversa se puede obtener la forma de la curva para estos modos.

from numpy.fft import fft, ifft

X = ifft(Z)


En este caso se obtiene una serie temporal de la forma:

ID:(14340, 0)



Modi des Fluktuationsmodells

Bild

>Top


Si se consideran solo los modos de fluctuación se puede filtrar aquella parte de la serie temporal:

ID:(14337, 0)



Schwankungen modellieren Zeitreihen

Bild

>Top


Si se calcula la transformada de Fourier inversa se puede obtener la forma de la curva para estos modos.

from numpy.fft import fft, ifft

X = ifft(Z)


En este caso se obtiene una serie temporal de la forma:

ID:(14339, 0)



Fluktuationsanalyse

Bild

>Top


Um festzustellen, ob die Fluktuation eine Art Struktur hat, können Segmente von Fluktuationen zwischen verschiedenen Jahren korreliert werden:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = {}
col = []
for i in range(0,nmon):  
    temp = []
    for s in range(0,12):
        temp.append(Xf[12*i + s])
    data[str(i+1)] = temp
    col.append(str(i+1))

df = pd.DataFrame(data,columns=col)
        
dfcorr = df.corr().round(2)

plt.figure(figsize = (12, 12))
plt.title(\'Correlation\')
mask = np.triu(np.ones_like(dfcorr, dtype=bool))
sns.heatmap(dfcorr, annot=True, vmax=1, vmin=-1, center=0, cmap=\'vlag\', mask=mask)
plt.show()


Die Ausgabe zeigt alle möglichen Korrelationen:

die in diesem Fall kein charakteristisches Wiederholungsmuster zu zeigen scheinen.

ID:(14341, 0)