Python – cómo normalizar datos de series de tiempo

Tengo un conjunto de datos de ejemplos de series de tiempo. Quiero calcular la similitud entre varios ejemplos de series de tiempo, sin embargo, no quiero tener en cuenta las diferencias debidas a la escala (es decir, quiero ver las similitudes en la forma de las series de tiempo, no en su valor absoluto). Entonces, para este fin, necesito una forma de normalizar los datos. Es decir, haciendo que todos los ejemplos de series de tiempo caigan entre una determinada región, por ejemplo, [0,100]. ¿Alguien puede decirme cómo se puede hacer esto en python?

Suponiendo que su serie temporal sea una matriz, intente algo como esto:

(timeseries-timeseries.min())/(timeseries.max()-timeseries.min()) 

Esto limitará tus valores entre 0 y 1.

Las soluciones proporcionadas son buenas para una serie que no es incremental ni decremental (estacionaria). En las series de tiempo financieras (o cualquier otra serie con un sesgo) la fórmula dada no es correcta. En primer lugar, debe ser detrended o realizar una escala basada en las últimas 100-200 muestras.
Y si la serie de tiempo no proviene de una distribución normal (como en el caso de las finanzas), es aconsejable aplicar una función no lineal (una función CDF estándar, por ejemplo) para comprimir los valores atípicos.
El libro de Aronson y Masters (Aprendizaje de máquina estadísticamente sólido para transacciones algorítmicas) utiliza la siguiente fórmula (en partes de 200 días):

V = 100 * N (0.5 (X -F50) / (F75-F25)) -50

Dónde:
X: punto de datos
F50: media de los últimos 200 puntos.
F75: percentil 75
F25: Percentil 25
N: CDF normal

Siguiendo mi comentario anterior, aquí es una función de Python (no optimizada) que realiza el escalado y / o la normalización: (necesita un DataFrame de pandas como entrada, y no verifica eso, por lo que genera errores si se suministra con otro tipo de objeto Si necesita usar una lista o numpy.array, necesita modificarla, pero puede convertir esos objetos a pandas.DataFrame () primero.

Esta función es lenta, por lo que es recomendable ejecutarlo solo una vez y almacenar los resultados.

  from scipy.stats import norm import pandas as pd def get_NormArray(df, n, mode = 'total', linear = False): ''' It computes the normalized value on the stats of n values ( Modes: total or scale ) using the formulas from the book "Statistically sound machine learning..." (Aronson and Masters) but the decission to apply a non linear scaling is left to the user. It is modified to fit the data from -1 to 1 instead of -100 to 100 df is an imput DataFrame. it returns also a DataFrame, but it could return a list. n define the number of data points to get the mean and the quartiles for the normalization modes: scale: scale, without centering. total: center and scale. ''' temp =[] for i in range(len(df))[::-1]: if i >= n: # there will be a traveling norm until we reach the initian n values. # those values will be normalized using the last computed values of F50,F75 and F25 F50 = df[in:i].quantile(0.5) F75 = df[in:i].quantile(0.75) F25 = df[in:i].quantile(0.25) if linear == True and mode == 'total': v = 0.5 * ((df.iloc[i]-F50)/(F75-F25))-0.5 elif linear == True and mode == 'scale': v = 0.25 * df.iloc[i]/(F75-F25) -0.5 elif linear == False and mode == 'scale': v = 0.5* norm.cdf(0.25*df.iloc[i]/(F75-F25))-0.5 else: # even if strange values are given, it will perform full normalization with compression as default v = norm.cdf(0.5*(df.iloc[i]-F50)/(F75-F25))-0.5 temp.append(v[0]) return pd.DataFrame(temp[::-1]) 

No voy a dar el código de Python, pero la definición de normalización es que para cada valor (punto de datos) se calcula “(value-mean) / stdev”. Sus valores no estarán entre 0 y 1 (o 0 y 100) pero no creo que eso sea lo que quiere. Quieres comparar la variación. Que es lo que te queda si haces esto.