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 pandas
biblioteca, que ofrece mucha flexibilidad a la hora de manipular datos, y la statsmodels
biblioteca, 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 pandas
y statsmodels
con 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 timeseries
y luego pasaremos al directorio. Si llama al proyecto con un nombre diferente, asegúrese de sustituir su nombre en timeseries
toda la guía.
mkdir timeseries cd timeseries
Ahora podemos instalar pandas
, statsmodels
y 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 pandas
y statsmodels
.
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:
Esto abrirá un cuaderno que nos permite cargar las bibliotecas requeridas (observe las abreviaturas estándar que se usan para hacer referencia pandas
, matplotlib
y 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 + ENTER
para ejecutar el código y pasar a un nuevo bloque de código dentro de su computadora portátil.
Convenientemente, statsmodels
viene 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:
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 pandas
DataFrame. 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:
El dtype=datetime[ns]
campo confirma que nuestro índice está hecho de objetos de sello de fecha, mientras que length=2284
y 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 resample
funció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 MS
significa que agrupamos los datos en depósitos por meses y asegura que estamos usando el inicio de cada mes como marca de tiempo:
Una característica interesante de pandas
es 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
:
O podemos dividir nuestro conjunto de datos para recuperar solo puntos de datos entre octubre 1995
y 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:
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 pandas
usando 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ó:
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 pandas
contenedor alrededor de la matplotlib
API para mostrar un gráfico de nuestro conjunto de datos:
y.plot(figsize=(15, 6)) plt.show()
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, statsmodels
proporciona la seasonal_decompose
funció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_decompose
devuelve 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()
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 pandas
o utilizar el conjunto de datos sunspots
que viene pre-cargado con la statsmodels
biblioteca: data = sm.datasets.sunspots.load_pandas().data
.