TRANSACTION ANALYZER
Objective:
Build a basic transaction analyzer that cleans CSV-like lines, standardizes categories, extracts amounts and descriptions, groups by type, and outputs both a formatted report and key totals (expense sum and net balance).
How it works:
1. Define & parse data: Transform the raw strings into structured lists using a list comprehension with split(",")
, producing transacciones_depuradas1
.
2. Normalize categories: Replace every "Compra"
with "Gasto"
across all records to standardize transaction types (transacciones_depuradas2
).
3. Filter & extract amounts: Create gastos
containing only "Gasto"
records and monto
by casting the amount field to float
for numeric work.
4. Format descriptions: Build descripciones_mayus
with uppercase descriptions and transacciones_modificadas
that uppercases only the description column while preserving other fields.
5. Compute totals: Use generator expressions to calculate total_gastos
(sum of all "Gasto"
) and saldo_total
(incomes minus non-income transactions).
6. Group by type: Construct transacciones_por_tipo
via a dictionary comprehension to group records by their normalized type.
7. Generate report: Assemble human-readable lines with f-strings and join them with newline characters to print a tidy, per-transaction report.
# El objetivo es hacer un analizador básico de un registro de transacciones.
transacciones = [
"2024-12-01,Compra,100.50,Supermercado",
"2024-12-02,Ingreso,2000.00,Salario",
"2024-12-03,Compra,20.75,Restaurante",
"2024-12-04,Retiro,50.00,Cajero"
]
# Separar cada transacción en una lista. Recorrer un bucle for de esta manera es hacer una list comprehension.
transacciones_depuradas1 = [transaccion.split(",") for transaccion in transacciones]
print(transacciones_depuradas1)
# Reemplazar la palabra "Compra" por "Gasto".
transacciones_depuradas2 = [[elemento.replace("Compra", "Gasto") for elemento in transaccion] for transaccion in transacciones_depuradas1]
print(transacciones_depuradas2)
# Extraer solo las transacciones de tipo "Gasto":
gastos = [transaccion for transaccion in transacciones_depuradas2 if transaccion[1] == "Gasto"]
print(gastos)
# Extraer el monto de las transacciones totales:
monto = [float(transaccion[2]) for transaccion in transacciones_depuradas2]
print(monto)
# Lista de descripciones en mayúsculas
descripciones_mayus = [transaccion[3].upper() for transaccion in transacciones_depuradas2]
print(descripciones_mayus)
# Cambiar solo las descripciones a mayúsculas, manteniendo el resto de los datos
transacciones_modificadas = [ [transaccion[0], transaccion[1], transaccion[2], transaccion[3].upper()] for transaccion in transacciones_depuradas2]
print(transacciones_modificadas)
# Calcular el total pero solo de los montos:
total_gastos = sum(float(transaccion[2]) for transaccion in transacciones_depuradas2 if transaccion[1] == "Gasto")
print(total_gastos)
# Agrupar transacciones por tipo:
transacciones_por_tipo = { tipo: [transaccion for transaccion in transacciones_depuradas2 if transaccion[1] == tipo]
for tipo in set(transaccion[1] for transaccion in transacciones_depuradas2)}
print(transacciones_por_tipo)
# Crear un reporte formateado:
reporte = [
f"Fecha: {transaccion[0]}, Tipo: {transaccion[1]}, Monto: {transaccion[2]}, Descripción: {transaccion[3]}"
for transaccion in transacciones_depuradas2
]
print("\n".join(reporte))
# Calcular el saldo total:
saldo_total = sum(
float(transaccion[2]) if transaccion[1] in ["Ingreso"] else -float(transaccion[2])
for transaccion in transacciones_depuradas2
)
print(saldo_total)