Closed Carmen-r closed 3 years ago
Holaaaaa Carmen 🙋♀️. Vamos a por el proyecto de este finde! 🔥🔥
¿!¿!¿!Qué ha pasado con el readme?!?!?!!? El principal objetivo del readme es una guía rápida para los que van a ver tu proyecto y para saber como usar tu código. Tips importantes para esta parte del proyecto: que vaya al grano, sea conciso y muy muy claro.
Es lo que la gente va a ver de ti y de tu proyecto! Dale duro a esta parte y el proyecto te quedará perfect!
En general la estructura del repo esta perfect Carmen:
Tienes todos los archivos en el .gitignore
y los tokens bien escondiditos 👏👏
Los jupyters numerados, me encanta! Ayuda mucho a saber cual es el flujo de trabajo 🔥
Enhorabuena Carmen tienes un repo de 10 en esta parte, suuper bien organizado!
Vamos con el código:
Empiezas filtrando la base de datos de companies para buscar aquellas que cumplan una serie de requisitos lo cual esta perfect
Luego pasas toda la info a un dataframe y limpias aquellas empresas que no tienen lat y long. Como lo tienes esta perfect.
Como detalle, por si te aporta valor, podrías haber incluido en la query que no te seleccionara aquellas oficinas que no tienen coordenadas. En mongo tenemos dos métodos propios para poder hacer lo que tu haces en el for:
Método unwind que nos permite separar cada oficina de una empresa.
Método exists para seleccionar solo aquellas empresas que tienen lat y long.
Esto lo puedes incluir en tu función companies_tec_1M_mongo
Te dejo por aquí una posible opción por si te aporta valor:
condition1 = {'$and':[{"tag_list" : {'$regex':'design'}}, {"tag_list" : {'$regex':'^fashion'}}, {"tag_list" : {'$regex':'^interior'}}]}
condition2 = {"category_code": "games_video"}
🟡 condition3 = {"$unwind":"$offices"}
🟡 condition4 = [{"offices.latitude": {"$exists": True}}, {"offices.longitude": {"$exists": True}}] # solo nos devolverá las oficinas que tengan el campo de latitud y longitud con datos
proj = {'name': 1, '_id': 0, 'offices.latitude': 1, 'offices.longitude': 1, 'offices.zip_code': 1, 'offices.city': 1}
filtered = list(companies.find({'$or' : [condition1, condition2, condition3, condition4]}, proj))
#luego lo conviertes a json y luego a dataframe como lo tienes tu!
Super bien creadas las funciones en el .py
e importadas en el jupy!!
Segundo jupyter 02. foursquare
Has hecho las llamadas a la API de foursquare para tres criterios, veganos, starbucks y aeropuertos para las tres ciudades seleccionadas. Super bien el código Carmen 👏👏. Sin embargo, este jupyter tiene el mismo código repetido múltiples veces, para cada ciudad y para criterio de foursquare. Lo ideal sería que te crearas unas función para intentar atomizar el código. Una posibilidadad sería:
Crear una función con el código que ya tienes. Te podría quedar algo como esto:
def get_data_foursquare(coords, type):
# type será cada uno de los criterios de búsqueda en foursquare
url_query = 'https://api.foursquare.com/v2/venues/explore'
tok1 = os.getenv("tok1")
tok2 = os.getenv("tok2")
parametros = {
"client_id": tok1,
"client_secret": tok2,
"v": "20180323",
"ll": f"{coords.get('coordinates')[0]},{coords.get('coordinates')[1]}",
"query": f'{type}',
"limit": 170
}
resp = requests.get(url= url_query, params = parametros).json()
sf_starbucks = resp.get("response").get("groups")[0].get("items")
mapa_nombre = ["venue", "name"]
mapa_latitud = ["venue", "location", "lat"]
mapa_longitud = ["venue", "location", "lng"]
lista_starbucks = []
for dic in sf_starbucks:
paralista = {}
paralista["type"] = f'{type}'
paralista["name"] = getFromDict(dic, mapa_nombre)
paralista["latitud"]= getFromDict(dic, mapa_latitud)
paralista["longitud"] = getFromDict(dic,mapa_longitud)
lista_starbucks.append(paralista)
df = pd.DataFrame(lista_starbucks)
return df
Hacer un bucle for
usando la función que has creado anteriormente
lista_colecciones = ["school", "vegan", "starbucks"...]
for i in lista_colecciones:
x = get_data_foursquare(coords, i)
🟢 De este paso sacaremos un dataframe para cada una de las ciudades que quieres incluir, cada dataset tendrá todos los resultados de cada criterio.
Convertir a tipo point como lo tienes tu también. Aquí podríamos meter de nuevo el código en una función y usar un apply
para pasarlo por el dataframe.
Tercer jupyter 03. geoqueries
Genial Carmen, has metido los resultados de tus llamadas a la API de foursquare en mongo y desde ahí haces las geoqueries 👏🎉
Además tienes un set de empresas de San Francisco a las que vas a intentar "robar" el local, perfecto eso!!!
Lo único que te diría en esta parte es que habría que intentar atomizar el código un poco y evitar la repetición de código. Podríamos crear una función para hacer las geoqueries. Podría ser algo como esto:
def get_geo(coords):
c1 = {"type": "Point", "coordinates": coord}
query = {"location": {"$near": {"$geometry": c1, "$maxDistance": 2000}}}
final_q = list(collection.find(query))
df = pd.DataFrame(final_q)
return df
coord = [-122.409173, 37.788482]
c = {"type": "Point", "coordinates": coord}
kyte = get_geo(c)
Por el resto Carmen, perfecto, todas las decisiones que has tomado se basan en números y está todo muy bien documentado, enhorabuena!
Bueno Carmen has hecho muy muy buen trabajo en este proyecto, poco tengo que decirte en general. Te pongo por aquí algunas cosillas que podrían aportar valor a tu proyecto:
Te animo a que te lances con las funciones.
Dale al readme!
Atomizar un poco el código para evitar estructuras muy repetitivas.
Siendo data analysts tenemos que garantizar que las decisiones que tomamos se basan en lo que trabajamos, y los datos. Tu has "robado" el local a una especie ya existente y todas las decisiones que has tomado se han basado el tus propios resultados, lo que está perfecto. Enhorabuena Carmen, hiciste un gran trabajo en este proyecto!!! 🚀🔥 Sigue asiiiii Si te queda alguna duda ya sabes donde estamos!!
https://github.com/Carmen-r/W4-geospatial-data-project.git