Skip to content

Limpieza de la base de datos

Se limpiaron y prepararon los datos obtenidos de los cierres de mes (Archivos SAP) previamente se unieron todos los archivos individuales en una sola base y se hizo el siguiente tratamiento
1.2 Estructura de Datos
Dataset
Registros
Variables Clave
SAP
Múltiples transacciones
Created On, Amount, Product, Customer, Area, Zona
Diccionario
Catálogo
Product, Presentacion PDM
There are no rows in this table

2. Data Preparation (Preparación de Datos)

2.1 Transformación de Fechas

Problema: Múltiples formatos de fecha en columna 'Created On'
Solución Implementada:
def convertir_fecha(fecha):
formatos = ['%Y-%m-%d', '%d/%m/%Y', '%m/%d/%Y']
for formato in formatos:
try:
return pd.to_datetime(fecha, format=formato, errors='raise')
except:
continue
return pd.NaT

sap['Created On'] = sap['Created On'].apply(convertir_fecha)
sap['Created On'] = sap['Created On'].dt.normalize() # Eliminar componentes de tiempo
Resultado: Fechas uniformizadas en formato datetime sin componente horaria.

Corrección de Datos de Clientes

Problema: Clientes con asignación incorrecta de área y zona
clientes_a_cambiar = ['FERRETERIA REGIONAL DE GUACHOCHI', 'CUAUHTEMOC',
'DANNY PETKAU ELIAS', 'JOSE ANGEL BUSTILLOS MORENO']
nuevo_area = 'Cuauhtemoc'
nueva_zona = 'Chihuahua'

sap.loc[sap['Customer Name agregado'].isin(clientes_a_cambiar), 'Area'] = nuevo_area
sap.loc[sap['Customer Name agregado'].isin(clientes_a_cambiar), 'Zona'] = nueva_zona

Limpieza de columna ‘Amount’

Problemas Identificados:
Presencia de caracteres especiales ($, ,, -)
Valores no numéricos
# 1. Limpieza de caracteres especiales
sap['Amount'] = sap['Amount'].replace({r'\$': '', ',': '', '-': ''}, regex=True)

# 2. Conversión a numérico
sap['Amount'] = pd.to_numeric(sap['Amount'], errors='coerce')

# 3. Eliminación de valores no positivos
sap = sap[sap['Amount'] > 0]
Validación: Se identificaron y eliminaron valores inválidos (verificación con invalid_amounts)

Eliminación de Registros no Deseados

Criterio
Valores Eliminados
Sales Group
'FIL'
Subsegmento
'Filial'
Subsegment (Client Group)
'FI'
Area
'Exportacion USA', 'Exportacion SUD', 'El Paso', 'Fuera del Estado', 'Frontera Fuera del E'
Currency key
'USD', 'EUR'
Subsegmento
'Empleados', 'Publico en General'
There are no rows in this table
Estandarizacion
sap['Zona'].replace({'Juárez': 'Juarez'}, inplace=True)
sap['Area'].replace({'Juárez': 'Juarez'}, inplace=True)

Filtrado y Estandarización de Productos

Filtrado: Mantener solo productos específicos (valores_a_buscar)
Reetiquetado de Productos:
reemplazos = {
'CEMSPC30PV': 'CEMSPC30',
'CEMSPC3025PV': 'CEMSPC3025',
'MASS0225': 'MASS02',
'MASS0325': 'MASS03'
}
sap['Product'] = sap['Product'].replace(reemplazos)

Selección de Columnas Relevantes

columnas_a_mantener = [
"Mes", "Created On", "Product", "Zona", "Area", "Subsegmento",
"Volumen", "Customer Name", "Amount", "Price", "Pestaña",
"Order Number", "Customer Number", "Currency key",
"Customer Number agregado", "Customer Name agregado"
]
nsap = sap.filter(items=columnas_a_mantener)

Creación de Variable 'Segmento'

Reglas de Clasificación:
def asignar_segmento(subsegmento):
if subsegmento in ['Autoconstrucción','Autoconstruccion']:
return 'Autoconstrucción'
elif subsegmento in ['Dumps - Tulsa', 'Bulkers - Tulsa', 'Dumps - Arkansas',
'Bulkers - Arkansas', 'Fuera del Estado', 'Sudamérica']:
return 'Exportación'
elif subsegmento in ['Distribuidor', 'Ferretero', 'ConstruRed']:
return 'Ferretero/Distribuidor'
elif subsegmento == 'Filial':
return 'Filial'
elif subsegmento in ['CUM', 'Dependencia de Gobie', 'Estado',
'Gobierno del Estado', 'Municipios', 'SUMA']:
return 'Gobierno'
elif subsegmento in ['Industry', 'Comercial', 'Infraestructura', 'Industrial']:
return 'Industrial y Comercial'
elif subsegmento == 'Mineria':
return 'Minería'
elif subsegmento in ['Retail', 'Bloquero', 'Concretero', 'Transformista']:
return 'Transformista'
elif subsegmento == 'Vivienda':
return 'Vivienda'
else:
return 'Otro'

Enriquecimiento con Diccionario

dic_subset = dic[["Product", "Presentacion PDM"]]
nsap_merged = pd.merge(nsap, dic_subset, on="Product", how="left")

Feature Engineering (Ingeniería de Características)

Variables de Cliente

Variable
Método
Descripción
Presencia Area
groupby('Customer Number')['Area'].nunique()
Número de áreas donde opera el cliente
Presencia Zona
groupby('Customer Number')['Zona'].nunique()
Número de zonas donde opera el cliente
Unique Products
groupby('Customer Number')['Product'].nunique()
Cantidad de productos distintos comprados
Unique Orders
groupby('Customer Number')['Order Number'].nunique()
Número de órdenes distintas
Unique Days
groupby('Customer Number')['Created On'].nunique()
Días distintos con actividad
There are no rows in this table

Variables de Montos Agregados

resultado_final1 = nsap.groupby('Customer Number agregado').agg({
'Amount': 'sum', # Monto total
'Price': 'sum', # Precio total
'Volumen': 'sum' # Volumen total
}).reset_index()

Estructura Final del Dataset

Grupo de Variables
Columnas Incluidas
Identificación
Customer Number agregado
Productos
Unique Products
Montos
Amount, Price, VolumenT
Presencia
Presencia Zona, Presencia Area
Actividad
Unique Orders, Unique Days
Recencia
Days Since Last Order
Presentaciones
Columnas dinámicas por presentación PDM
There are no rows in this table

Variables Clave para Modelado

Variable
Tipo
Descripción
Amount
Numérica
Monto total comprado
VolumenT
Numérica
Volumen total
Unique Products
Numérica
Diversidad de productos
Unique Days
Numérica
Frecuencia de compra
Days Since Last Order
Numérica
Recencia
Presencia Area/Zona
Numérica
Alcance geográfico
Columnas Presentación
Numérica
Distribución por tipo de producto
There are no rows in this table

Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.