Durante el curso, se creó una tabla simplificada para un informe de rendimiento, pero no se finalizó.
El desafío ahora es finalizar la construcción de la tabla, destacando el elemento de la fila Total. También puede aplicar otras estilizaciones que considere más adecuadas para la visualización.
import pandas as pd
import numpy as np
# Agrupamos por categoría y tipo de cliente
df = pd.read_csv('/content/tienda_libros.csv')
df_cliente = df.groupby(['categoria', 'tipo_cliente'])['costo_producto'].sum().unstack().fillna(0)
df_cliente['Total'] = df_cliente.sum(axis=1)
# Añadimos una fila de "Total" al final
total_row = df_cliente.sum().to_frame().T
total_row.index = ['Total']
df_cliente = pd.concat([df_cliente, total_row])
compra_cliente = df_cliente.style.format('{:,.2f}')
# Estilos
base_styles = [
{'selector': 'td, th:not(.index_name)',
'props': 'font-weight: normal; font-family: Arial; text-align: center; background-color: white;'},
{'selector': '.index_name',
'props': 'font-weight: normal; text-align: right; font-style: italic; color: #696969;'}
]
compra_cliente.set_table_styles(base_styles)
# Líneas divisorias para columnas
compra_cliente.set_table_styles({
'Total': [{'selector': 'th, td', 'props': 'border-left: 1px solid #181818'}],
'B2B': [{'selector': 'th, td', 'props': 'border-left: 1px solid #181818'}]
}, overwrite=False, axis=0) # Usamos axis=0 para aplicar a lo largo de la columna
# Resaltar la celda con el mayor valor de Total
categorias_solo = df_cliente.index.difference(['Total'])
max_val = df_cliente.loc[categorias_solo, 'Total'].max()
# Creamos el CSS
clases = pd.DataFrame(
np.where(df_cliente[['Total']] == max_val, 'highlight_max', ''),
index=df_cliente.index, columns=['Total']
)
compra_cliente.set_td_classes(clases)
compra_cliente.set_table_styles([
{'selector': '.highlight_max', 'props': 'background-color: #D8D8D8; font-weight: bold; color: #d73027;'}
], overwrite=False)
# destacamos la fila total
compra_cliente.set_table_styles({
'Total': [{
'selector': 'th, td',
'props': 'background-color: #333333; color: white; font-weight: bold; border-top: 2px solid black;'
}]
}, overwrite=False, axis=1) # axis=1 para seleccionar la fila por su etiqueta de índice
# Añadimos un degradado suave a las ventas B2B y B2C
compra_cliente.background_gradient(cmap='Blues', subset=(categorias_solo, ['B2B', 'B2C']))
compra_cliente