Trabajando con series de tiempo en pandas
Índice de contenido
Resumen:
En esta entrada, se aprenderán los conceptos básicos de la manipulación de datos de series temporales. En este sentido, los datos de series temporales son datos indexados por una secuencia de fechas u horas. Así pues, se aprenderán a usar métodos integrados en pandas para trabajar con dichos índices. También se aprenderá a muestrear series de tiempo para cambiar la frecuencia. La presente entrada también mostrará cómo calcular valores móviles y acumulativos para series temporales. Finalmente, se utilizarán las nuevas habilidades adquiridas para crear un índice bursátil ponderado por valor a partir de datos bursátiles reales.
¿Cómo citar el presente artículo?
Romero, J. (1 de enero de 2016). Trabajando con series de tiempo en pandas. Python.JeshuaRomeroGuadarrama. https://www.Python.jeshuaromeroguadarrama.com/es/blog/data-science-with-python/data-science-with-python/python-basics/.
Trabajando con series de tiempo en pandas by Jeshua Romero Guadarrama, available under Attribution 4.0 International (CC BY 4.0) at https://www.Python.jeshuaromeroguadarrama.com/es/blog/data-science-with-python/data-science-with-python/python-basics/.
Trabajando con series de tiempo en pandas
Cómo usar fechas y horas con pandas
La presente entrada sienta las bases para aprovechar el poderoso abanico de funciones disponibles en pandas para manipular y analizar series de tiempo, lo cual se debe a la forma en que pandas representa las fechas, en particular por el DateTimeIndex
. Se aprenderá cómo crear y manipular información de fechas y series temporales, así como hacer cálculos con DataFrames siendo conscientes del tiempo. Asimismo, se explicará cómo transformar los datos de tiempo y calcular rendimientos específicos a partir de ciertos períodos.
- Cómo usar fechas y horas con pandas
En esta entrada, se aprenderá sobre el uso de fechas con la paquetería pandas de Python.
En este contexto, pandas fue desarrollado para analizar datos financieros que a menudo vienen como series de tiempo.
En consecuencia, pandas tiene poderosas funciones para hacer su vida más fácil.
- Funciones para series con fecha y hora
La clave para manipular series de tiempo son los tipos de datos adaptados como datetime
.
En otros términos, el secreto para dominar las series de tiempo consiste en la correcta gestión de la información que se encuentra en el formato de fechas y horas (tipos de datos que representan puntos en el tiempo o períodos de tiempo).
Así pues, los DataFrames disponibles en Python tienen atributos y métodos que permiten acceder y manipular la dimensión temporal de los datos.
Cualquier columna puede contener información sobre fechas u horas, pero resulta mucho más razonable visualizarla como el índice de un DataFrame, ya que convierte todo el DataFrame en una serie temporal.
Por lo tanto, se deben emplear métodos especiales en aquellos DataFrames que almacenen las fechas en el índice para aprovechar la información brindada.
- Bloque de construcción básico:
pd.Timestamp
En primer lugar, se necesita echar un vistazo a los tipos de datos pd.Timestamp
(marca temporal de pandas).
Usando la biblioteca de pandas, así como la clase datetime
incorporada de python, se puede crear un TimeStamp
de pandas.
También se puede usar una cadena de fechas en lugar de un objeto datetime
, ambos producen el mismo resultado.
# Importar pandas como pd:
import pandas as pd
# Importar datetime de la librería datetime para crear fechas manualmente:
from datetime import datetime
# Crear un Timestamp de pandas a partir de la función datetime():
TimeStamp = pd.Timestamp(datetime(2010, 1, 1))
# Crear un Timestamp de pandas a partir de una cadena de fechas:
pd.Timestamp('2010-01-01') == TimeStamp
True
Si se imprimen las marcas temporales (los objetos pd.TimeStamp
), se puede notar que la hora se ha establecido automáticamente en la medianoche.
# Mostrar la variable TimeStamp:
print(TimeStamp)
2010-01-01 00:00:00
- Bloque de construcción básico:
pd.Timestamp
Los TimeStamp
de pandas tienen ciertos atributos para acceder a varios aspectos de tiempo de los datos; por ejemplo, se puede recuperar el año o el nombre del día de la semana.
# Mostrar el año de la variable TimeStamp:
TimeStamp.year
# Mostrar el día de la semana de la variable TimeStamp:
2010
TimeStamp.day_name()
'Friday'
De igual forma, pandas también tiene un tipo de datos para períodos de tiempo.
- Más bloques de construcción:
pd.Period
yfreq
El objeto pd.period
siempre tiene una frecuencia, con meses por defecto.
# Construir un objeto de tipo pd.Period:
Periodo = pd.Period('2010-01')
# Mostrar la variable Periodo:
Periodo
Period('2010-01', 'M')
También tiene un método para convertir entre frecuencias; por ejemplo, de frecuencia mensual a diaria.
# Convertir la variable Periodo de mensual a diaria:
Periodo.asfreq('D')
Period('2010-01-31', 'D')
Se puede convertir un objeto pd.Period
en un objeto pd.Timestamp
y volver a convertir un objeto pd.Timestamp
en un objeto pd.Period
.
# Construir un objeto de tipo pd.Timestamp:
TimeStamp = pd.Timestamp(datetime(2010, 1, 1))
# Construir un objeto de tipo pd.Period:
Periodo = pd.Period('2010-01')
# Convertir la variable Periodo en un objeto pd.Timestamp
# (establecer una frecuencia mensual):
Periodo.to_timestamp('M')
# Convertir la variable TimeStamp en un objeto pd.Period
# (establecer una frecuencia mensual):
Timestamp('2010-01-31 00:00:00')
TimeStamp.to_period('M')
Period('2010-01', 'M')
También puedes hacer aritmética básica de fechas.
- Aritmética básica con los bloques de construcción:
pd.Period
yfreq
Supóngase que se tiene un objeto pd.Period
para enero de 2010 con una frecuencia mensual.
Ahora bien, si se quiere tener un objeto pd.Period
con frecuencia mensual para marzo de 2010, simplemente se debe sumar un número 2 al pd.Period
de enero de 2010.
# Construir un objeto pd.Period para enero de 2010
# (establecer una frecuencia mensual):
Periodo = pd.Period('2010-01')
# Calcular un objeto pd.Period para marzo de 2010
# (establecer una frecuencia mensual):
Periodo + 2
Period('2010-03', 'M')
En versiones anteriores del paquete pandas, los objetos pd.Timestamp
podían guardar información sobre la frecuencia.
Asimismo, si se creaba un pd.Timestamp
para el 31 de enero de 2010 con una frecuencia mensual y se sumaba 1, se obtenía un pd.Timestamp
para el 28 de febrero.
# Construir un objeto pd.Timestamp para el 31 de enero de 2010
# (establecer una frecuencia mensual):
# TimeStamp = pd.Timestamp('2010-01-31', 'M')
# Calcular un objeto pd.Timestamp para el 28 de febrero de 2010
# (establecer una frecuencia mensual):
# TimeStamp + 1
- Secuencias de fechas y horas
Para crear una serie de tiempo, se necesita una secuencia de fechas.
Para crear una secuencia de objetos pd.Timestamp
, se debe usar la función de pandas date_range
. En cuyo caso, debe especificarse una fecha de inicio (start
) y una fecha de finalización (end
) o una cantidad de períodos (periods
). El valor predeterminado es una frecuencia diaria (freq = D
).
# Construir una secuencia de objetos pd.Timestamp a partir de pd.date_range.
# La función se construye como pd.date_range(start, end, periods, freq):
indice = pd.date_range(start = '2010-1-1', periods = 12, freq = 'M')
La función devuelve un pd.DateTimeindex
: Una secuencia de fechas en formato pd.Timestamp
con información sobre la frecuencia.
# Mostrar la variable indice:
indice
DatetimeIndex(['2010-01-31', '2010-02-28', '2010-03-31', '2010-04-30',
'2010-05-31', '2010-06-30', '2010-07-31', '2010-08-31',
'2010-09-30', '2010-10-31', '2010-11-30', '2010-12-31'],
dtype='datetime64[ns]', freq='M')
En este caso, el primer elemento es un objeto Timestamp
de pandas con frecuencia mensual.
# Mostrar el primer elemento de la variable indice:
indice[0]
Timestamp('2010-01-31 00:00:00', freq='M')
- Convertir las secuencias de fechas y horas
Se puede convertir un objeto pd.DateTimeindex
en un pd.Period
, al igual que podría convertirse un objeto pd.Timestamp
en un pd.Period
.
# Convertir la variable indice de un objeto pd.DateTimeindex a un pd.Period:
indice.to_period()
PeriodIndex(['2010-01', '2010-02', '2010-03', '2010-04', '2010-05', '2010-06',
'2010-07', '2010-08', '2010-09', '2010-10', '2010-11', '2010-12'],
dtype='period[M]')
Ahora bien, se puede crear una serie temporal configurando DateTimeIndex
como el índice de un DataFrame.
# Crear una serie de tiempo a partir de un DataFrame.
# Configurar el índice del DataFrame haciendo uso de la variable indice:
pd.DataFrame({'data': indice})
data
0 2010-01-31
1 2010-02-28
2 2010-03-31
3 2010-04-30
4 2010-05-31
5 2010-06-30
6 2010-07-31
7 2010-08-31
8 2010-09-30
9 2010-10-31
10 2010-11-30
11 2010-12-31
- Crea una serie temporal:
pd.DateTimeIndex
Como se puede visualizar, a las columnas de un DataFrame que contienen fechas se les asigna el tipo de dato ‘datetime64[ns]
’, donde ‘ns
’ significa nanosegundos.
# Crear una serie de tiempo a partir de un DataFrame.
# Configurar el índice del DataFrame haciendo uso de la variable indice:
pd.DataFrame({'data': indice}).info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12 entries, 0 to 11
Data columns (total 1 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 data 12 non-null datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 224.0 bytes
- Crea una serie temporal:
pd.DateTimeIndex
Finalmente, se crearán 12 filas con dos columnas de datos aleatorios para que coincidan con el DateTimeindex
. Se proporcionan las fechas a la función que construye el DataFrame y se habrá creado la primera serie temporal con 12 marcas de tiempo mensuales. Finalmente, pandas permite crear y convertir los datos temporales entre muchas frecuencias diferentes.
# Importar numpy como np:
import numpy as np
# Crear una matriz de 12 filas y 2 columnas con números aleatorios entre 0 y 1:
datos = np.random.random(size = (12, 2))
# Crear una serie de tiempo a partir de un DataFrame.
# Configurar el DataFrame a partir de los datos aleatorios:
pd.DataFrame(data = datos, index = indice).info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 12 entries, 2010-01-31 to 2010-12-31
Freq: M
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 0 12 non-null float64
1 1 12 non-null float64
dtypes: float64(2)
memory usage: 288.0 bytes
- Alias de frecuencia e información sobre tiempo
A continuación, se muestran los alias más importantes. Algunos también pueden establecerse al principio o al final de un pd.Period
(o utilizar períodos comerciales en lugar de períodos de calendario). También hay numerosos atributos de pd.Timestamp
.
Hay muchos alias de frecuencia además de 'M'
y 'D'
:
Periodo | Alias |
---|---|
Hora | H |
Día | D |
Semana | W |
Mes | M |
Trimestre | Q |
Año | A |
Estos pueden diferenciarse aún más por el comienzo/final del período, o la definición específica del negocio.
También se puede acceder a las diferentes atributos de pd.Timestamp()
mediante los siguientes comandos:
Atributo |
---|
.second, .minute, .hour |
.day, .month, .quarter, .year |
.weekday |
.dayofweek |
.weekofyear |
.dayofyear |
- ¡A practicar!
¡Es momento de practicar las nuevas habilidades relacionadas con las series de tiempo!
Tu primera serie temporal
Se ha aprendido sobre cómo crear una secuencia de fechas usando pd.date_range()
. También se ha visto que cada fecha en la iteración sobre pd.DatetimeIndex
es un pd.Timestamp
con varios atributos a los que se puede acceder para obtener información sobre la fecha.
Ahora, se creará una semana de datos, iterando el resultado y obteniendo los atributos dayofweek
y day_name()
para cada fecha.
Problema
- Importar
pandas
comopd
. - Usar
pd.date_range()
para crear siete fechas a partir de'2017-1-1'
con una frecuencia diaria (predeterminada). Utilizar los argumentosstart
yperiods
. - Asignar el resultado a
siete_dias
. - Iterar sobre cada fecha en
siete_dias
y, en cada iteración, imprimir los atributos.dayofweek
y.day_name()
.
Usar el argumento periods
para especificar la cantidad de períodos que se desean en el rango de fechas.
Acceder a los atributos de dia
usando .
. Por ejemplo, dia.month
devuelve el atributo month
de dia
.
# Importar pandas como pd:
import pandas as pd
# Crear el rango de fechas:
siete_dias = pd.date_range('2017-1-1', '2017-1-7', 7)
# Iterar sobre las fechas e imprimir el número y el nombre del día de la semana:
for dia in siete_dias:
print(dia.dayofweek, dia.day_name())
6 Sunday
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
¡Felicitaciones! ¡Se acaba de crear la primera serie temporal!
Indexación y remuestreo de series temporales
Es momento de aprender sobre los métodos y transformaciones básicos de series de tiempo.
- Transformación de series de tiempo
Estos métodos básicos incluyen: analizar las fechas proporcionadas como cadenas y convertir el resultado en el tipo de datos de pandas correspondiente llamado datetime64
. También incluyen la selección de subperíodos de su serie temporal y la configuración o el cambio de la frecuencia de DateTimeIndex
.
Se puede cambiar la frecuencia a un valor mayor o menor:
- El sobremuestreo implica aumentar la frecuencia de tiempo, lo que requiere generar nuevos datos.
- La reducción de muestreo significa disminuir la frecuencia de tiempo, lo que requiere agregar menos datos.
Se hablará de esto en la próxima entrada.
- Obtener los precios de las acciones de GOOG
El primer conjunto de datos es una serie temporal con dos años de cotizaciones diarias de acciones de Google.
A menudo se tiene que lidiar con fechas que son de tipo objeto o cadena. Se puede Notará una columna llamada ‘fecha’ que es del tipo de datos ‘objeto’. Sin embargo, cuando imprime las primeras filas con el método de cabeza de punto, ve que contiene fechas. Para convertir las cadenas al tipo de datos correcto,
Convertir cadenas de fechas a datetime64 pandas tiene la función to_datetime. Simplemente pase una columna o serie de datos a esta función, y analizará la cadena como tipo datetime64. Ahora puede configurar el
Convertir cadenas de fechas a datetime64 columna ‘reparada’ como índice usando set_index. El DateTimeIndex resultante le permite tratar todo el DataFrame como datos de series temporales. Trazar el precio de las acciones muestra que a Google le ha ido bien durante los dos años.
Trazado de la serie temporal de acciones de Google También muestra que con un DateTimeIndex, pandas crea automáticamente etiquetas de fecha razonablemente espaciadas para el eje x. Para seleccionar subconjuntos de su serie temporal,
Indexación parcial de cadenas puede usar cadenas que representen una fecha completa o partes relevantes de una fecha. Si solo pasa una cadena que representa un año, pandas devuelve todas las fechas dentro de este año. Si pasa una porción que comienza con un mes y termina con otro, obtiene todas las fechas dentro de ese rango. Tenga en cuenta que el intervalo de fechas incluirá la fecha de finalización, a diferencia de otros intervalos en Python.
Indexación parcial de cadenas También puede usar dot-loc[] con una fecha completa y una etiqueta de columna para seleccionar un precio de acción específico.
.asfreq(): establecer frecuencia Es posible que haya notado que nuestro DateTimeIndex no tenía información de frecuencia. Puede configurar la información de frecuencia usando dot-asfreq. El alias ‘D’ significa frecuencia de días calendario. Como resultado, DateTimeIndex ahora contiene muchas fechas en las que no se compraron ni vendieron acciones.
.asfreq(): establecer frecuencia Estas nuevas fechas tienen valores faltantes. Esto también se denomina sobremuestreo, porque el nuevo DataFrame tiene una frecuencia más alta que la versión original. En el próximo capítulo, aprenderá a crear puntos de datos para los valores faltantes.
.asfreq(): reinicia la frecuencia También puede convertir el DateTimeIndex a la frecuencia de los días hábiles. Pandas tiene una lista de días comúnmente considerados hábiles. El alias para la frecuencia de los días hábiles es ‘B’. Ahora verá un número menor de fechas adicionales creadas.
.asfreq(): reinicia la frecuencia Puede usar el método dot-isnull para seleccionar los valores que faltan y verificar qué fechas se consideran días hábiles, pero no tienen precios de acciones porque no se negociaron acciones.
¡A practicar! Ahora practiquemos sus nuevas habilidades de series de tiempo.
popular post
El modelo AR de series temporales univariadas
Resumen: En esta entrada, descubrirá el modelo AR: El modelo autorregresivo.
Leer másEvaluación de modelos para pronosticar
Resumen: Al desarrollar modelos de aprendizaje automático, generalmente se comparan varios modelos durante la fase de construcción.
Leer másModelos para pronosticar
Resumen: El pronóstico, traducido groseramente como la tarea de predecir el futuro, ha estado presente en la sociedad humana durante siglos.
Leer más