IA con Python: análisis de datos de series temporales

Predecir el siguiente en una secuencia de entrada determinada es otro concepto importante en el aprendizaje automático. Este capítulo le brinda una explicación detallada sobre el análisis de datos de series de tiempo.

Introducción

Los datos de series de tiempo son los datos que se encuentran en una serie de intervalos de tiempo particulares. Si queremos construir una predicción de secuencia en el aprendizaje automático, entonces tenemos que lidiar con datos secuenciales y tiempo. Los datos de la serie son un resumen de datos secuenciales. El orden de los datos es una característica importante de los datos secuenciales.

Concepto básico de análisis de secuencia o análisis de series de tiempo

El análisis de secuencia o el análisis de series de tiempo es para predecir el siguiente en una secuencia de entrada dada basándose en lo observado previamente. La predicción puede ser de cualquier cosa que pueda venir a continuación: un símbolo, un número, el tiempo del día siguiente, el siguiente término en el discurso, etc. El análisis de secuencia puede ser muy útil en aplicaciones como análisis de mercado de valores, pronóstico del tiempo y recomendaciones de productos.

Example

Considere el siguiente ejemplo para comprender la predicción de secuencias. aquíA,B,C,D son los valores dados y tienes que predecir el valor E utilizando un modelo de predicción de secuencia.

Instalación de paquetes útiles

Para el análisis de datos de series de tiempo usando Python, necesitamos instalar los siguientes paquetes:

Pandas

Pandas es una biblioteca de código abierto con licencia BSD que proporciona alto rendimiento, facilidad de uso de la estructura de datos y herramientas de análisis de datos para Python. Puede instalar Pandas con la ayuda del siguiente comando:

pip install pandas

Si está utilizando Anaconda y desea instalar utilizando el conda administrador de paquetes, entonces puede usar el siguiente comando:

conda install -c anaconda pandas

hmmaprender

Es una biblioteca de código abierto con licencia BSD que consta de algoritmos y modelos simples para aprender modelos ocultos de Markov (HMM) en Python. Puede instalarlo con la ayuda del siguiente comando:

pip install hmmlearn

Si está utilizando Anaconda y desea instalar utilizando el conda administrador de paquetes, entonces puede usar el siguiente comando:

conda install -c omnia hmmlearn

PyStruct

Es una biblioteca estructurada de aprendizaje y predicción. Los algoritmos de aprendizaje implementados en PyStruct tienen nombres como campos aleatorios condicionales (CRF), redes aleatorias de margen máximo de margen (M3N) o máquinas vectoriales de soporte estructural. Puede instalarlo con la ayuda del siguiente comando:

pip install pystruct

CVXOPT

Se utiliza para la optimización convexa basada en el lenguaje de programación Python. También es un paquete de software gratuito. Puede instalarlo con la ayuda del siguiente comando:

pip install cvxopt

Si está utilizando Anaconda y desea instalar utilizando el conda administrador de paquetes, entonces puede usar el siguiente comando:

conda install -c anaconda cvdoxt

Pandas: manejo, corte y extracción de estadísticas de datos de series de tiempo

Pandas es una herramienta muy útil si tiene que trabajar con datos de series de tiempo. Con la ayuda de Pandas, puede realizar lo siguiente:

  • Cree un rango de fechas usando el pd.date_range paquete

  • Indexe los pandas con fechas usando el pd.Series paquete

  • Realice un nuevo muestreo mediante el ts.resample paquete

  • Cambiar la frecuencia

Ejemplo

El siguiente ejemplo le muestra cómo manejar y dividir los datos de la serie temporal mediante Pandas. Tenga en cuenta que aquí estamos utilizando los datos de la Oscilación Ártica Mensual, que se pueden descargar de Monthly.ao.index.b50.current.ascii y se pueden convertir a formato de texto para nuestro uso.

Manejo de datos de series de tiempo

Para manejar datos de series de tiempo, deberá realizar los siguientes pasos:

El primer paso consiste en importar los siguientes paquetes:

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

A continuación, defina una función que leerá los datos del archivo de entrada, como se muestra en el código que se proporciona a continuación:

def read_data(input_file):
   input_data = np.loadtxt(input_file, delimiter = None)

Ahora, convierta estos datos en series de tiempo. Para ello, cree el rango de fechas de nuestra serie temporal. En este ejemplo, mantenemos un mes como frecuencia de datos. Nuestro archivo tiene los datos que comienzan en enero de 1950.

dates = pd.date_range('1950-01', periods = input_data.shape[0], freq = 'M')

En este paso, creamos los datos de la serie temporal con la ayuda de Pandas Series, como se muestra a continuación:

output = pd.Series(input_data[:, index], index = dates)	
return output
	
if __name__=='__main__':

Ingrese la ruta del archivo de entrada como se muestra aquí -

input_file = "/Users/admin/AO.txt"

Ahora, convierta la columna al formato de serie temporal, como se muestra aquí:

timeseries = read_data(input_file)

Finalmente, trace y visualice los datos, utilizando los comandos que se muestran:

plt.figure()
timeseries.plot()
plt.show()

Observará las parcelas como se muestra en las siguientes imágenes:

Cortar datos de series de tiempo

La división implica recuperar solo una parte de los datos de la serie temporal. Como parte del ejemplo, estamos dividiendo los datos solo de 1980 a 1990. Observe el siguiente código que realiza esta tarea:

timeseries['1980':'1990'].plot()
   <matplotlib.axes._subplots.AxesSubplot at 0xa0e4b00>

plt.show()

Cuando ejecuta el código para cortar los datos de la serie de tiempo, puede observar el siguiente gráfico como se muestra en la imagen aquí:

Extracción de estadísticas de datos de series temporales

Tendrá que extraer algunas estadísticas de un dato dado, en los casos en que necesite sacar alguna conclusión importante. Media, varianza, correlación, valor máximo y valor mínimo son algunas de estas estadísticas. Puede utilizar el siguiente código si desea extraer dichas estadísticas de una serie de datos determinada:

Media

Puedes usar el mean() función, para encontrar la media, como se muestra aquí -

timeseries.mean()

Entonces, la salida que observará para el ejemplo discutido es:

-0.11143128165238671

Máximo

Puedes usar el max() función, para encontrar el máximo, como se muestra aquí -

timeseries.max()

Entonces, la salida que observará para el ejemplo discutido es:

3.4952999999999999

Mínimo

Puede usar la función min (), para encontrar el mínimo, como se muestra aquí -

timeseries.min()

Entonces, la salida que observará para el ejemplo discutido es:

-4.2656999999999998

Conseguir todo a la vez

Si desea calcular todas las estadísticas a la vez, puede utilizar el describe() funciona como se muestra aquí -

timeseries.describe()

Entonces, la salida que observará para el ejemplo discutido es:

count   817.000000
mean     -0.111431
std       1.003151
min      -4.265700
25%      -0.649430
50%      -0.042744
75%       0.475720
max       3.495300
dtype: float64

Re-muestreo

Puede volver a muestrear los datos a una frecuencia de tiempo diferente. Los dos parámetros para realizar un nuevo muestreo son:

  • Periodo de tiempo
  • Method

Re-muestreo con media ()

Puede usar el siguiente código para volver a muestrear los datos con el método mean (), que es el método predeterminado:

timeseries_mm = timeseries.resample("A").mean()
timeseries_mm.plot(style = 'g--')
plt.show()

Luego, puede observar el siguiente gráfico como el resultado del remuestreo usando mean () -

Re-muestreo con mediana ()

Puede utilizar el siguiente código para volver a muestrear los datos utilizando el median()método -

timeseries_mm = timeseries.resample("A").median()
timeseries_mm.plot()
plt.show()

Luego, puede observar el siguiente gráfico como el resultado del remuestreo con mediana () -

Media rodante

Puede usar el siguiente código para calcular la media rodante (en movimiento):

timeseries.rolling(window = 12, center = False).mean().plot(style = '-g')
plt.show()

Luego, puede observar el siguiente gráfico como la salida de la media rodante (en movimiento):

Análisis de datos secuenciales mediante el modelo de Markov oculto (HMM)

HMM es un modelo estadístico que se usa ampliamente para datos que tienen continuación y extensibilidad, como análisis de mercado de valores de series de tiempo, chequeo médico y reconocimiento de voz. Esta sección trata en detalle con el análisis de datos secuenciales utilizando el modelo de Markov oculto (HMM).

Modelo de Markov oculto (HMM)

HMM es un modelo estocástico que se basa en el concepto de cadena de Markov basado en el supuesto de que la probabilidad de estadísticas futuras depende solo del estado actual del proceso en lugar de cualquier estado que lo precedió. Por ejemplo, al lanzar una moneda, no podemos decir que el resultado del quinto lanzamiento será una cara. Esto se debe a que una moneda no tiene memoria y el siguiente resultado no depende del resultado anterior.

Matemáticamente, HMM consta de las siguientes variables:

Estados (S)

Es un conjunto de estados ocultos o latentes presentes en un HMM. Está denotado por S.

Símbolos de salida (O)

Es un conjunto de posibles símbolos de salida presentes en un HMM. Se denota por O.

Matriz de probabilidad de transición de estado (A)

Es la probabilidad de hacer la transición de un estado a cada uno de los otros estados. Está denotado por A.

Matriz de probabilidad de emisión de observación (B)

Es la probabilidad de emitir / observar un símbolo en un estado particular. Está denotado por B.

Matriz de probabilidad previa (Π)

Es la probabilidad de comenzar en un estado particular desde varios estados del sistema. Se denota por Π.

Por tanto, un HMM se puede definir como = (S,O,A,B,),

dónde,

  • S = {s1,s2,…,sN} es un conjunto de N estados posibles,
  • O = {o1,o2,…,oM} es un conjunto de M posibles símbolos de observación,
  • A es un NN Matriz de probabilidad de transición de estado (TPM),
  • B es un NM Matriz de probabilidad de observación o emisión (EPM),
  • π es un vector de distribución de probabilidad de estado inicial N dimensional.

Ejemplo: análisis de datos del mercado de valores

En este ejemplo vamos a analizar los datos del mercado de valores, paso a paso, para tener una idea de cómo funciona el HMM con datos secuenciales o de series de tiempo. Tenga en cuenta que estamos implementando este ejemplo en Python.

Importe los paquetes necesarios como se muestra a continuación:

import datetime
import warnings

Ahora, use los datos del mercado de valores del matpotlib.finance paquete, como se muestra aquí -

import numpy as np
from matplotlib import cm, pyplot as plt
from matplotlib.dates import YearLocator, MonthLocator
try:
   from matplotlib.finance import quotes_historical_yahoo_och1
except ImportError:
   from matplotlib.finance import (
      quotes_historical_yahoo as quotes_historical_yahoo_och1)

from hmmlearn.hmm import GaussianHMM

Cargue los datos de una fecha de inicio y una fecha de finalización, es decir, entre dos fechas específicas como se muestra aquí -

start_date = datetime.date(1995, 10, 10)
end_date = datetime.date(2015, 4, 25)
quotes = quotes_historical_yahoo_och1('INTC', start_date, end_date)

En este paso, extraeremos las cotizaciones de cierre todos los días. Para esto, use el siguiente comando:

closing_quotes = np.array([quote[2] for quote in quotes])

Ahora, extraeremos el volumen de acciones negociadas todos los días. Para esto, use el siguiente comando:

volumes = np.array([quote[5] for quote in quotes])[1:]

Aquí, tome la diferencia porcentual de los precios de cierre de las acciones, utilizando el código que se muestra a continuación:

diff_percentages = 100.0 * np.diff(closing_quotes) / closing_quotes[:-]
dates = np.array([quote[0] for quote in quotes], dtype = np.int)[1:]
training_data = np.column_stack([diff_percentages, volumes])

En este paso, cree y entrene el HMM gaussiano. Para ello, utilice el siguiente código:

hmm = GaussianHMM(n_components = 7, covariance_type = 'diag', n_iter = 1000)
with warnings.catch_warnings():
   warnings.simplefilter('ignore')
   hmm.fit(training_data)

Ahora, genere datos usando el modelo HMM, usando los comandos que se muestran:

num_samples = 300
samples, _ = hmm.sample(num_samples)

Finalmente, en este paso, graficamos y visualizamos el porcentaje de diferencia y el volumen de acciones negociadas como salida en forma de gráfico.

Utilice el siguiente código para trazar y visualizar los porcentajes de diferencia:

plt.figure()
plt.title('Difference percentages')
plt.plot(np.arange(num_samples), samples[:, 0], c = 'black')

Utilice el siguiente código para trazar y visualizar el volumen de acciones negociadas:

plt.figure()
plt.title('Volume of shares')
plt.plot(np.arange(num_samples), samples[:, 1], c = 'black')
plt.ylim(ymin = 0)
plt.show()