Indice / Practicas / EJ-7.4
EJ-7.4 · CSV europeo y viaje de ida y vuelta
Escribir las ventas en el formato que pide un destino europeo, y demostrar que el archivo está bien volviéndolo a leer. La comprobación de ida y vuelta no es un extra: es el ejercicio.
Qué hay que hacer
A partir de ventas_mensuales.csv, producir dos archivos:
ventas_es.csv- las 180 ventas con punto y coma como separador y coma decimal.ventas_ida_vuelta.csv- el mismo archivo leído de nuevo y escrito en formato normal.
ELI5Explicado facil
Es como traducir un texto y volver a traducirlo al idioma original. Si vuelve igual, la traducción no perdió nada.
El segundo archivo no es el entregable: es la prueba de que el primero está bien. Si la vuelta no coincide, algo se rompió en la ida.
Archivos
- Entrada ·
ventas_mensuales.csv - Objetivo ·
ventas_es.csv - Objetivo ·
ventas_ida_vuelta.csv - Herramienta ·
comparar.py
La comprobación
Escribís con sep=";" y decimal=",", y leés el mismo
archivo declarando lo mismo. Después
pd.testing.assert_frame_equal(tabla, vuelta).
Si pasa, el archivo europeo conserva todos los datos. Si falla, te dice qué columna y qué fila - y lo importante: te lo dice antes de mandarle el archivo al destino.
Cómo saber si te salió
python comparar.py mi_ida_vuelta.csv ventas_ida_vuelta.csv
Ese archivo es el que se compara. El europeo se verifica solo: si la vuelta coincide, la ida estaba bien.
Antes de arrancar, mirá los datos
| fecha | vendedor | producto | unidades | precio_unitario |
|---|---|---|---|---|
| 2026-03-02 | Carlos Ruiz | Auriculares | 1 | 57.24 |
| 2026-03-26 | Carlos Ruiz | Auriculares | 5 | 57.73 |
| 2026-03-31 | Beatriz Molina | Auriculares | 1 | 59.37 |
| 2026-02-09 | Lucía Vega | Webcam | 6 | 45.42 |
| 2026-03-27 | Carlos Ruiz | Laptop | 7 | 914.44 |
El contrato de salida
ventas_es.csv · 180 filas
| Columna | Tipo | Que lleva |
|---|---|---|
fila_origen | entero | Posicion en el archivo de entrada, empezando en 0 |
fecha | texto | Tal cual viene. Puede quedar vacia |
vendedor | texto | Tal cual viene |
producto | texto | Tal cual viene |
unidades | entero | Tal cual viene. Puede quedar vacia |
precio_unitario | decimal | Redondeado a 2 decimales, con COMA decimal |
importe | decimal | unidades por precio, 2 decimales, con COMA decimal |
ventas_ida_vuelta.csv · 180 filas
| Columna | Tipo | Que lleva |
|---|---|---|
fila_origen | entero | El mismo |
fecha | texto | El mismo |
vendedor | texto | El mismo |
producto | texto | El mismo |
unidades | entero | El mismo |
precio_unitario | decimal | El mismo, ahora con punto decimal |
importe | decimal | El mismo, ahora con punto decimal |
Que hacer con cada defecto
| Defecto | Donde | Accion | Adonde va |
|---|---|---|---|
| 4 fechas vacias, 1 fecha invalida y 1 en otro formato | 6 filas | NO NO se validan: este ejercicio cambia el formato del archivo, no los datos. La fecha se escribe tal cual | los dos archivos |
| 1 unidad ausente y 2 precios ausentes | 3 filas | el el importe de esas filas queda ausente y se escribe como campo vacio | los dos archivos |
| la fecha ausente NO se rellena con cadena vacia | 4 filas | en en un CSV una cadena vacia y un ausente se escriben igual, y al releer la diferencia se pierde. Rellenar romperia la comprobacion de ida y vuelta | los dos archivos |
| unidades negativas | 2 filas | NO NO se validan: pasan tal cual y su importe es negativo | los dos archivos |
Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:
- agregar fila_origen y calcular el importe
- redondear precio e importe a 2 decimales
- escribir con sep=';' y decimal=','
- volver a leer declarando el mismo sep y decimal
- assert_frame_equal entre lo que se escribio y lo que se leyo
El assert es el ejercicio: si el archivo europeo esta bien escrito, leerlo con el mismo formato reconstruye la tabla exacta. Si falla, el archivo perdio o deformo algun dato, y la comprobacion lo dice antes de que el destino lo reciba.
Conteos clave
| filas de entrada | 180 |
|---|---|
| ventas_es.csv | 180 |
| ventas_ida_vuelta.csv | 180 |
| importes ausentes | 3 |
| fechas ausentes | 4 |
| por motivo |
Invariantes
Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:
len(europeo_lineas) == 181
len(vuelta) == 180
';' in primera_linea_del_europeo
',' in la_celda_de_precio_del_europeo
vuelta['fila_origen'].is_unique
list(vuelta['fila_origen']) == list(range(180))
int(vuelta['importe'].isna().sum()) == 3
abs(vuelta['importe'].sum() - tabla['importe'].sum()) < 0.01
PISTASSi te trabas, abri esto
- Sin thousands, un numero con punto de miles no se puede convertir. Aca no hay miles con punto porque lo escribimos nosotros, pero al leer un archivo ajeno hay que declararlo.
- No rellenes la fecha ausente con cadena vacia: en un CSV los dos se escriben igual y la ida y vuelta deja de cerrar.
- assert_frame_equal con check_dtype=False alcanza: lo que se comprueba es que los VALORES sobrevivan al formato.
- Si el assert falla, no cambies el assert: el que esta mal es el archivo.
Así tiene que quedar
| fila_origen | fecha | vendedor | producto | unidades | precio_unitario | importe |
|---|---|---|---|---|---|---|
| 0 | 2026-03-02 | Carlos Ruiz | Auriculares | 1 | 57.24 | 57.24 |
| 1 | 2026-03-26 | Carlos Ruiz | Auriculares | 5 | 57.73 | 288.65 |
| 2 | 2026-03-31 | Beatriz Molina | Auriculares | 1 | 59.37 | 59.37 |
| 3 | 2026-02-09 | Lucía Vega | Webcam | 6 | 45.42 | 272.52 |
| 4 | 2026-03-27 | Carlos Ruiz | Laptop | 7 | 914.44 | 6401.08 |
Es tentador - queda más prolijo - y rompe la ida y vuelta. En un CSV, una cadena vacía y un valor ausente se escriben exactamente igual: dos comas seguidas. Al releer, no hay forma de distinguirlos, y pandas devuelve un ausente.
Así que fillna("") antes de escribir hace que la vuelta nunca coincida
con la ida. Es un caso donde la comprobación te enseña algo del formato que no se ve
mirando el archivo.
assert falla, el que está mal es el archivo
La tentación es aflojar la comprobación - sacar una columna, bajar la precisión - hasta que pase. Eso convierte una prueba en un adorno.
La comprobación existe justamente para el caso en que falla. Cuando falla, encontró algo.