Visualización de series temporales con Python 3


El análisis de series de tiempo pertenece a una rama de la estadística que implica el estudio de datos ordenados, a menudo temporales. Cuando se aplica de manera relevante, el análisis de series de tiempo puede revelar tendencias inesperadas, extraer estadísticas útiles e incluso pronosticar tendencias en el futuro. Por estas razones, se aplica en muchos campos, incluidos la economía, la previsión meteorológica y la planificación de la capacidad, por nombrar algunos.

En este tutorial, presentaremos algunas técnicas comunes utilizadas en el análisis de series de tiempo y recorreremos los pasos iterativos necesarios para manipular y visualizar datos de series de tiempo.

Para este tutorial, usaremos Jupyter Notebook para trabajar con los datos. Si aún no lo tiene, debe seguir nuestro tutorial para instalar y configurar Jupyter Notebook para Python 3 .

Instalación de paquetes

Aprovecharemos la pandasbiblioteca, que ofrece mucha flexibilidad a la hora de manipular datos, y la statsmodelsbiblioteca, que nos permite realizar cálculos estadísticos en Python. Utilizadas juntas, estas dos bibliotecas amplían Python para ofrecer una mayor funcionalidad y aumentar significativamente nuestro conjunto de herramientas analíticas.

Al igual que con otros paquetes de Python, podemos instalar pandasy statsmodelscon pip. Primero, pasemos a nuestro entorno de programación local o entorno de programación basado en servidor:


 cd environments 

 . my_env/bin/activate 

Desde aquí, creemos un nuevo directorio para nuestro proyecto. Lo llamaremos timeseriesy luego pasaremos al directorio. Si llama al proyecto con un nombre diferente, asegúrese de sustituir su nombre en timeseriestoda la guía.


 mkdir timeseries 
 cd timeseries 

Ahora podemos instalar pandas, statsmodelsy el paquete de trazado de datos matplotlib. También se instalarán sus dependencias:


 pip install pandas statsmodels matplotlib 

En este punto, estamos listos para comenzar a trabajar con pandasy statsmodels.

Carga de datos de series de tiempo

Para comenzar a trabajar con nuestros datos, iniciaremos Jupyter Notebook:


 jupyter notebook 

Para crear un nuevo archivo de cuaderno, seleccione Nuevo > Python 3 en el menú desplegable de la parte superior derecha:

Crea un nuevo cuaderno de Python 3

Esto abrirá un cuaderno que nos permite cargar las bibliotecas requeridas (observe las abreviaturas estándar que se usan para hacer referencia pandas, matplotliby statsmodels). En la parte superior de nuestro cuaderno, debemos escribir lo siguiente:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

Después de cada bloque de código en este tutorial, debe escribir ALT + ENTERpara ejecutar el código y pasar a un nuevo bloque de código dentro de su computadora portátil.

Convenientemente, statsmodelsviene con conjuntos de datos integrados, por lo que podemos cargar un conjunto de datos de series de tiempo directamente en la memoria.

Trabajaremos con un conjunto de datos llamado «CO2 atmosférico de muestras de aire continuo en el Observatorio Mauna Loa, Hawái, EE. UU.», Que recolectó muestras de CO2 desde marzo de 1958 hasta diciembre de 2001. Podemos traer estos datos de la siguiente manera:

data = sm.datasets.co2.load_pandas()
co2 = data.data

Veamos cómo se ven las primeras 5 líneas de nuestros datos de series de tiempo:

print(co2.head(5))

       
        Output
                     co2
1958-03-29  316.1
1958-04-05  317.3
1958-04-12  317.6
1958-04-19  317.5
1958-04-26  316.4

Con nuestros paquetes importados y el conjunto de datos de CO2 listo para usar, podemos pasar a indexar nuestros datos.

Indexación con datos de series de tiempo

Es posible que haya notado que las fechas se han establecido como el índice de nuestro pandasDataFrame. Cuando trabajemos con datos de series de tiempo en Python, debemos asegurarnos de que las fechas se usen como índice, así que asegúrese de verificarlo siempre, lo que podemos hacer ejecutando lo siguiente:

co2.index

       
        Output
       DatetimeIndex(['1958-03-29', '1958-04-05', '1958-04-12', '1958-04-19',
               '1958-04-26', '1958-05-03', '1958-05-10', '1958-05-17',
               '1958-05-24', '1958-05-31',
               ...
               '2001-10-27', '2001-11-03', '2001-11-10', '2001-11-17',
               '2001-11-24', '2001-12-01', '2001-12-08', '2001-12-15',
               '2001-12-22', '2001-12-29'],
              dtype='datetime64[ns]', length=2284, freq='W-SAT')

El dtype=datetime[ns]campo confirma que nuestro índice está hecho de objetos de sello de fecha, mientras que length=2284y freq='W-SAT'nos dice que tenemos 2284 sellos de fecha semanales a partir de los sábados.

Puede ser complicado trabajar con datos semanales, así que usemos los promedios mensuales de nuestra serie temporal. Esto se puede obtener utilizando la resamplefunción conveniente , que nos permite agrupar la serie de tiempo en cubos (1 mes), aplicar una función en cada grupo (media) y combinar el resultado (una fila por grupo).

y = co2['co2'].resample('MS').mean()

Aquí, el término MSsignifica que agrupamos los datos en depósitos por meses y asegura que estamos usando el inicio de cada mes como marca de tiempo:

y.head(5)

       
        Output
       1958-03-01    316.100
1958-04-01    317.200
1958-05-01    317.120
1958-06-01    315.800
1958-07-01    315.625
Freq: MS, Name: co2, dtype: float64

Una característica interesante de pandases su capacidad para manejar índices de sello de fecha, lo que nos permite dividir rápidamente nuestros datos. Por ejemplo, podemos dividir nuestro conjunto de datos para recuperar solo los puntos de datos que vienen después del año 1990:

y['1990':]

       
        Output
       1990-01-01    353.650
1990-02-01    354.650
               ...   
2001-11-01    369.375
2001-12-01    371.020
Freq: MS, Name: co2, dtype: float64

O podemos dividir nuestro conjunto de datos para recuperar solo puntos de datos entre octubre 1995y octubre 1996:

y['1995-10-01':'1996-10-01']

       
        Output
       1995-10-01    357.850
1995-11-01    359.475
1995-12-01    360.700
1996-01-01    362.025
1996-02-01    363.175
1996-03-01    364.060
1996-04-01    364.700
1996-05-01    365.325
1996-06-01    364.880
1996-07-01    363.475
1996-08-01    361.320
1996-09-01    359.400
1996-10-01    359.625
Freq: MS, Name: co2, dtype: float64

Con nuestros datos correctamente indexados para trabajar con datos temporales, podemos pasar al manejo de valores que pueden faltar.

Manejo de valores perdidos en datos de series de tiempo

Los datos del mundo real tienden a ser confusos. Como podemos ver en el gráfico, no es raro que los datos de series de tiempo contengan valores perdidos. La forma más sencilla de verificarlos es trazando directamente los datos o usando el comando a continuación que revelará los datos faltantes en la salida:

y.isnull().sum()

       
        Output
       5

Esta salida nos dice que hay 5 meses con valores perdidos en nuestra serie de tiempo.

Generalmente, deberíamos “completar” los valores faltantes si no son demasiado numerosos para que no tengamos lagunas en los datos. Podemos hacer esto pandasusando el fillna()comando . Para simplificar, podemos completar los valores perdidos con el valor no nulo más cercano en nuestra serie de tiempo, aunque es importante tener en cuenta que a veces sería preferible una media móvil.

y = y.fillna(y.bfill())

Con los valores faltantes completados, podemos verificar una vez más si existen valores nulos para asegurarnos de que nuestra operación funcionó:

y.isnull().sum()

       
        Output
       0

Después de realizar estas operaciones, vemos que hemos completado con éxito todos los valores faltantes en nuestra serie de tiempo.

Visualización de datos de series de tiempo

Cuando se trabaja con datos de series de tiempo, se pueden revelar muchas cosas mediante su visualización. Algunas cosas a tener en cuenta son:

  • estacionalidad : ¿los datos muestran un patrón periódico claro?
  • Tendencia : ¿los datos siguen una pendiente constante hacia arriba o hacia abajo?
  • ruido : ¿hay puntos atípicos o valores perdidos que no son consistentes con el resto de los datos?

Podemos usar el pandascontenedor alrededor de la matplotlibAPI para mostrar un gráfico de nuestro conjunto de datos:

y.plot(figsize=(15, 6))
plt.show()
Visualización de series temporales Figura 1

Aparecen algunos patrones distinguibles cuando graficamos los datos. La serie temporal tiene un patrón de estacionalidad obvio, así como una tendencia general creciente. También podemos visualizar nuestros datos usando un método llamado descomposición de series de tiempo. Como sugiere su nombre, la descomposición de series de tiempo nos permite descomponer nuestra serie de tiempo en tres componentes distintos: tendencia, estacionalidad y ruido.

Afortunadamente, statsmodelsproporciona la seasonal_decomposefunción conveniente para realizar la descomposición estacional de forma inmediata. Si está interesado en obtener más información, la referencia para su implementación original se puede encontrar en el siguiente documento, » STL: Un procedimiento de descomposición de tendencia estacional basado en Loess «.

El siguiente script muestra cómo realizar la descomposición estacional de series de tiempo en Python. De forma predeterminada, seasonal_decomposedevuelve una figura de tamaño relativamente pequeño, por lo que las dos primeras líneas de este fragmento de código aseguran que la figura de salida sea lo suficientemente grande para que podamos visualizarla.

from pylab import rcParams
rcParams['figure.figsize'] = 11, 9

decomposition = sm.tsa.seasonal_decompose(y, model='additive')
fig = decomposition.plot()
plt.show()
Visualización de descomposición de tendencias estacionales de series temporales Figura 2

El uso de la descomposición de series de tiempo facilita la identificación rápida de una media cambiante o una variación en los datos. El gráfico anterior muestra claramente la tendencia al alza de nuestros datos, junto con su estacionalidad anual. Estos se pueden utilizar para comprender la estructura de nuestra serie temporal. La intuición detrás de la descomposición de series de tiempo es importante, ya que muchos métodos de pronóstico se basan en este concepto de descomposición estructurada para producir pronósticos.

Si ha seguido este post, ahora tiene experiencia visualizando y manipulando datos de series de tiempo en Python.

Para mejorar aún más su conjunto de habilidades, puede cargar otro conjunto de datos y repetir todos los pasos vistos, como por ejemplo, es posible que desee leer un archivo CSV con la biblioteca pandaso utilizar el conjunto de datos sunspotsque viene pre-cargado con la statsmodels biblioteca: data = sm.datasets.sunspots.load_pandas().data.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.