Cómo Elegir tu Próxima Comida Como un Científico de Datos
Esta publicación fue escrita en colaboración con Fausto Mañón. Puedes encontrar su cuenta de Medium aquí. You can read the this article in English, here.
Fausto y yo estamos sentados allí, trabajando en nuestros respectivos proyectos finales. Es un martes por la noche y con solo una semana restante en nuestro programa de ciencia de datos, necesitábamos cada minuto que pudiéramos obtener. Fue entonces cuando comenzó el hambre. Como de costumbre, con esa hambre vino el proceso tan maravilloso de elegir un lugar para ir a comer. Como de costumbre, con esa hambre vino el proceso de elegir un lugar para ir a comer. Como siempre con este tipo de decisiones, Fausto y yo somos indecisos. Así que, como cualquier buen científico de datos, “construimos un modelo” para eliminar nuestra opinión personal.
… Y cuando decimos “modelo”, nos referimos al uso de una función conocida como choice()
que proviene de un subpaquete de numpy
, llamado random
, para determinar a dónde ir a comer.
import numpy as npfood = ['pizza',
'chinese',
'mcdonalds',
'chicken place next to the arepa place',
'dos toros',
'chickfilla',
'mexique',
'smashburger',
'shake shack',
'shortys']# Obvio elegimos las posibilidades MÁS saludables que conocemos
np.random.choice(food)
Entonces, después de importar numpy
en un cuaderno Jupyter, creamos una lista de lugares para comer en el área. Después de eso, random.choice()
seleccionó al azar el siguiente lugar:
'mcdonalds'
Por supuesto, no estábamos satisfechos con el resultado, ya que era una conclusión demasiado fácil de alcanzar. Así que pensamos en un escenario de “el mejor de tres”. Y así de fácil, nos habíamos comprometido a complicar las cosas, ¿por qué no? No es que tengamos un proyecto final que terminar o cualquier cosa urgente.
Como estamos creando una función, primero definamos nuestra función y sus argumentos. food_list
es la lista de lugares a los que queremos ir y count
es el número de instancias que queremos observar para elegir un lugar, con el valor predeterminado de ser “el mejor de tres”.
def get_food(food_list, count = 3):
Comenzaremos la función utilizando un “dictionary comprehension” para realizar un seguimiento a las veces que cada lugar es elegido. Las llaves del diccionario son nuestras opciones de comer y su valor respectivo es la cantidad de veces que se eligió al azar .
food_dict= {item:0 for item in food_list}
¿Por qué un diccionario? Bueno, dado que queremos hacer un escenario de “mejor de x veces”, eventualmente tendremos esos ceros iniciales convertidos en números que representan la cantidad de veces que se seleccionó al azar una llave en particular. Un ejemplo rápido sería si tuviéramos que elegir el mejor de tres entre 'pizza'
y 'chinese food'
, y la pizza fue elegida 3 veces al azar, el diccionario terminaría luciendo así:
{'pizza': 3,
'chinese' : 1}
Como 'pizza'
fue seleccionada al azar más veces que cualquier otra opción en la lista, nuestra función devolvería 'pizza'
como el lugar para ir a comer.
El siguiente paso en nuestra función get_food
es un ciclo while
.
while max(list(food_dict.values())) < count:
increment = np.random.choice(food_list)
food_dict[increment] += 1
Vamos a explicar el código desde arriba … mientras que el valor máximo en nuestro diccionario (inicialmente 0 cuando creamos el diccionario) es menor que el escenario “mejor-de-x” (count = 3
), elegiremos un lugar de food_list
al azar y aumentaremos el valor en el diccionario, correspondiente a ese nombre, por 1. El primer lugar de comida que alcance el conteo deseado será nuestro ganador.
Finalmente, usando un “list comprehension”, necesitamos terminar la función con una declaración de retorno que nos dará lo que queremos saber: ¡dónde ir a comer!
return [place for place in food_list if food_dict[place] == count]
Entonces, al juntar todas las piezas de código, el código final se parece a algo así:
food = ['pizza',
'chinese',
'mcd',
'chicken place next to the arepa place',
'dos toros',
'chickfilla',
'mexique',
'smashburger',
'shake shack',
'phillys']# Recuerda, ¡solo alimentos saludables!
# Obvio elegimos las posibilidades MÁS saludables que conocemosdef get_food(food_list, count = 3):
food_dict= {item:0 for item in food_list}
while max(list(food_dict.values())) < count:
increment = np.random.choice(food_list)
food_dict[increment] += 1
return [place for place in food_list if food_dict[place] == count]
Y ahora el momento de la verdad. Pasaremos la lista de alimentos a la función y haremos que haga un escenario de “mejor de 15”.
get_food(food, count = 15)
Nuestra función nos dice a Fausto y a mí que debemos comprar comida de …
['shake shack']
Para una futura implementación de la función, estábamos pensando en hacer que get_food
comience con que el usuario proporcione opciones para que luego podamos convertirnos en un diccionario. Desde una perspectiva de código, esto permite escalabilidad y un enfoque sencillo, ya que no tendríamos que volver constantemente al código y modificar la lista, lo que sería un dolor de cabeza, dado que las ubicaciones pueden cambiar, lo que significa que las opciones de alimentos pueden cambiar también.
Además, en realidad no logramos eliminar ningún sesgo de nuestra decisión, ya que la lista de alimentos comenzó con una lista limitada de las primeras opciones que se nos ocurrieron. Un enfoque para hacer que la lista sea más objetiva puede ser usar la ubicación y el tiempo para proporcionar una lista de los restaurantes abiertos actualmente. Pero eso es un poco complicado, dado que son las 9:00 p.m. de un martes por la noche
Entonces, lo que inicialmente comenzó como dos personas indecisas que se unieron para tomar una decisión sobre dónde ir a comer, se convirtió en una sesión de solución de problemas de 30 minutos mientras estábamos construyendo la función get_food
.
Tal vez estábamos aburridos, tal vez teníamos demasiada hambre para decidir, o tal vez …
Independientemente del por qué, lo único que sabemos es que queremos disfrutar de nuestras deliciosas hamburguesas ahora … ¡ah, y trabajar en nuestros proyectos finales también!