Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import csv
- #---------------- Cargado de datos en memoria --------------------#
- def crear_diccionario_supermercados(ruta_supermercado):
- '''Recibe por parémtro la ruta del archivo "supermercados.csv". Lo abre y lo transforma en un diccionario cuya clave va a ser el nombre del supermercado.'''
- diccionario_supermercados={}
- with open(ruta_supermercado) as supermercados:
- encabezado=supermercados.readline()
- for id,nombre_supermercado in csv.reader(supermercados):
- diccionario_supermercados[id]=nombre_supermercado
- return diccionario_supermercados
- def crear_diccionario_productos(ruta_productos):
- '''Recibe por parametro la ruta del archivo "productos.csv" y el diccionario con los supermercados. '''
- diccionario_productos={}
- with open(ruta_productos) as productos:
- encabezado=productos.readline()
- for id,nombre_producto in csv.reader(productos):
- diccionario_productos[id]=nombre_producto
- return diccionario_productos
- def crear_diccionario_precios(ruta_precios):
- '''Recibe la ruta del archivo "precios.csv", la ruta del archivo "productos.csv" y la ruta del archivo "supermercados.csv" por parametro. Crea tres diccionarios y mete diccionarios adentro de diccionarios. Finalmente, devuelve el diccionario de datos, que contiene a los otros dos (productos y fechas).'''
- diccionario_de_datos={}
- diccionario_de_productos={}
- diccionario_de_fechas={}
- with open(ruta_precios) as precios:
- encabezado=precios.readline()
- for id_supermercado,id_producto,fecha,precio in csv.reader(precios):
- diccionario_de_datos[id_supermercado]=diccionario_de_productos
- diccionario_de_productos[id_producto]=diccionario_de_fechas
- diccionario_de_fechas[fecha]=precio
- return diccionario_de_datos
- def cargar_datos_en_memoria(ruta_supermercados, ruta_productos, ruta_precios):
- '''Recibe las rutas de los tres archivos y crea los tres diccionarios.'''
- diccionario_de_datos=crear_diccionario_precios(ruta_precios)
- diccionario_de_supermercados=crear_diccionario_supermercados(ruta_supermercados)
- diccionario_de_productos=crear_diccionario_productos(ruta_productos)
- return diccionario_de_datos, diccionario_de_supermercados, diccionario_de_productos
- # ----------------- Temas relacionados a fechas ---------------#
- def validar_dos_fechas():
- '''Valida que dos fechas ingresadas correspondan a un intervalo de tiempo para ser utilizado en el calculo de inflaciones. Devuelve ambas fechas en modo de tupla.'''
- cantidad_de_fechas=0
- while cantidad_de_fechas != 2:
- fecha=pedir_fecha()
- if fecha.isdigit() and len(fecha)==6:
- cantidad_de_fechas+=1
- fecha_inicial=fecha
- else:
- print("Error de formato, pruebe de nuevo")
- if cantidad_de_fechas==2:
- fecha_final=fecha
- if fecha_inicial>fecha_final:
- fecha_final=fecha_inicial
- fecha_inicial=fecha
- return (fecha_inicial,fecha_final)
- def pedir_fecha():
- '''Pide al usuario una fecha, la valida y las devuelve con el formato utilizable para el programa.'''
- lista_año_mes=[]
- while True:
- fecha=input('Seleccione una fecha inicial/final de un periodo para calcular su inflacion. Utilizar formato AAAA/MM (Año/Mes)')
- lista_año_mes=fecha.split("/")
- if len(lista_año_mes)==2:
- fecha=str(lista_año_mes[0])+str(lista_año_mes[1])
- break
- print ('Error de formato')
- return fecha
- # ----------------------------- Inflacion General Promedio ------------------------------#
- def calcular_inflacion_general_promedio(diccionario_de_datos,fecha_inicial,fecha_final):
- '''Calcula la inflacion general promedio de todos los supermercados dentro de un intervalo de tiempo. Devuelve el valor de la inflacion.'''
- precio_inicial=0
- precio_final=0
- for supermercado,producto in diccionario_de_datos.items():
- try:
- precio_inicial+=float(diccionario_de_datos[supermercado][producto][fecha_inicial])
- except:
- continue
- try:
- precio_final+=float(diccionario_de_datos[supermercado][producto][fecha_final])
- except:
- continue
- if precio_inicial==0:
- raise ZeroDivisionError("La fecha inicial ingresada corresponde a un precio que es 0")
- return (100*(precio_final-precio_inicial)/precio_inicial)
- def inflacion_general_promedio_main(diccionario_de_datos):
- '''Es la funcion a la que va a llamar main() para calcular la inflacion general promedio. Recibe por parametro el diccionario de datos. Imprime la inflacion general promedio. '''
- print ("Bienvenido a Inflacion general promedio.")
- fecha_inicial,fecha_final=validar_dos_fechas()
- inflacion_general_promedio=calcular_inflacion_general_promedio(diccionario_de_datos,fecha_inicial,fecha_final)
- print("La inflacion general promedio es: " + str(inflacion_general_promedio))
- # ------------------------- Inflacion por Supermercado ----------------------------------#
- def calcular_inflacion_por_supermercado(diccionario_de_datos,id_supermercado,fecha_inicial,fecha_final):
- '''Recibe el diccionario, la fecha inicial y la fecha final por parametro. Calcula y devuelve la inflacion por supermercado.'''
- precio_inicial=0
- precio_final=0
- for producto in diccionario_de_datos[id_supermercado]:
- if diccionario_de_datos[id_supermercado][producto][fecha_inicial]:
- precio_inicial+=float(diccionario_de_datos[id_supermercado][producto][fecha_inicial])
- if diccionario_de_datos[id_supermercado][producto][fecha_final]:
- precio_final+=float(diccionario_de_datos[id_supermercado][producto][fecha_final])
- return (100*(precio_final-precio_inicial)/precio_inicial)
- def inflacion_por_supermercado_main(diccionario_de_supermercados, diccionario_de_datos):
- """Es la funcion a la que va a llamar main() para calcular la inflacion por supermercado.Esta funcion recibe el diccionario de supermercados y el diccionario de datos por parametro e imprime la inflacion por supermercado"""
- print ('Bienvenido a Inflacion por Supermercado.')
- fecha_inicial,fecha_final=validar_dos_fechas() # Aca ya tengo las dos fechas
- print ('La inflacion para cada supermercado dentro del intervalo introducido es:')
- for id in diccionario_de_supermercados:
- inflacion=calcular_inflacion_por_supermercado(diccionario_de_datos,id,fecha_inicial,fecha_final)
- print (diccionario_de_supermercados[id] + ': ' + str(inflacion) + '%')
- # ----------------------- Inflacion por Producto ---------------------------------------#
- def inflacion_por_producto_main(diccionario_de_productos, diccionario_de_supermercados, diccionario_de_datos):
- """Es la funcion a la que va a llamar main() para calcular la inflacion por producto. Recibe el diccionario de productos, de supermercados y de datos.Imprime la inflacion por producto."""
- print ("Bienvenido a Inflacion por Producto.")
- fecha_inicial,fecha_final=validar_dos_fechas()
- producto_elegido, id_producto_elegido=seleccionar_producto_usuario(diccionario_de_productos)
- for id, nombre_supermercado in diccionario_de_supermercados.items():
- inflacion_por_producto=calcular_inflacion_por_producto(diccionario_de_datos,fecha_inicial,fecha_final, id_producto_elegido, id)
- print ("La inflacion de " + producto_elegido + " es de " + inflacion_por_producto + ' % en ' + nombre_supermercado)
- def pedir_producto():
- '''Pide un producto y chequea que sea un producto, y no otra cosa. Devuelve el producto elegido'''
- producto_elegido=""
- while len(producto_elegido)==0 and not str(producto_elegido).isdigit():
- producto_elegido=input("A que producto desea calcularle la inflacion?")
- print("Error. Reingrese el nombre de su producto")
- return producto_elegido
- def corroborar_existencia_del_producto(diccionario_de_productos):
- '''Recibe el diccionario de productos por parametro. Corrobora que el producto elegido en la funcion pedir_producto() este en el diccionario y si ademas hay productos similares o no. En el caso de existir los productos similares, crea una lista con los posibles productos elegidos y la devuelve.'''
- producto_elegido=str(pedir_producto())
- posibles_productos_elegidos=[]
- id_posibles_productos_elegidos=[]
- for id, producto in diccionario_de_productos.items():
- if producto_elegido in producto:
- producto=str(producto)
- posibles_productos_elegidos.append(producto)
- id_posibles_productos_elegidos.append(id)
- if posibles_productos_elegidos==[]:
- print ("No se encontro ningun producto similar")
- return posibles_productos_elegidos, id_posibles_productos_elegidos
- def seleccionar_producto_usuario(diccionario_productos):
- '''Recibe el diccionario de productos por parametro y le pregunta al usuario si alguno de los productos de la lista de posibles productos es el que estaba buscando. Finalmente, imprime el nombre del producto elegido y lo devuelve.'''
- lista_de_posibles_productos=[]
- while lista_de_posibles_productos==[]:
- lista_de_posibles_productos, id_posibles_productos_elegidos=corroborar_existencia_del_producto(diccionario_productos)
- contador=1
- for elemento in lista_de_posibles_productos:
- print (str(contador) + ". " + elemento)
- contador+=1
- while True:
- respuesta=input('¿Aparece el producto que estabas buscando? Ingrese su numero correspondiente: (Ingrese la palabra salir para abandonar la busqueda)')
- if not respuesta.isdigit() or not int(respuesta)<=len(lista_de_posibles_productos) or respuesta=='0':
- print('Respuesta invalida, ingrese su respuesta nuevamente')
- if respuesta.lower()=='salir':
- return ""
- else:
- print ('Usted eligió el producto: ' + lista_de_posibles_productos[int(respuesta)-1])
- return lista_de_posibles_productos[int(respuesta)-1], id_posibles_productos_elegidos[int(respuesta)-1]
- def calcular_inflacion_por_producto(diccionario_de_datos,fecha_inicial,fecha_final, id_producto_elegido, id_supermercado):
- '''Recibe el diccionario de productos, la fecha inicial y la fecha final por parametro. Calcula la inflacion de ese producto y la imprime.'''
- if id_producto_elegido=="":
- return
- precio_inicial=0
- precio_final=0
- precio_inicial+=diccionario_de_datos[id_supermercado][int(id_producto_elegido)][fecha_inicial]
- precio_final+=diccionario_de_datos[id_supermercado][int(id_producto_elegido)][fecha_final]
- return (100*(precio_final-precio_inicial)/precio_inicial)
- # ----------------------- Mejor precio para un producto ---------------------------------------#
- def mejor_precio_para_un_producto_main(diccionario_de_productos, diccionario_de_datos, diccionario_de_supermercados):
- '''Recibe el diccionario de productos, de datos y de supermercados por parametro. Calcula el mejor precio para un producto y lo imprime.'''
- print('Bienvenido a mejor precio para un producto')
- fecha_elegida=pedir_fecha()
- producto_elegido,id_producto_elegido=seleccionar_producto_usuario(diccionario_de_productos)
- mejor_precio=diccionario_de_datos["1"][id_producto_elegido][fecha_elegida]
- mejor_supermercado=diccionario_de_supermercados["1"]
- for id, nombre_supermercado in diccionario_de_supermercados.items():
- if diccionario_de_datos[id][id_producto_elegido][fecha_elegida] < mejor_precio:
- mejor_precio=diccionario_de_datos[id][id_producto_elegido][fecha_elegida]
- mejor_supermercado=diccionario_de_supermercados[id]
- print ('El supermercado que ofrece el mejor precio para su producto en la fecha ' + fecha_elegida + ' es ' + mejor_supermercado + ' a un precio de ' + mejor_precio)
- # ----------------------------- Main ----------------------------------#
- def imprimir_menu():
- '''Imprime el menu'''
- print ("Menu principal")
- print ("------")
- print ("1. Inflación por supermercado")
- print ("2. Inflación por producto")
- print ("3. Inflación general promedio")
- print ("4. Mejor precio para un producto")
- print ("5. Salir")
- print ("Opción:")
- print ("------")
- def main():
- '''Función principal del programa'''
- opcion_elegida=0
- diccionario_de_datos, diccionario_de_supermercados, diccionario_de_productos=cargar_datos_en_memoria(ruta_supermercado, ruta_productos,ruta_precios)
- while opcion_elegida!=5:
- imprimir_menu()
- opcion_elegida=input('Seleccione una opcion: ')
- while opcion_elegida.isdigit() and 5 >= int(opcion_elegida) >= 1:
- if opcion_elegida=="1": #Inflacion por Supermercado
- inflacion_por_supermercado_main(diccionario_de_supermercados, diccionario_de_datos)
- elif opcion_elegida=="2": #Inflacion por Producto
- inflacion_por_producto_main(diccionario_de_productos, diccionario_de_supermercados, diccionario_de_datos)
- elif opcion_elegida=="3": #Inflacion general promedio
- inflacion_general_promedio_main(diccionario_de_datos)
- elif opcion_elegida=="4": #Mejor precio para un producto
- mejor_precio_para_un_producto_main(diccionario_de_productos, diccionario_de_datos, diccionario_de_supermercados)
- elif opcion_elegida=="5": #Salir
- exit()
- imprimir_menu()
- opcion_elegida=input("Seleccione una nueva opcion: ")
- opcion_elegida=input('El valor ingresado no es correcto, seleccione una opcion de las disponibles: ')
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement