Advertisement
Guest User

Untitled

a guest
May 30th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.71 KB | None | 0 0
  1. import csv
  2.  
  3.  
  4. #---------------- Cargado de datos en memoria --------------------#
  5.  
  6.  
  7. def crear_diccionario_supermercados(ruta_supermercado):
  8. '''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.'''
  9. diccionario_supermercados={}
  10. with open(ruta_supermercado) as supermercados:
  11. encabezado=supermercados.readline()
  12. for id,nombre_supermercado in csv.reader(supermercados):
  13. diccionario_supermercados[id]=nombre_supermercado
  14. return diccionario_supermercados
  15.  
  16. def crear_diccionario_productos(ruta_productos):
  17. '''Recibe por parametro la ruta del archivo "productos.csv" y el diccionario con los supermercados. '''
  18. diccionario_productos={}
  19. with open(ruta_productos) as productos:
  20. encabezado=productos.readline()
  21. for id,nombre_producto in csv.reader(productos):
  22. diccionario_productos[id]=nombre_producto
  23. return diccionario_productos
  24.  
  25. def crear_diccionario_precios(ruta_precios):
  26. '''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).'''
  27. diccionario_de_datos={}
  28. diccionario_de_productos={}
  29. diccionario_de_fechas={}
  30. with open(ruta_precios) as precios:
  31. encabezado=precios.readline()
  32. for id_supermercado,id_producto,fecha,precio in csv.reader(precios):
  33. diccionario_de_datos[id_supermercado]=diccionario_de_productos
  34. diccionario_de_productos[id_producto]=diccionario_de_fechas
  35. diccionario_de_fechas[fecha]=precio
  36. return diccionario_de_datos
  37.  
  38.  
  39. def cargar_datos_en_memoria(ruta_supermercados, ruta_productos, ruta_precios):
  40. '''Recibe las rutas de los tres archivos y crea los tres diccionarios.'''
  41. diccionario_de_datos=crear_diccionario_precios(ruta_precios)
  42. diccionario_de_supermercados=crear_diccionario_supermercados(ruta_supermercados)
  43. diccionario_de_productos=crear_diccionario_productos(ruta_productos)
  44. return diccionario_de_datos, diccionario_de_supermercados, diccionario_de_productos
  45.  
  46. # ----------------- Temas relacionados a fechas ---------------#
  47.  
  48.  
  49. def validar_dos_fechas():
  50. '''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.'''
  51. cantidad_de_fechas=0
  52. while cantidad_de_fechas != 2:
  53. fecha=pedir_fecha()
  54. if fecha.isdigit() and len(fecha)==6:
  55. cantidad_de_fechas+=1
  56. fecha_inicial=fecha
  57. else:
  58. print("Error de formato, pruebe de nuevo")
  59. if cantidad_de_fechas==2:
  60. fecha_final=fecha
  61. if fecha_inicial>fecha_final:
  62. fecha_final=fecha_inicial
  63. fecha_inicial=fecha
  64. return (fecha_inicial,fecha_final)
  65.  
  66. def pedir_fecha():
  67. '''Pide al usuario una fecha, la valida y las devuelve con el formato utilizable para el programa.'''
  68. lista_año_mes=[]
  69. while True:
  70. fecha=input('Seleccione una fecha inicial/final de un periodo para calcular su inflacion. Utilizar formato AAAA/MM (Año/Mes)')
  71. lista_año_mes=fecha.split("/")
  72. if len(lista_año_mes)==2:
  73. fecha=str(lista_año_mes[0])+str(lista_año_mes[1])
  74. break
  75. print ('Error de formato')
  76. return fecha
  77.  
  78. # ----------------------------- Inflacion General Promedio ------------------------------#
  79.  
  80. def calcular_inflacion_general_promedio(diccionario_de_datos,fecha_inicial,fecha_final):
  81. '''Calcula la inflacion general promedio de todos los supermercados dentro de un intervalo de tiempo. Devuelve el valor de la inflacion.'''
  82. precio_inicial=0
  83. precio_final=0
  84. for supermercado,producto in diccionario_de_datos.items():
  85. try:
  86. precio_inicial+=float(diccionario_de_datos[supermercado][producto][fecha_inicial])
  87. except:
  88. continue
  89. try:
  90. precio_final+=float(diccionario_de_datos[supermercado][producto][fecha_final])
  91. except:
  92. continue
  93. if precio_inicial==0:
  94. raise ZeroDivisionError("La fecha inicial ingresada corresponde a un precio que es 0")
  95. return (100*(precio_final-precio_inicial)/precio_inicial)
  96.  
  97.  
  98. def inflacion_general_promedio_main(diccionario_de_datos):
  99. '''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. '''
  100. print ("Bienvenido a Inflacion general promedio.")
  101. fecha_inicial,fecha_final=validar_dos_fechas()
  102. inflacion_general_promedio=calcular_inflacion_general_promedio(diccionario_de_datos,fecha_inicial,fecha_final)
  103. print("La inflacion general promedio es: " + str(inflacion_general_promedio))
  104.  
  105. # ------------------------- Inflacion por Supermercado ----------------------------------#
  106.  
  107.  
  108. def calcular_inflacion_por_supermercado(diccionario_de_datos,id_supermercado,fecha_inicial,fecha_final):
  109. '''Recibe el diccionario, la fecha inicial y la fecha final por parametro. Calcula y devuelve la inflacion por supermercado.'''
  110. precio_inicial=0
  111. precio_final=0
  112. for producto in diccionario_de_datos[id_supermercado]:
  113. if diccionario_de_datos[id_supermercado][producto][fecha_inicial]:
  114. precio_inicial+=float(diccionario_de_datos[id_supermercado][producto][fecha_inicial])
  115. if diccionario_de_datos[id_supermercado][producto][fecha_final]:
  116. precio_final+=float(diccionario_de_datos[id_supermercado][producto][fecha_final])
  117. return (100*(precio_final-precio_inicial)/precio_inicial)
  118.  
  119. def inflacion_por_supermercado_main(diccionario_de_supermercados, diccionario_de_datos):
  120. """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"""
  121. print ('Bienvenido a Inflacion por Supermercado.')
  122. fecha_inicial,fecha_final=validar_dos_fechas() # Aca ya tengo las dos fechas
  123. print ('La inflacion para cada supermercado dentro del intervalo introducido es:')
  124. for id in diccionario_de_supermercados:
  125. inflacion=calcular_inflacion_por_supermercado(diccionario_de_datos,id,fecha_inicial,fecha_final)
  126. print (diccionario_de_supermercados[id] + ': ' + str(inflacion) + '%')
  127.  
  128.  
  129. # ----------------------- Inflacion por Producto ---------------------------------------#
  130.  
  131.  
  132. def inflacion_por_producto_main(diccionario_de_productos, diccionario_de_supermercados, diccionario_de_datos):
  133. """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."""
  134. print ("Bienvenido a Inflacion por Producto.")
  135. fecha_inicial,fecha_final=validar_dos_fechas()
  136. producto_elegido, id_producto_elegido=seleccionar_producto_usuario(diccionario_de_productos)
  137. for id, nombre_supermercado in diccionario_de_supermercados.items():
  138. inflacion_por_producto=calcular_inflacion_por_producto(diccionario_de_datos,fecha_inicial,fecha_final, id_producto_elegido, id)
  139. print ("La inflacion de " + producto_elegido + " es de " + inflacion_por_producto + ' % en ' + nombre_supermercado)
  140.  
  141.  
  142. def pedir_producto():
  143. '''Pide un producto y chequea que sea un producto, y no otra cosa. Devuelve el producto elegido'''
  144. producto_elegido=""
  145. while len(producto_elegido)==0 and not str(producto_elegido).isdigit():
  146. producto_elegido=input("A que producto desea calcularle la inflacion?")
  147. print("Error. Reingrese el nombre de su producto")
  148. return producto_elegido
  149.  
  150.  
  151. def corroborar_existencia_del_producto(diccionario_de_productos):
  152. '''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.'''
  153. producto_elegido=str(pedir_producto())
  154. posibles_productos_elegidos=[]
  155. id_posibles_productos_elegidos=[]
  156. for id, producto in diccionario_de_productos.items():
  157. if producto_elegido in producto:
  158. producto=str(producto)
  159. posibles_productos_elegidos.append(producto)
  160. id_posibles_productos_elegidos.append(id)
  161. if posibles_productos_elegidos==[]:
  162. print ("No se encontro ningun producto similar")
  163. return posibles_productos_elegidos, id_posibles_productos_elegidos
  164.  
  165. def seleccionar_producto_usuario(diccionario_productos):
  166. '''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.'''
  167. lista_de_posibles_productos=[]
  168. while lista_de_posibles_productos==[]:
  169. lista_de_posibles_productos, id_posibles_productos_elegidos=corroborar_existencia_del_producto(diccionario_productos)
  170. contador=1
  171. for elemento in lista_de_posibles_productos:
  172. print (str(contador) + ". " + elemento)
  173. contador+=1
  174. while True:
  175. respuesta=input('¿Aparece el producto que estabas buscando? Ingrese su numero correspondiente: (Ingrese la palabra salir para abandonar la busqueda)')
  176. if not respuesta.isdigit() or not int(respuesta)<=len(lista_de_posibles_productos) or respuesta=='0':
  177. print('Respuesta invalida, ingrese su respuesta nuevamente')
  178. if respuesta.lower()=='salir':
  179. return ""
  180. else:
  181. print ('Usted eligió el producto: ' + lista_de_posibles_productos[int(respuesta)-1])
  182. return lista_de_posibles_productos[int(respuesta)-1], id_posibles_productos_elegidos[int(respuesta)-1]
  183.  
  184. def calcular_inflacion_por_producto(diccionario_de_datos,fecha_inicial,fecha_final, id_producto_elegido, id_supermercado):
  185. '''Recibe el diccionario de productos, la fecha inicial y la fecha final por parametro. Calcula la inflacion de ese producto y la imprime.'''
  186. if id_producto_elegido=="":
  187. return
  188. precio_inicial=0
  189. precio_final=0
  190. precio_inicial+=diccionario_de_datos[id_supermercado][int(id_producto_elegido)][fecha_inicial]
  191. precio_final+=diccionario_de_datos[id_supermercado][int(id_producto_elegido)][fecha_final]
  192. return (100*(precio_final-precio_inicial)/precio_inicial)
  193.  
  194.  
  195. # ----------------------- Mejor precio para un producto ---------------------------------------#
  196.  
  197.  
  198. def mejor_precio_para_un_producto_main(diccionario_de_productos, diccionario_de_datos, diccionario_de_supermercados):
  199. '''Recibe el diccionario de productos, de datos y de supermercados por parametro. Calcula el mejor precio para un producto y lo imprime.'''
  200. print('Bienvenido a mejor precio para un producto')
  201. fecha_elegida=pedir_fecha()
  202. producto_elegido,id_producto_elegido=seleccionar_producto_usuario(diccionario_de_productos)
  203. mejor_precio=diccionario_de_datos["1"][id_producto_elegido][fecha_elegida]
  204. mejor_supermercado=diccionario_de_supermercados["1"]
  205. for id, nombre_supermercado in diccionario_de_supermercados.items():
  206. if diccionario_de_datos[id][id_producto_elegido][fecha_elegida] < mejor_precio:
  207. mejor_precio=diccionario_de_datos[id][id_producto_elegido][fecha_elegida]
  208. mejor_supermercado=diccionario_de_supermercados[id]
  209. 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)
  210.  
  211.  
  212. # ----------------------------- Main ----------------------------------#
  213.  
  214.  
  215. def imprimir_menu():
  216. '''Imprime el menu'''
  217. print ("Menu principal")
  218. print ("------")
  219. print ("1. Inflación por supermercado")
  220. print ("2. Inflación por producto")
  221. print ("3. Inflación general promedio")
  222. print ("4. Mejor precio para un producto")
  223. print ("5. Salir")
  224. print ("Opción:")
  225. print ("------")
  226.  
  227.  
  228. def main():
  229. '''Función principal del programa'''
  230. opcion_elegida=0
  231. diccionario_de_datos, diccionario_de_supermercados, diccionario_de_productos=cargar_datos_en_memoria(ruta_supermercado, ruta_productos,ruta_precios)
  232. while opcion_elegida!=5:
  233. imprimir_menu()
  234. opcion_elegida=input('Seleccione una opcion: ')
  235. while opcion_elegida.isdigit() and 5 >= int(opcion_elegida) >= 1:
  236. if opcion_elegida=="1": #Inflacion por Supermercado
  237. inflacion_por_supermercado_main(diccionario_de_supermercados, diccionario_de_datos)
  238. elif opcion_elegida=="2": #Inflacion por Producto
  239. inflacion_por_producto_main(diccionario_de_productos, diccionario_de_supermercados, diccionario_de_datos)
  240. elif opcion_elegida=="3": #Inflacion general promedio
  241. inflacion_general_promedio_main(diccionario_de_datos)
  242. elif opcion_elegida=="4": #Mejor precio para un producto
  243. mejor_precio_para_un_producto_main(diccionario_de_productos, diccionario_de_datos, diccionario_de_supermercados)
  244. elif opcion_elegida=="5": #Salir
  245. exit()
  246. imprimir_menu()
  247. opcion_elegida=input("Seleccione una nueva opcion: ")
  248. opcion_elegida=input('El valor ingresado no es correcto, seleccione una opcion de las disponibles: ')
  249.  
  250. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement