Closed bvispo closed 2 years ago
Hola Blanca 🙋🏻♀️! Seguimos con más proyectos, y ahora es el turno del proyecto de las geoqueries!
Blanca, tienes un repo perfecto, solo te dejo por aquí unos detalles, que son más pijerías que otra cosa por si te aportan valor de cara al futuro:
.gitignore
. En este caso, este fichero no hace falta indicarlo en la estructura de nuestro repo. import lalibrería
. Unificalo todo, lo ideal, sin el import. En general, el repo esta suuper organizado. Muy buen trabajo 🔝. Por ponerme un poco tiquismiquis, te dejo por aquí unos comentarios de cara al futuro para mejorar lo que queda la estructura del repo!
Se te ha pasado un archivo temporal, el .DS_Store
fuera del .gitignore
. Recuerda que todos esos ficheros (aquellos que no queramos que se vean o que no le aporten valor a nuestro proyecto) los debemos meter en el .gitignore
.
Suuper bien las carpetas de data
y la de src
.
Los jupyters, te recomiendo que los metas en una nueva carpeta que se llame por ejmplo notebook
donde vayamos guardando nuestro trabajo. Si además los numeras para saber el orden de trabajo ya lo rematas 💪
Como detalle sobre los docstrings en las funciones. Es una pijotada, pero si lo haces estarán perfectos.
Cuando pones los args
puedes poner de que tipo son los argumentos que le pasamos, es decir, es un string, una lista, un integer ?
Sería algo como esto tomando una función tuya como ejemplo:
def geocode(direccion):
"""
This function gets the coordinates of a given direction.
Argg: the direction (str). 🔴 Indicando entre paréntesis el tipo del parámetro.
Returns: the coordinates.
"""
data = requests.get(f"https://geocode.xyz/{direccion}?json=1").json()
try:
return {"type": "Point", "coordinates": [data["latt"], data["longt"]]}
except:
return data
Cuando haces la extracción de los datos de la api, lo haces tres veces, una para cada característica que usas para clasificar tus ciudades.
Lo ideal es que lo pudieramos hacer de una sola vez para cada ciudad. Algunas ideas que se me ocurren podrían ser:
#tu código es este
london_train = gf.places_cities("Train Station", london)
london_train_df = gf.build_df(london_train)
london_train_json = gf.build_json("Stations", "London", london_train)
# algunas ideas:
# La función build_json bebe del resultado del la función places_cities. Una cosa que podemos hacer es cambiar un poco la funcion build_json y que tengamos dentro la funcion places_cities.
def places_cities(place, city):
url_query = 'https://api.foursquare.com/v2/venues/search'
client_id = os.getenv("tok1")
client_secret = os.getenv("tok2")
parametros = {
"client_id": client_id,
"client_secret": client_secret,
"v": "20180323",
"ll": f"{city['coordinates'][0]}, {city['coordinates'][1]}", #aquí pongo la ciudad que quiero
"query": f"{place}" #aquí pongo lo que quiero buscar en la ciudad.
}
resp = requests.get(url_query, params = parametros).json()
'''
map_ = ["location", "lat"]
getFromDict(resp["response"]["venues"][0], map_)
resp["response"]["venues"][0]["location"]["address"]
'''
loquebusco = resp["response"]["venues"]
return extraetodo(resp)
def build_json(place,city): # aquí podríamos quitar el parámetro `lovemosclaro`
lovemosclaro = places_cities(places, city)
json_name = f'{place}_{city}.json'
with open (json_name,"w") as f: # creamos un archivo vacío en el que vamos a escribir
json.dump(lovemosclaro,f) # cargamos nuestra lista de diccionarios en ese archivo
# lo siguiente que podríamos hacer es una lista con las cosas que queremos buscar en foursquare
cosas = ['Starbucks', 'Train station' , 'Bars']
# luego podemos iterar por la lista y llamar a la funcion build_json
results = {} # nos creamos un diccionario vacío donde vayamos almacenando los resultados de build_json
for sitio in cosas:
results[sitio] = build_json(sitio, london)
# al final tendremos un super diccionario con toda la info. Luego tendremos que reorganizar un poco, pero nada especialmente complicado 💪!
Super bien este jupyter Blanca. Solo un detalle, nos ha faltado meterlo en funciones. Por ejemplo:
def geoquery (city, lon, lat):
collection = db.get_collection(city) #conectamos con la colección de la ciudad que queremos
query = [{
"$geoNear": {'near': [lon, lat],
'distanceField': 'distance',
'maxDistance': 7000,
'distanceMultiplier': 6371,
'spherical' : True}}]
geoloc = collection.aggregate(query)
response_json = json.loads(dumps(geoloc))
df = pd.DataFrame(response_json)
return df
info_london = geoquery("London", -0.1278, 51.5074)
# algo similar podríamos hacer con el proceso de limpieza que tienes después, pero esto ya te lo dejo a ti 😉!
.gitignore
los archivos temporales que se nos quedaron por ahí sueltos. Aún con toda la chorrera que te puse de comentarios, el proyecto está muy bien ejecutado Blanca! Seguimos que ya casi estamos al final 💪🔥!
https://github.com/bvispo/Geospatial-data-project