Ejercicio resuelto con Python - Facturación media con archivos CSV
Hoy vamos a resolver un ejercicio con Python en donde vamos a trabajar con diccionarios, archivos CSV y métodos de ordenamiento.
El ejercicio en cuestión dice así:
Se dispone de un CSV con información fiscal de una empresa en diferentes años. Dicha información corresponde a la facturación de la empresa por cada uno de los trimestres.
Se pide escribir en Python que:
Entonces tenemos que leer el CSV y cargarlo a una lista.
Cada elemento de la lista será una fila del CSV pero ya interpretado, así que antes de agregarlo a la lista con append vamos a separarlo con split y convertir sus valores numéricos a floantes y enteros.
Luego de eso ya tendremos una lista con los datos del CSV.
A esta lista ya la podemos recorrer y calcular la media (son 4 trimestres, se suman y se dividen entre 4), además de que ya se puede ordenar o escribir en un archivo.
Los datos son los que se pueden ver en este enlace. Los dejé por separado porque harían muy largo el post.
Comencemos viendo cómo convertir el CSV a lista. Queda así:
def obtener_lista_facturacion():
lista = []
with open(NOMBRE_ARCHIVO) as archivo:
next(archivo)
for linea in archivo:
datos_separados = linea.split(";")
año = int(datos_separados[0])
trimestre1 = float(datos_separados[1])
trimestre2 = float(datos_separados[2])
trimestre3 = float(datos_separados[3])
trimestre4 = float(datos_separados[4])
lista.append({
"año": año,
"trimestre1": trimestre1,
"trimestre2": trimestre2,
"trimestre3": trimestre3,
"trimestre4": trimestre4,
})
return lista
Por cierto, en la línea 4 estamos omitiendo el encabezado del archivo.
Ahora que ya tenemos el CSV como una lista de Python podemos calcular la media, que es la suma de los elementos entre la cantidad de los mismos.
El código queda así:
def imprimir_años_con_media():
lista = obtener_lista_facturacion()
for elemento in lista:
año = elemento["año"]
media = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"]) / 4
print(f"Año {año} facturación media de {media} euros")
Simplemente invocamos a la lista anterior y la recorremos. Luego calculamos la media en la línea 5 y la imprimimos en la línea 7.
Ahora veamos el último punto de este ejercicio en Python. Debemos obtener la facturación total del año, ordenarla por año de manera descendente y luego escribirla en un archivo.
En este caso usaré el método de la burbuja para el ordenamiento, pero se podría usar cualquiera de los que aparecen en mi otro post.
Una vez que la lista está ordenada, la escribimos en un archivo.
def burbuja(arreglo):
longitud = len(arreglo)
for i in range(longitud):
for indice_actual in range(longitud - 1):
indice_siguiente_elemento = indice_actual + 1
if arreglo[indice_actual]["año"] < arreglo[indice_siguiente_elemento]["año"]:
arreglo[indice_siguiente_elemento], arreglo[indice_actual] = arreglo[indice_actual], arreglo[indice_siguiente_elemento]
def guardar_años_cronologicamente():
lista = obtener_lista_facturacion()
burbuja(lista)
with open(NOMBRE_ARCHIVO_ESCRITURA, "w", encoding="utf-8") as archivo:
for elemento in lista:
año = elemento["año"]
total = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"])
archivo.write(f"Año {año} facturación anual de: {total} euros.\n")
Toma en cuenta que en este caso estamos escribiendo la facturación anual total, y para el caso anterior era la media de los 4 trimestres.
El código completo queda como se ve a continuación. Recuerda que necesitas el archivo CSV en la misma ubicación que el script de Python para que esto funcione.
# https://parzibyte.me/blog
NOMBRE_ARCHIVO = "datos.csv"
NOMBRE_ARCHIVO_ESCRITURA = "documento.txt"
def obtener_lista_facturacion():
lista = []
with open(NOMBRE_ARCHIVO) as archivo:
next(archivo)
for linea in archivo:
datos_separados = linea.split(";")
año = int(datos_separados[0])
trimestre1 = float(datos_separados[1])
trimestre2 = float(datos_separados[2])
trimestre3 = float(datos_separados[3])
trimestre4 = float(datos_separados[4])
lista.append({
"año": año,
"trimestre1": trimestre1,
"trimestre2": trimestre2,
"trimestre3": trimestre3,
"trimestre4": trimestre4,
})
return lista
def imprimir_años_con_media():
lista = obtener_lista_facturacion()
for elemento in lista:
año = elemento["año"]
media = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"]) / 4
print(f"Año {año} facturación media de {media} euros")
def burbuja(arreglo):
longitud = len(arreglo)
for i in range(longitud):
for indice_actual in range(longitud - 1):
indice_siguiente_elemento = indice_actual + 1
if arreglo[indice_actual]["año"] < arreglo[indice_siguiente_elemento]["año"]:
arreglo[indice_siguiente_elemento], arreglo[indice_actual] = arreglo[indice_actual], arreglo[indice_siguiente_elemento]
def guardar_años_cronologicamente():
lista = obtener_lista_facturacion()
burbuja(lista)
with open(NOMBRE_ARCHIVO_ESCRITURA, "w", encoding="utf-8") as archivo:
for elemento in lista:
año = elemento["año"]
total = (elemento["trimestre1"] + elemento["trimestre2"] +
elemento["trimestre3"] + elemento["trimestre4"])
archivo.write(f"Año {año} facturación anual de: {total} euros.\n")
def main():
opciones = "1. Imprimir años con media\n2. Guardar años cronológicamente\n3. Salir\nElige: "
eleccion = ""
while eleccion != "3":
eleccion = input(opciones)
if eleccion == "1":
imprimir_años_con_media()
elif eleccion == "2":
guardar_años_cronologicamente()
main()
Te dejo más ejercicios de Python en mi blog en caso de que quieras aprender más sobre este maravilloso lenguaje.
En este post te quiero compartir un código de C++ para listar y cancelar trabajos…
Gracias a WebAssembly podemos ejecutar código de otros lenguajes de programación desde el navegador web…
Revisando y buscando maneras de imprimir un PDF desde la línea de comandos me encontré…
Esta semana estuve recreando la API del plugin para impresoras térmicas en Android (HTTP a…
Hoy te enseñaré a extraer la cadena base64 de una clave PEM usando una función…
Encender un foco con un Bot de Telegram es posible usando una tarjeta como la…
Esta web usa cookies.