Normalization is the process of organizing data to reduce redundancy and improve data integrity. In PruebaETL, raw CSV files contain repeated values like city names and customer segments hundreds of times.
Without normalization, “La Romana” might appear 50+ times in the data, wasting storage space and making updates error-prone.
Extracted From: Customer dataPurpose: Categorize customers into business segments (Corporate, Consumer, Home Office)Implementation:
# normalizar_datos.py:127-128if segmento: segmentos_set.add(segmento)# normalizar_datos.py:140-141segmentos = [{'segmento_id': i+1, 'nombre': segmento} for i, segmento in enumerate(sorted(segmentos_set))]
Extracted From: Sales dataPurpose: Support multi-currency transactionsImplementation:
# normalizar_ventas.py:111-112if moneda: monedas_set.add(moneda)# normalizar_ventas.py:125-126monedas = [{'moneda_id': i+1, 'codigo': moneda} for i, moneda in enumerate(sorted(monedas_set))]
# normalizar_datos.py:144-147ciudad_map = {ciudad['nombre']: ciudad['ciudad_id'] for ciudad in ciudades}segmento_map = {segmento['nombre']: segmento['segmento_id'] for segmento in segmentos}# normalizar_datos.py:150-161clientes_normalizados = []for cliente in clientes: ciudad_id = ciudad_map.get(cliente['ciudad']) segmento_id = segmento_map.get(cliente['segmento']) clientes_normalizados.append({ 'cliente_id': cliente['cliente_id'], 'nombre': cliente['nombre'], 'ciudad_id': ciudad_id, # ID instead of text 'segmento_id': segmento_id, # ID instead of text 'fecha_registro': cliente['fecha_registro'] })
# normalizar_ventas.py:128-131canal_map = {canal['nombre']: canal['canal_id'] for canal in canales}moneda_map = {moneda['codigo']: moneda['moneda_id'] for moneda in monedas}# normalizar_ventas.py:133-145ventas_normalizadas = []for venta in ventas: canal_id = canal_map.get(venta['canal']) moneda_id = moneda_map.get(venta['moneda']) ventas_normalizadas.append({ 'venta_id': venta['venta_id'], 'cliente_id': venta['cliente_id'], 'fecha': venta['fecha'], 'total': venta['total'], 'moneda_id': moneda_id, # ID instead of text 'canal_id': canal_id # ID instead of text })
# normalizar_ventas.py:87-94cliente_id = row.get('cliente_id', '').strip()if not cliente_id or cliente_id == '': continue # Skip this saletry: cliente_id = int(cliente_id)except ValueError: continue # Skip if not a valid integer
# normalizar_datos.py:186-203clientes_completos = []for cliente in clientes_normalizados: ciudad_nombre = next((c['nombre'] for c in ciudades if c['ciudad_id'] == cliente['ciudad_id']), '') segmento_nombre = next((s['nombre'] for s in segmentos if s['segmento_id'] == cliente['segmento_id']), '') clientes_completos.append({ 'cliente_id': cliente['cliente_id'], 'nombre': cliente['nombre'], 'ciudad': ciudad_nombre, 'segmento': segmento_nombre, 'fecha_registro': cliente['fecha_registro'] })