Closed Pnat1 closed 2 years ago
Hola Guille 🙋🏻♀️! Seguimos con más proyectos, y ahora es el turno del proyecto de las geoqueries!
Vamos con algunos detallines del readme:
Por ponerme un poco quisquillosa, se nota que el readme lo dejaste un poco a medias cuando leo esta frase:
I obtained a set of XXX companies with coordinates
XXX? 😅
Por el resto, el readme está bastante completo. Buen trabajo Guille!
En cuanto a la estructura me han faltado algunas cositas en este proyecto. Te dejo por aquí algunas ideas por si te aportan valor de cara al futuro:
Tienes todo metido dentro de una carpeta que se llama ANALYSIS
, esto es mejor evitarlo y poner las carpetas y ficheros que tenemos en nuestro repo directamente en el mismo.
NO tienes el .gitignore
en tu repo 😔. Este archivo es esencial (debe ser de lo primero que creemos cuando creamos el repo) ya que en este fichero vamos a almancenar todos los archivos temporales que se nos crean o aquellos archivos que no queremos que se muestren.
El no tener el .gitignore
hace que tengamos los checkpoints
del jupyter en el repo. Recuerda, estos siempre al .gitignore
!
Este archivo Companies_cleaning.py.ipynb
tiene dos extensiones, .py
y .ipynb
. Ten cuidado con estas detalles.
Me faltado la carpeta de src
esencial para tener un jupyter notebook limpito donde importemos todas las funciones que tengamos en el .py
Hubiera estado bien que te crearas una carpeta de data
donde guardaras todos los datos que te has ido descargando de la API.
Una carpeta de Notebooks
también puede ayudar al orden en nuestro repo. En este caso, podemos meter ahí los notebooks. Si además los numeramos para saber que orden de trabajo hay que seguir sería 🔝.
Si bien el readme esta muy completo, en esta parte del proyecto, todavía queda mucho trabajo por delante 😔
Vamos con el código que tienes cuando filtras por pais:
Lo primerito de todo, suuper bien usando el try
, except
👏🏽.
com_in_counts = []
for i in range(df1.shape[0]):
try:
if df1["offices"][i][0]["country_code"] in ["ESP"]:
com_in_counts.append(df1["name"][i])
df_ESP = df1.loc[df['name'].isin(com_in_counts)]
except:
pass
# Tienes este código tres veces repetido para cada uno de los paises que quieres filtrar.
# Recuerda que tienes las condiciones or y and para poder poner más de una condición. ¿Cómo lo podríamos hacer?
com_in_counts = []
InfoDF = pd.DataFrame()
for i in range(df1.shape[0]):
try:
if df1["offices"][i][0]["country_code"] in ["ESP"] or df1["offices"][i][0]["country_code"] in ["DEU"] or df1["offices"][i][0]["country_code"] in ["GBR"]: # con el operador OR podemos combinar varías condiciones.
com_in_counts.append(df1.loc[df['name'].isin(df1["name"][i])]) # así lo que hacemos es tenerlo todo en una lista. Sin necesidad de crearnos tres dataframes.
InfoDF = pd.concat(com_in_counts) # concatemos todas las listas en un únicp dataframe y no tenemos que estar repitiendo todo el rato el mismo código
except:
pass
Cuando tenemos una columna donde sus valores son diccionarios, tenemos un método que nos lo permite hacer facilmente. Te dejo por aquí algo de pseudo-código por si te aporta valor:
def clean_dict(x):
try:
return x[0]["city"] # como lo único que nos interesa es la ciudad accedo a ese value del diccionario.
except:
return None
df["city"] = df["offices"].apply(clean_dict) # aplicamos el método a la columna que queremos limpiar. Como solo tenemos un dataframe, lo aplicamos una única vez en vez de repetir el código.
# 🔴 lo mismo podemos hacer para cuando sacas los `employees`
Esta misma lógica la podemos ir aplicando a todas las limpiezas que haces.
Como detalle, tienes este jupyter con muchas celdas de código comentadas, con código que supongo que probarías pero que no usaste al final. Recuerda que el jupyter tiene que estar lo más limpio posible, por lo tanto, lo ideal sería quitar todas esas celdas.
En este jupyter tienes una función extract_lat_lng
, sobre esto dos comentarios:
Recuerda los docstrings en las funciones
Recuerda que las funciones las tenemos que tener en el .py
e importalas desde el jupyter.
Cuando llamas a la función que te comente arriba haces lo siguiente:
extract_lat_lng("Calle Quintanavides 15, Madrid, Comunidad de Madrid")
# para luego definir a mano los valores que te devuelve esa función.
# lo que podemos hacer también es almancear los valores directamente en las variables cuando llamamos a la función.
lat, long = extract_lat_lng("Calle Quintanavides 15, Madrid, Comunidad de Madrid") # de esta forma lo que tendremos es la latitud almanceada en la variable lat y la longitud en la variable long.
Ais esos prints larguitos que tenemos en el jupyter Guille!!!!
Este código:
transport_endpoint = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
params_3 = {
"key": api_google_maps,
"location": f"{lat},{lng}",
"radius": 300,
"keyword": "Public Transport"
}
params_3_encoded = urlencode(params_3)
trans_url = f"{transport_endpoint}?{params_3_encoded}"
r3 = requests.get(trans_url)
# ⚠️ lo tienes repetido varias veces, una por cada parámetro que quieres buscar.
# En vez de hacer esto lo que podemos hacer es crearnos una funcioncita y lo que haremos llamar a la función para cada parámetro que queramos buscar.
# La función podría ser algo así:
def get_data(lat, lng):
transport_endpoint = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
params_3 = {
"key": api_google_maps,
"location": f"{lat},{lng}",
"radius": 300,
"keyword": "Public Transport"
}
params_3_encoded = urlencode(params_3)
trans_url = f"{transport_endpoint}?{params_3_encoded}"
return requests.get(trans_url).json()
Super que hayas conseguido sacar toda la información de la API, además has usado la de Google 👏🏽, lo cual era un reto ya que no la habíamos usado durante el bootcamp.
Ahora si, me ha faltado parte del proyecto:
Con todo, en la parte del proyecto que tienes, bien hecho Guille 🔥🔥💪!
https://github.com/Pnat1/W4-Geospatial-Data