No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Series de tiempo y manejo de fechas con Matplotlib

27/32
Recursos

¿Cómo se visualizan datos temporales en Python?

La capacidad de visualizar datos temporales es fundamental para cualquier analista que desee identificar patrones, tendencias o anomalías. A través de gráficos de líneas es posible obtener una comprensión clara de la evolución de los datos sobre el tiempo. En este artículo, exploraremos cómo utilizar librerías populares de Python como NumPy, Pandas, y Matplotlib para crear representaciones visuales efectivas de series temporales.

¿Qué herramientas son necesarias para la visualización de series temporales?

Para empezar con la visualización de datos temporales, es conveniente tener familiaridad con algunas herramientas de Python:

  • NumPy: Para realizar operaciones numéricas eficientes.
  • Pandas: Para gestionar datos en forma de tablas y series temporales.
  • Matplotlib: La herramienta por excelencia para crear gráficos en Python.

Este conjunto de herramientas permite generar, manipular y visualizar fácilmente datos temporales.

¿Cómo se crea un gráfico de líneas básico?

El camino hacia una buena visualización comienza con la creación de un conjunto de datos y un gráfico de líneas básico. Vamos a crear un ejemplo simple utilizando ficción de ventas:

Primero, generamos un conjunto de fechas y valores aleatorios para simular los datos de ventas a lo largo del tiempo:

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

# Genera fechas y valores aleatorios
dates = pd.date_range(start='2023-01-01', periods=100, freq='D')
values = np.random.randint(1000, 5000, size=100)

# Crear DataFrame
data = pd.DataFrame({'Fecha': dates, 'Ventas': values})

Con esto en mano, podemos comenzar a graficar:

# Crear gráfico de líneas
plt.figure(figsize=(12, 6))
plt.plot(data['Fecha'], data['Ventas'], color='g')
plt.xticks(rotation=45)
plt.title('Serie Temporal de Ventas')
plt.xlabel('Fecha')
plt.ylabel('Ventas')
plt.show()

¿Cómo se personaliza el formato de las fechas?

Para mejorar la legibilidad del gráfico, es necesario ajustar el formato de las fechas. Podemos hacerlo rotando los textos o dándole un formato específico para que las fechas se muestren en meses de forma escrita:

import matplotlib.dates as mdates

# Ajustar formato de fechas
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
plt.xticks(rotation=45)

En este caso, '%b %Y' se utiliza para mostrar el mes en forma abreviada junto al año.

¿Cómo se representan casos de uso reales?

Una vez que hemos cubierto lo básico, podemos aplicar estos conceptos a diferentes contextos más avanzados para mostrar ventas mensuales o analizar patrones estacionales, por ejemplo. Aquí te dejo un ejemplo focalizado en ventas mensuales:

# Generación de datos mensuales
dates = pd.date_range(start='2023-01-01', periods=12, freq='M')
sales = np.random.randint(1000, 5000, size=12)

# Crear DataFrame mensual
monthly_data = pd.DataFrame({'Fecha': dates, 'Ventas': sales})

# Crear gráfico con leyenda y estilo personalizado
plt.figure(figsize=(10, 5))
plt.plot(monthly_data['Fecha'], monthly_data['Ventas'], marker='o', linestyle='-', label='Ventas Mensuales')
plt.xticks(rotation=45)
plt.title('Análisis de Ventas Mensuales')
plt.xlabel('Fecha')
plt.ylabel('Ventas')
plt.legend()
plt.tight_layout()
plt.show()

Esta práctica no sólo cohesiona el entendimiento de las series temporales, sino que también fortalece las habilidades de análisis de datos de cualquiera que busque predecir tendencias futuras. Recuerda interactuar con tus propias variables y configuraciones para maximizar el aprendizaje y la adaptación según tus necesidades analíticas. ¡Sigue practicando y explorando el poderoso mundo de las series temporales!

Aportes 20

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

**SERIES DE TIEMPO** * **Qué son:** Son datos recolectados o registrados en secuencias cronológicas, donde cada punto de datos tiene una marca temporal. Ejemplos incluyen temperaturas diarias, precios de acciones o registros de ventas. * **Para qué sirven:** Se utilizan para analizar y prever tendencias, patrones estacionales y ciclos a lo largo del tiempo. Son esenciales para el análisis predictivo, el monitoreo de eventos y la toma de decisiones basadas en datos históricos.
🟢 **Cómo utilizar textos y anotaciones superpuestas** Las anotaciones en gráficos ayudan a guiar al lector y a destacar información relevante. Mientras que algunas visualizaciones pueden comunicar la información de manera efectiva solo con elementos visuales, en otros casos es necesario **agregar textos y etiquetas para aclarar el mensaje**. ![](https://static.platzi.com/media/user_upload/image-514b0143-11ea-4c08-a663-98d62e4ea67d.jpg) * **Agregar Textos y Etiquetas:** Para agregar textos en un gráfico, se puede usar `axes.text` que permite posicionar el texto en coordenadas específicas. * **Flechas y Anotaciones Avanzadas:** Para agregar flechas y anotaciones más detalladas, se usa `plt.annotate`, que permite personalizar el estilo de las flechas. Por ejemplo, en la imagen, a una serie de tiempo agreguemos un texto "Hallowen". Sin embargo, como observarás, puede que falte contexto específico, de esta manera agregamos flechas y anotaciones como las demás fechas. Te dejo la implementación de código de un tipo para cada uno. Advertencia, se utiliza subplots. ```python fig, ax = plt.subplots(figsize=(12, 4)) dataFrameBirths.plot(ax=ax) ## Etiqueta de tipo texto ax.text('2012-10-31', 4600, "Halloween", ha='right', **style) ## Anotaciones y flechas ax.annotate("Día de la independencia", xy=('2012-7-4', 4250), xycoords='data', bbox=dict(boxstyle="round", fc="none", ec="gray"), xytext=(10, -40), textcoords='offset points', ha='center', arrowprops=dict(arrowstyle="->")) ``` ¡Nunca pares de aprender! 🚀🚀 Bibliografía: `jakevdp.github.io/PythonDataScienceHandbook/04.09-text-and-annotation.html`
La función `cumsum()` en el primer ejemplo se utiliza para calcular la suma acumulativa de los valores generados aleatoriamente. Esto significa que cada valor en la serie se suma al anterior, lo que permite visualizar cómo incrementa la producción de energía a lo largo del tiempo. Al graficar esta suma acumulada, puedes observar tendencias y patrones más fácilmente en la serie de tiempo, como el aumento de la producción en ciertos períodos.
Trabajar con \*\*series de tiempo\*\* y \*\*fechas\*\* en Matplotlib implica no solo graficar datos en función del tiempo, sino también manejar correctamente el formato de las fechas y aplicar personalizaciones. A continuación, te muestro cómo hacerlo paso a paso. \### 1. \*\*Creación de una serie de tiempo\*\*: Primero, necesitas generar o tener acceso a datos que incluyan una columna de fechas y valores correspondientes. \#### Ejemplo de datos generados con `Pandas`: ```python import pandas as pd import numpy as np \# Crear un rango de fechas dates = pd.date\_range(start="2024-01-01", periods=100, freq="D") \# Crear datos aleatorios values = np.random.randn(100).cumsum() \# Crear DataFrame con fechas y valores time\_series = pd.DataFrame({"Fecha": dates, "Valor": values}) ``` \### 2. \*\*Graficar una serie de tiempo con Matplotlib\*\*: Para graficar los datos de una serie de tiempo, puedes usar `plot\_date` o simplemente `plot` si ya tienes los datos correctamente formateados. \#### Ejemplo de gráfico simple de serie de tiempo: ```python import matplotlib.pyplot as plt \# Crear el gráfico plt.figure(figsize=(10, 6)) plt.plot(time\_series\['Fecha'], time\_series\['Valor'], color='blue', marker='o', linestyle='-', label='Valores') \# Añadir etiquetas y título plt.title("Serie de Tiempo") plt.xlabel("Fecha") plt.ylabel("Valor") plt.grid(True) \# Mostrar leyenda y gráfico plt.legend() plt.show() ``` \### 3. \*\*Formato de fechas\*\*: Para mejorar la legibilidad del eje `x` (fechas), puedes usar el módulo `dates` de Matplotlib para personalizar el formato de las fechas. \#### Ejemplo de formato de fechas: ```python import matplotlib.dates as mdates \# Crear el gráfico plt.figure(figsize=(10, 6)) plt.plot(time\_series\['Fecha'], time\_series\['Valor'], color='green') \# Formatear las fechas en el eje x plt.gca().xaxis.set\_major\_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.gca().xaxis.set\_major\_locator(mdates.MonthLocator()) \# Rotar las etiquetas de las fechas plt.gcf().autofmt\_xdate() \# Añadir etiquetas y título plt.title("Serie de Tiempo con Formato de Fechas") plt.xlabel("Fecha") plt.ylabel("Valor") plt.grid(True) plt.show() ``` \### 4. \*\*Manejo de intervalos de fechas\*\*: A veces es necesario ajustar el rango de fechas mostrado en el gráfico. Esto se puede hacer utilizando `plt.xlim()` o configurando manualmente el rango de fechas. \#### Ejemplo de ajuste del rango de fechas: ```python \# Crear el gráfico plt.figure(figsize=(10, 6)) plt.plot(time\_series\['Fecha'], time\_series\['Valor'], color='red') \# Limitar las fechas mostradas plt.xlim(pd.Timestamp("2024-01-01"), pd.Timestamp("2024-03-31")) \# Añadir etiquetas y título plt.title("Serie de Tiempo con Rango de Fechas Ajustado") plt.xlabel("Fecha") plt.ylabel("Valor") plt.grid(True) plt.show() ``` \### 5. \*\*Gráfico de barras para series de tiempo\*\*: También puedes representar una serie de tiempo con un gráfico de barras para resaltar los valores individuales. \#### Ejemplo de gráfico de barras: ```python plt.figure(figsize=(10, 6)) plt.bar(time\_series\['Fecha'], time\_series\['Valor'], color='purple') \# Formatear las fechas en el eje x plt.gca().xaxis.set\_major\_formatter(mdates.DateFormatter('%Y-%m-%d')) plt.gca().xaxis.set\_major\_locator(mdates.WeekdayLocator()) \# Rotar las etiquetas de las fechas plt.gcf().autofmt\_xdate() \# Añadir etiquetas y título plt.title("Serie de Tiempo - Gráfico de Barras") plt.xlabel("Fecha") plt.ylabel("Valor") plt.grid(True) plt.show() ``` \### Resumen de puntos importantes: \- \*\*Fechas\*\*: Usa `pd.date\_range()` para generar rangos de fechas y manipula columnas de fechas en `Pandas`. \- \*\*Formateo de Fechas\*\*: Usa `mdates.DateFormatter` para ajustar el formato de fechas en el eje `x`. \- \*\*Intervalos\*\*: Limita el rango de fechas con `plt.xlim()` o ajustando el índice de las fechas. \- \*\*Rotación de Fechas\*\*: Usa `plt.gcf().autofmt\_xdate()` para rotar etiquetas si hay superposición. Estas herramientas te permitirán manejar y visualizar series de tiempo de manera efectiva en Matplotlib.
**Manejo de fechas con Matplotlib** * **Qué es:** Matplotlib es una biblioteca de visualización en Python que permite graficar datos, incluyendo series de tiempo. Para manejar fechas, se integra con librerías como `datetime` y `pandas`, que facilitan la manipulación de fechas y tiempos. * **Para qué sirve:** Permite crear gráficos que representan datos a lo largo del tiempo, como líneas de tiempo, gráficos de dispersión con fechas, y más. Esto ayuda a visualizar cómo cambian los datos en función del tiempo y facilita el análisis de tendencias y patrones.
Me puse creativo: `import matplotlib.pyplot as pltimport pandas as pdimport numpy as npfrom matplotlib.dates import DateFormatter` `dates = pd.date_range(start='2023-01-01', periods=100)` `np.random.seed(42)values = np.random.randn(100).cumsum() + 100  ` `df = pd.DataFrame({'Fecha': dates, 'Valor': values})` `df.set_index('Fecha', inplace=True)` `plt.figure(figsize=(10, 6))plt.plot(df.index, df['Valor'], color='blue', linestyle='-', marker='o', label='Valor diario')plt.fill_between(df.index, df['Valor'], color='skyblue', alpha=0.4) ` `plt.title('Visualización de Serie de Tiempo')plt.xlabel('Fecha')plt.ylabel('Valor')plt.grid(True)plt.xticks(rotation=45)  plt.legend()` `date_form = DateFormatter("%b-%d")plt.gca().xaxis.set_major_formatter(date_form)` `plt.tight_layout()plt.show()` ![](https://static.platzi.com/media/user_upload/image-b97e0f78-4d0b-44d7-a3b7-4de97a195bb9.jpg)
Solucion con grafico de lineas 1 - dividimos las fechas por meses df\['Fecha'] = pd.to\_datetime(df\['Fecha'])df\['Mes'] = df\['Fecha'].dt.month 2 - agrupamos por la media de ventas Ventas\_mensuales = df.groupby(df\['Mes'])\["Ventas"].mean().reset\_index()df\_ventas\_ordered = pd.DataFrame(Ventas\_mensuales) 3- creamos grafico de lineas fig, ax = plt.subplots(*figsize*=(16,6))ax.plot(df\_ventas\_ordered\['Mes'],df\_ventas\_ordered\['Ventas'],*color*='black')plt.title('serie de ventas mensual (MEAN)')plt.xlabel('Mes')plt.ylabel('Ventas Generadas')plt.show() \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ opcion al groupby con pivot df\_pivot = df.pivot\_table(*values*='Ventas',*index*='Mes',*aggfunc*='sum')fig, ax = plt.subplots(*figsize*=(16,6))ax.plot(df\_pivot.index,df\_pivot\['Ventas'],*marker* = "o",*linestyle* = '--',*color*='black')plt.title("Suma de ventas mensuales")plt.xlabel("Mes")plt.ylabel("compras")plt.show()
![](https://static.platzi.com/media/user_upload/image-0eb3e3c9-3934-4115-bbef-5bc2a8aeb73e.jpg) ![](https://static.platzi.com/media/user_upload/image-1c4ef76b-5f59-4b8d-b1aa-c8cf53c4e354.jpg) Grafico creado utilizando la data online\_retail.csv
Si quisieramos hacer el ejercicio usando la data definida principalemente ```python df['Month'] = df['Fecha'].dt.month sales_month = df.groupby('Month')['Valores'].sum() plt.bar(sales_month.index, sales_month.values) plt.xlabel('Mes') plt.ylabel('Ventas') plt.title('Ventas Mensuales') plt.show() ```
me acabo de enterar que las series de pandas( n se si los data frames tambien) tienen asociados un metodo plot que se basa en matplotlib, lo cual permite que el siguiente codigo tenga sentido ```python sales_by_bin = df.groupby(pd.cut(df['dates'], bins=20))['values'].sum() sales_by_bin.plot(kind='bar',ax=ax,color='green') ```
no entendi para que el .cumsum() =(
La clase se centra en la visualización de series temporales usando Matplotlib. Aquí tienes un resumen del código: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt from matplotlib.dates import DateFormatter # Crear rango de fechas fechas = pd.date_range(start='2023-01-01', periods=12, freq='M') ventas = np.random.randint(1000, 5000, size=12) # Crear DataFrame data = pd.DataFrame({'Fecha': fechas, 'Ventas': ventas}) # Graficar plt.figure(figsize=(12, 6)) plt.plot(data['Fecha'], data['Ventas'], marker='o', label='Ventas Mensuales') plt.title('Análisis de Ventas Mensuales') plt.xlabel('Fecha') plt.ylabel('Ventas') plt.xticks(rotation=45) plt.legend() plt.show() ``` Este código genera un gráfico de líneas que representa los datos de ventas mensuales, mostrando cómo se visualizan las series temporales.
No entiendo porque pone el igual despues del pd.DataFrame. ¿Como funciona eso? sales\_data = pd.DataFrame=({'Dates': dates, 'Sales': sales}) Minuto 9:32 Gracias :)
```python import numpy as np import matplotlib.pyplot as plt months = np.array(['January', 'February', 'March', 'April', 'May', 'June', 'July']) sales = np.array([1000, 150, 2000, 250, 300, 3500, 400]) #configurar el tamaño del grafico fig, ax = plt.subplots(figsize=(10, 6)) #CREAR GRAFICA(con las variables ) ax.plot(months,sales, color ='blue') plt.title('ventas mensuales de un producto') plt.xlabel('meses') plt.ylabel('ventas') plt.show() ```![](https://static.platzi.com/media/user_upload/image-00044960-8246-42e3-bc03-14f52ad66b86.jpg)
![](https://static.platzi.com/media/user_upload/image-793bc15b-101d-48d4-9f7d-9573315e07eb.jpg)
Excelente clase, lo necesitaba para visualizar en el tiempo los homicidios y asesinatos del Ecuador 2014 - 2023. ![](https://static.platzi.com/media/user_upload/linea_de_tiempo_homicidios_ecuador_2014_2023-3beee0c7-a85f-4753-83ad-891fca62a8c5.jpg) Adjunto también el código utilizado: ```js import matplotlib.pyplot as plt # Crear la figura plt.figure(figsize=[12, 8]) # Fondo negro plt.gcf().patch.set_facecolor('black') # Datos ordenados anios_sorted = sorted(anios.unique()) victimas_sorted = sorted(anios.value_counts()) # Crear el gráfico plt.plot(anios_sorted, victimas_sorted, marker='o', linestyle='-', color='#F97306', linewidth=2) # Añadir etiquetas a cada punto (número de víctimas) for i, txt in enumerate(victimas_sorted): plt.annotate(f'{txt}', (anios_sorted[i], victimas_sorted[i]), textcoords="offset points", xytext=(0,10), ha='center', color='white') # Títulos y etiquetas plt.title('Línea de Tiempo Asesinatos y Homicidios Ecuador 2014-2023', color='white') plt.ylabel('Víctimas', color='white') plt.xlabel('Años', color='white') # Cambiar el color de los ticks plt.tick_params(colors='white') # Leyenda plt.legend(['Víctimas'], facecolor='black', edgecolor='white', labelcolor='white') #Gráfico plt.show() ```
No se si este en lo correcto. en lugar de llamar a plt.subplots. por que no mejor define el tamaño de la figura de la siguiente manera plt.figure(figsize=(12, 6)) ?.
Les presento mi ejemplo practico ![](https://static.platzi.com/media/user_upload/image-30a0b3b3-dc16-4497-bd8e-0de6cdcbeaf1.jpg)
Tengo una duda, ¿Cuándo se realiza gráficos de series de tiempo estás tienen que ser analizadas por su rango de crecimiento? Lo digo porque hice un código muy similar a la clase para graficar las ventas mensuales usando series de tiempo para el archivo de Online\_Retail.csv y estaba viendo que el gráfico es creciente porque así está con el método cumsum(). ```python sales = data_retail[data_retail['InvoiceDate'].dt.month == 1] sales_feb_2011_cum = sales['Quantity'].cumsum() sales_feb_2011 = sales['InvoiceDate'] plt.figure(figsize=(12,6)) plt.plot( sales_feb_2011, sales_feb_2011_cum, marker='o', linestyle='-', color='y' ) plt.title('Ventas de Enero', fontsize=16) plt.xlabel('Fechas', fontsize=13) plt.ylabel('Cantidad de productos vendidos', fontsize=13) plt.grid() plt.xticks(rotation=45); ``` ![](https://static.platzi.com/media/user_upload/image-081c9430-d0e9-4525-91f2-5165e4d383b5.jpg)
Buena clase, sería genial que hicieran un curso de Series de Tiempo con Python, hay mucho tema que abarcar desde los modelos AR hasta el pronóstico con machine learning.