El formateo de fechas es una parte esencial de la visualización de datos, especialmente cuando se trabaja con series temporales.
Matplotlib, una de las bibliotecas más populares para la creación de gráficos en Python, ofrece herramientas flexibles para personalizar cómo se muestran las fechas en los gráficos.
Utilizando DateFormatter y los códigos de formato de strftime, puedes adaptar la presentación de las fechas para que se ajusten a las necesidades específicas de tu análisis o presentación.
A continuación, exploramos cómo se utiliza el formato '%b %Y' y otras opciones comunes para formatear fechas.
¿Qué hace '%b %Y'?
%b: Representa el mes abreviado en texto (por ejemplo, 'Jan', 'Feb', 'Mar', etc.). Este formato es útil cuando se quiere mostrar el mes de manera compacta.
%Y: Representa el año en cuatro dígitos (por ejemplo, '2023', '2024'). Esto proporciona una indicación clara y completa del año.
Cuando se utiliza '%b %Y' en el DateFormatter, cada etiqueta del eje x se formatea como Mes Año. Por ejemplo, una fecha que corresponde a enero de 2023 se mostrará como 'Jan 2023'.
Otras Formas de Dar Formato a Fechas con %:
Matplotlib, a través de DateFormatter, permite una amplia personalización de cómo se muestran las fechas y horas utilizando códigos de formato de fecha y hora basados en el estándar de strftime. Aquí algunos ejemplos comunes:
%d: Día del mes como número decimal (por ejemplo, '01', '15').
%B: Nombre completo del mes (por ejemplo, 'January', 'February').
%m: Mes como número decimal con ceros a la izquierda (por ejemplo, '01' para enero, '12' para diciembre).
%y: Año como número de dos dígitos (por ejemplo, '23' para 2023).
%H: Hora en formato de 24 horas (por ejemplo, '14' para las 2 PM).
%I: Hora en formato de 12 horas (por ejemplo, '02' para las 2 PM).
%p: AM o PM.
%M: Minuto con ceros a la izquierda (por ejemplo, '05').
%S: Segundo con ceros a la izquierda (por ejemplo, '09').
%A: Nombre completo del día de la semana (por ejemplo, 'Monday', 'Tuesday').
%a: Nombre abreviado del día de la semana (por ejemplo, 'Mon', 'Tue').
Al comprender y utilizar estos formatos, puedes mejorar la claridad y la estética de tus visualizaciones, asegurando que la información temporal se comunique de manera efectiva.
Definitivamente la musica estorba, por favor no la pongan!!
El manejo de **series temporales** es fundamental cuando trabajamos con datos que incluyen fechas y tiempos. **Pandas** proporciona herramientas poderosas para manipular, analizar y visualizar series temporales de manera eficiente. Aquí te explico las operaciones clave que puedes realizar con **Pandas** para trabajar con datos de tipo temporal.
### 1. **Creación de Series Temporales**
#### Crear una serie de fechas:
Puedes crear una serie de fechas usando pd.date\_range().
import pandas as pd
\# Crear una serie de fechas desde el 1 de enero de 2023, con 10 días de frecuencia
fechas = pd.date\_range(start='2023-01-01', periods=10, freq='D')print(fechas)
#### Crear un DataFrame con una columna de fechas:
\# Crear un DataFrame con fechas y datos
data = pd.DataFrame({  'fecha': pd.date\_range('2023-01-01', periods=10, freq='D'),  'valor': range(10)})print(data)
### 2. **Conversión de Fechas (Datetime)**
Si tienes una columna de fechas como texto, puedes convertirla a formato **datetime** usando pd.to\_datetime().
\# Crear un DataFrame con fechas como cadenas
data = pd.DataFrame({  'fecha': \['2023-01-01', '2023-01-02', '2023-01-03'],  'valor': \[10, 20, 30]})\# Convertir la columna 'fecha' a formato datetime
data\['fecha']= pd.to\_datetime(data\['fecha'])print(data.dtypes)
### 3. **Indexación y Selección por Fechas**
Cuando trabajas con series temporales, a menudo querrás usar las fechas como índice. Esto facilita la selección de datos basados en intervalos de tiempo.
#### Establecer una columna de fechas como índice:
data.set\_index('fecha', inplace=True)print(data)
#### Selección de datos por fecha:
\# Seleccionar datos de una fecha específica
print(data.loc\['2023-01-02'])
\# Seleccionar datos por rango de fechas
print(data.loc\['2023-01-01':'2023-01-03'])
### 4. **Resampling (Re-Muestreo)**
El **resampling** permite agrupar datos por diferentes frecuencias de tiempo (como días, meses, o años). Es útil para agregar, promediar o tomar la suma de datos en diferentes intervalos de tiempo.
#### Ejemplo de re-muestreo a frecuencia mensual:
\# Crear un DataFrame con datos diarios
data = pd.DataFrame({  'fecha': pd.date\_range(start='2023-01-01', periods=100, freq='D'),  'valor': range(100)})data.set\_index('fecha', inplace=True)\# Re-muestrear a frecuencia mensual y sumar los valores
data\_mensual = data.resample('M').sum()print(data\_mensual)
#### Frecuencias comunes para resampling:
- D: Día.
- M: Mes.
- Y: Año.
- H: Hora.
- T: Minuto.
### 5. **Shifting y Lagging**
El desplazamiento (shift()) se utiliza para mover datos hacia adelante o hacia atrás en el tiempo. Esto es útil para calcular diferencias entre períodos consecutivos.
#### Ejemplo de shift():
\# Desplazar los valores hacia abajo
data\['valor\_shift']= data\['valor'].shift(1)print(data)
#### Calcular la diferencia entre períodos:
\# Calcular la diferencia entre un valor y el anterior
data\['diferencia']= data\['valor']- data\['valor'].shift(1)print(data)
### 6. **Ventanas Móviles (Rolling Windows)**
Las ventanas móviles permiten aplicar funciones (como media, suma, etc.) sobre ventanas deslizantes de datos temporales.
#### Ejemplo de media móvil:
\# Calcular la media móvil de 3 díasdata\['media\_movil']= data\['valor'].rolling(window=3).mean()print(data)
### 7. **Frecuencias de Fechas Personalizadas**
Pandas permite trabajar con diferentes frecuencias de tiempo, no solo días o meses. Puedes crear series de tiempo con frecuencias personalizadas, como días laborables (B), horas (H), semanas (W), etc.
#### Ejemplo de días laborables:
\# Crear una serie temporal solo con días laborables
fechas\_laborables = pd.date\_range(start='2023-01-01', periods=10, freq='B')print(fechas\_laborables)
#### Frecuencias comunes:
- B: Días laborables.
- W: Semanas.
- H: Horas.
- T o min: Minutos.
- S: Segundos.
### 8. **Visualización de Series Temporales**
Podemos usar **Matplotlib** para visualizar datos de series temporales.
#### Ejemplo de gráfico de línea para una serie temporal:
import matplotlib.pyplot as plt
\# Crear una serie temporal con datos aleatorios
data = pd.DataFrame({  'fecha': pd.date\_range(start='2023-01-01', periods=100, freq='D'),  'valor': np.random.randn(100).cumsum()})data.set\_index('fecha', inplace=True)
\# Graficar la serie temporal
data\['valor'].plot(title='Serie Temporal')plt.xlabel('Fecha')plt.ylabel('Valor')plt.show()
### 9. **Resampling con Agregaciones Personalizadas**
Además de sumar o promediar, puedes aplicar cualquier función personalizada al re-muestrear los datos.
#### Ejemplo de re-muestreo con agregación personalizada:
\# Re-muestrear por mes y aplicar diferentes agregaciones
data\_resample = data.resample('M').agg({  'valor': \['sum', 'mean', 'max']})print(data\_resample)
### 10. **Manipulación Avanzada de Series Temporales**
#### Descomposición estacional:
Puedes descomponer una serie temporal en sus componentes estacionales, tendencia y residuales usando statsmodels.
from statsmodels.tsa.seasonal import seasonal\_decompose
\# Descomponer la serie temporal
resultado = seasonal\_decompose(data\['valor'], model='additive', period=30)
\# Graficar los resultados de la descomposición
resultado.plot()plt.show()
#### Ajuste de zonas horarias (time zones):
Pandas permite ajustar y convertir zonas horarias de manera eficiente.
\# Convertir a zona horaria UTC
data = data.tz\_localize('UTC')
\# Convertir a una nueva zona horaria
data = data.tz\_convert('America/New\_York')print(data)
### Resumen de Operaciones Clave:
- **pd.date\_range()**: Para crear series de fechas.
- **pd.to\_datetime()**: Para convertir columnas de fechas.
- **set\_index()**: Para establecer fechas como índice.
- **resample()**: Para cambiar la frecuencia temporal.
- **shift()**: Para desplazar datos en el tiempo.
- **rolling()**: Para aplicar funciones sobre ventanas móviles.
- **tz\_localize() y tz\_convert()**: Para ajustar zonas horarias.
Con estas herramientas puedes manejar series temporales de manera eficiente en Pandas. Si tienes alguna duda o quieres profundizar en un tema específico, ¡avísame!
Para colocar una nueva columna en una posición específica en un DataFrame de Pandas, puedes usar el método insert(). Este método te permite especificar el índice donde deseas insertar la nueva columna. Aquí tienes un ejemplo:
import pandas as pd
# DataFrame de ejemplodf = pd.DataFrame({'A':[1,2,3],'B':[4,5,6]})# Insertar nueva columna 'C' en la posición 1df.insert(1,'C',[7,8,9])print(df)
Esto insertará la columna 'C' en la posición 1, desplazando las demás columnas a la derecha.
Tomando esto como ejemplo, la solución para agregar la columna Weekday en la posición 10 y no al final de la derechadf.insert(10, "Weekday", df.index.weekday)```python
Ubicando columna Weekday en la penultma columna (la última es la posición 11 que la ocupará la columna Hour)
df.insert(10, "Weekday", df.index.weekday)
Monstrar DataFrame
df
Una forma de ver que en el Q4 del 2010 (siendo vísperas navideñas, no tuvo el impacto en ventas, como en el Q4 del 2011, donde se disparó mucho!
🤯 Increíble aporte, yo hice algo parecido en la clase de reestructuración de datos con pivot table, pero como desconocía esta forma de crear trimestres a partir de datos de tiempo, así que hice una función para calcular los trimestres 😂.
Mil gracias por tu aporte 🙌🏼
El manejo de series temporales en Pandas es clave para analizar datos a lo largo del tiempo. Permite detectar tendencias, estacionalidades y fluctuaciones cíclicas en tus datos. La conversión de fechas a tipo datetime es fundamental, así como establecer la columna de tiempo como índice del DataFrame. Utilizando métodos como resample, puedes agrupar tus datos por periodos, ya sean días, meses o años, facilitando el análisis y la visualización. Para graficar, puedes usar Matplotlib, lo que ayuda a identificar patrones visualmente.
Cómo le ha hace la maestra para que los datos ocupen todo el ancho de pantalla¿?
Sería interesante que en el futuro se hagan cursos de Series de Tiempo (clásica, multivariada, con machine learning, modelos avanzados etc). Es un campo con mucha demanda y transversal a varios perfiles profesionales.
Yo te apoyo, estuve buscando información y es mucho más complejo que solo cambiar el tipo de dato y hacer filtros. Solo el tema de llenar datos faltantes con fechas es super complejo y aplicarlo a casos ufff... sería un curso completo.
🟢 Qué es un Timestamp
Un timestamp es una representación de un momento específico en el tiempo. Generalmente, se expresa como el número de segundos o milisegundos transcurridos desde una fecha y hora base, que suele ser el 1 de enero de 1970 a la medianoche UTC (Conocida como la Epoch en UNIX).
Los timestamps pueden ser representados en diferentes unidades de tiempo. Los más comunes son:* Segundos: Por ejemplo, 1609459200 representa el 1 de enero de 2021.
Milisegundos: Por ejemplo, 1609459200000 representa el mismo momento pero en milisegundos.
No confundas este concepto con formatos de fecha que generan algunos lenguajes de programación como: YYYY-MM-DDTHH:MM:SS.sssZ o datetime(2024, 9, 16, 8, 48, 2, 313465).
¡Nunca pares de aprender! 🚀🚀
Manejo de series temporales en Pandas
Se refiere a trabajar con datos indexados por fechas y tiempos. Pandas facilita esta tarea con herramientas para:
Indexación Temporal: Utiliza fechas como índices en DataFrames o Series.
Generación de Fechas: Usa pd.date_range() y pd.to_datetime() para crear o convertir datos temporales.
Resampling: Cambia la frecuencia de los datos (por ejemplo, de diaria a mensual) con resample().
Desplazamiento: Mueve datos en el tiempo con shift().
Rolling Windows: Aplica funciones estadísticas a ventanas móviles con rolling().
Estas herramientas te permiten analizar y modelar datos temporales de manera eficiente.
Con el error que presenta al nombrar la columna wekdy es necesario eliminarla y volver a crearla?. No es posible corregir donde se creo la columna y correr de nuevo el código?
Hola diego, al corregir el nombre sin eliminar la columna tendrás 2 columnas, la del error y la nueva corregida, por eso es importante eliminarla.
Es increíble lo que se puede hacer con las series temporales cuando se ponen en el índice del dataframe! Muy buena clase!
1. Cargar y Previsualizar el Dataset
file_path = 'online_retail.csv'
df = pd.read_csv(file_path)
print(df.head())
Descripción:
Carga el archivo online_retail.csv en un DataFrame de Pandas llamado df usando read_csv.
Muestra las primeras cinco filas del DataFrame utilizando head() para previsualizar su estructura.
Resultado: Las primeras cinco filas del conjunto de datos, con columnas como InvoiceNo, StockCode, Description, Quantity, InvoiceDate, UnitPrice, CustomerID y Country.
2. Comprender la Estructura del Dataset
df.info()
Descripción:
El método info() proporciona un resumen del conjunto de datos, incluyendo:
El número de filas.
Los nombres de las columnas.
Conteo de valores no nulos por columna.
Tipos de datos por columna.
Uso de memoria del DataFrame.
Resultado: Un resumen de la estructura del conjunto de datos, ayudando a comprender su tamaño y la presencia de datos faltantes.
Crea un DataFrame df_dates a partir del rango de fechas generado, con una sola columna llamada Date.
Resultado: Un DataFrame que contiene las primeras filas de la columna Date.
Una pregunta. No se supone que los indices deben ser UNICOS. Como se trabaja eso si las fechas son las mismas en muchos casos.
algo que no aclaran en la clase es el uso del formato, por defecto pd.dateTime usa 'yyyy-mm-dd'
cuidado si sus datos estan en un formato yankee o latino y quieren pasar a dateTime, deben verificar en que formato vienen sus datos para poder transformarlos bien a DateTime
📝 Mis apuntes de la clase
Las series de tiempo representan datos en un punto determinado del tiempo, esto nos permite realizar análisis de tendencias, patrones estacionales, fluctuaciones u otros comportamientos a lo largo del tiempo.
Trabajar con series de tiempo nos permite realizar operaciones complejas de forma eficiente.
Por ejemplo:
Filtrado por fechas.
Remuestreo.
Análisis de tendencias.- Acceso avanzado a los datos por medio de la funcionalidad loc, indicando solo el año, mes o rango de fechas.
Al trabajarlas con pandas debemos:
Asegurar que las columnas que contengan datos de fecha y hora tengan el formato adecuado. Se corrigen con la función pd.to\_date().
Cambiar el ídice numérico del DataFrame por el valor de la columna que contenga la fecha en el formato datetime. Se logra con la función integrada en la instancia del DF df.set\_index("columna", inplace=True)
El formato datetime de pandas habilita nuevas funcionalidades:
Extracción de partes especificas de la fecha (año, mes, día, nombre del mes, día de la semana, etc.).
Indexación por fechas.
Generar rango de tiempo con pf.date\_range().- Manejo de datos faltantes con interpolate.- Etc.
Ejemplos:
"""
Cambiamos el indice numérico del dataframe por un indice datetime a partir
de la columna InvoiceDate"""
print("Indice anterior:", df.index.dtype)df.set_index("InvoiceDate", inplace=True)print("Indice nuevo:", df.index.dtype)df.head()
Al colocar InvoiceDate como índice ésta columna ya no aparece en el DataFrame, por lo tanto para acceder a sus respectivos valores lo haremos mediante la propiedad index.
print(df.index[:5])# Extraer elementos de especificos de una fecha:print("Año", df.sample(5).index.year[:5])print("Mes", df.sample(5).index.month[:5])print("Nombre mes:", df.sample(5).index.month_name())# Filtro avanzado a partir del indice tipo datetime con .locprint("Enero 2011:")display(retail_df.loc["2011-01"].sample(5))print("Rango: desde 01/15/2011 al 15/12/2011 ")display(retail_df.loc["2011-12-01":"2011-12-15"].sample(5))