Closed Eduardo-Rivera98 closed 2 years ago
Hola hola Edu 🙋🏻♀️, vamos con la primera corrección del proyecto de pandas 🤓
Vamos con el readme, que parece más el producto mínimo viable para poder entregar el proyecto que un readme trabajado.
Te dejo por aquí algunos puntos que se pueden incluir por si te aporta valor:
Tienes los pasos que has ido haciendo en el repo y cuales son las herramientas principales que hs usado lo cual esta suuper bien!
Ya que no nos dejaban añadir el csv
de kaggle, podríamos incluir un link a la página de kaggle de donde se pueden descargar los datos.
¿Cómo lo podemos hacer?
[dataset](https://www.kaggle.com/teajay/global-shark-attacks)
# Si haces esto verás algo como esto 👇🏽 en el readme
Podías incluir también las librerías que usaste poniendo los links a la documentación oficial como te explique arriba.
En este caso no es esencial ya que la estructura del repo es relativamente sencilla, pero podemos meter también como es la estructura de carpetas que tenemos en el repo y que nos podemos encontrar en ellas.
Podemos incluir una pequeña descripción del dataset, como por ejemplo, que datos tenemos, que columnas, de donde viene el csv
, etc.
Vamos con la estructura, que en términos generales esta suuper bien! Solo algunos detallines:
Tienes todo en español, pero el nombre de los jupyters en inglés, lo ideal es que vaya todo en el mismo idioma.
Suuper bien que metieras el .gitignore
, peeero se te pasó un archivo temporal, el __pycache__
que esta en la carpeta src
. Recuerda, en el .gitignore
debemos meter todos aquellos archivos que no queramos que se vean así como todos los archivos temporales que se nos generen, independientemente de donde se encuentren.
Me gusta mucho que te crearas la carpeta de Imagenes
donde has guardado todos los plots que hiciste 👏🏽!
Puedes meter también los jupyters en una carpeta que se llame Notebooks
donde puedas ir guardando todos los jupyters que hagas. Si además los numeras para saber el orden de trabajo quedaría TOP TOP.
De la misma forma, podemos crearnos una carpeta de data
donde guardemos nuestros csv
limpitos!
Pero bueno, como te digo, son solo detallines ya que tu repo en general esta muy bien organizado 🔝!
Ahora es el turno de la parte del código del proyecto!
Solo como detalle, en al primera celda tienes todos los imports pero también tienes la "lectura" del csv
.
Super bien que hayas metido todos los imports en la primera celda. Pero lo ideal es que los imports vayan en una celda y el código para leer el csv
en la segunda. Como te digo un detalle.
Super buena exploración de los valores nulos en el dataset. Solo por si te aporta valor, podeo
Renombras alguns columnas lo cual esta genial ya que nos va a evitar problemas con los espacios al final o entre las palabras en el nombre de las columnas.
Para evitar tener que hacerlo de una en una lo podemos hacer con una list comprehension. Te dejo por aquí como lo podemos hacer:
df.columns = df.columns.str.lower() # con esto lo que hacemos es convertir todas las columnas
df.columns = [column.rstrip().replace(' ', '_') for column in df.columns] # vamos iterando por los nombres de las columnas, e iremos reemplazando los espacios por barras bajas (replace(' ', '_')). Y luego lo que hacemos es eliminar los espacios de la columna (rstrip()).
Vamos con la función change
, super bien que la hayas definido pero te dejo por aquí un tip:
def change(x):
if x == 'Boat': #
return 'Boating' #Esta función sirve para cambiar todos los valores de la columna type que sean boating mal escritos a boating
elif x== 'Boatomg':
return 'Boating'
else:
return x;
# en este caso puedes pasar boat y boatomg en la misma condición usando un operador `or` y de esta forma quitaríamos un elif
def change(x):
if x == 'Boat' or x== 'Boatomg': #
return 'Boating'
else:
return x;
🟠 Lo mismo puedes aplicar en la función change3
.
Respecto al nombre de las funciones, lo ideal es que tengan nombres "signidicativos".
¿Qué quiere decir esto?
Si por ejemplo tienes tienes una función que te limpia la columna type
la llames algo así como clean_type
. Algo que nos diga que es lo hace más o menos la función.
Por otro lado, los docstrings te dejo por aquí como deberíamos hacerlos, m´sa por convenio que otra cosa:
¿Qué es lo que tiene que tener un docstring?
Aquí algo de info sobre los docstrings .
def mifuncion(argumento1, argumento2):
'''
Lo que hace la función
args:
argumento1: tipo de dato
argumento2: tipo de dato
return:
que nos devuelve la función
'''
return "Hola"
Sobre esta frase Cierto es que siguén quedando muchas columnas que no nos interesan o bien por la alta cantidad de Nans, lo poco limpios que están sus datos, o bien porque tienen información muy similar o idéntica a otras.
Es cierto que hay muchas columnas que tenían muchos NaN o que estaban muy sucias, pero ese ere el objetivo del proyecto, que nos pelearamos con las columnas más "feas" para poder afianzar los conocimientos que habíamos adquirido durante las semanas previas. Es decir, NO TENIAMOS QUE ADAPTAR LAS HIPÓTESIS A LO LIMPIOS QUE ESTUVIERAN LAS COLUMNAS, SI NO A NUESTRA PROPIA CURIOSIDAD Y GANAS DE PELEARNOS CON EL CÓDIGO.
Vamos con la parte donde divides el dataset en tres en función del pais, haces lo siguiente:
Usa= sharks2[sharks2.Country=='USA']
Australia= sharks2[sharks2.Country=='AUSTRALIA']
Sudaf= sharks2[sharks2.Country== 'SOUTH AFRICA'] #Ahora voy a coger las columnass que yo considere más importantes. Como en tantos otros casos, Sex estaba escrito con un espacio detrás.
# después de hacer la división de los datasets eliminas las mismas columnas para los tres subsets.
usa = Usa[['Country','Date', 'Year', 'Type2', 'Activity', 'Area', 'Fatal (Y/N)', 'Sex ','Species']]
australia = Australia[['Country','Date', 'Year', 'Type2', 'Activity', 'Area', 'Fatal (Y/N)', 'Sex ','Species']]
sudaf = Sudaf[['Country','Date', 'Year', 'Type2', 'Activity', 'Area', 'Fatal (Y/N)', 'Sex ','Species']]
# si te fijas, esto no tiene mucho sentido ya que estas repitiendo el mismo código tres veces.
# lo ideal sería que hubieras hecho este dropeo antes de hacer los tres subsets.
Vamos con la limpieza que haces de la columna Species
.
Como lo tienes esta bien, peeeero ya sabes que siempre tenemos algún detallin que comentaros:
Te creas tres funciones, una para cada especie. No esta mal, pero lo ideal sería un global para limpiar toda la columna.
Justo antes de la función haces un str.contains
para buscar en la columna lo que contenga white shark
. Esto esta bien, pero estas limitando mucho tu clasificación. Con tu condición no estarías considerando aquellas species que por ejemplo contuvieran solo "white" o "White". En este caso lo ideal es que usaras regex
y seleccionaras aquellas celdas en las que tuvieramos "white" o "White" o WHITE en el valor de la celda.
¿ Cómo lo podríamos hacer?
Te dejo por aquí unas lineas de código por si te aportan valor:
def species2 (col):
# creamos un diccionario con las especies de tiburones más frecientes y sus regex
diccionario = {
"white" : re.search(r".*[Ww](hite|HITE).*", str(col)),
"tiger" : re.search(r'.*[Tt].*', str(col)),
"bull" : re.search(r'.*[Bb](ull).*', str(col)),
"lemon" : re.search(r'.*[Ll].*', str(col)),
"grey" : re.search (r'reef | \.*reef\.*', str(y))
}
# despues lo que hacemos es interar por el diccionario
for k,v in diccionario.items():
# si encuentra un value en el diccionario me devuelves la key del diccio nario
if v == True:
return k
else:
# si no me devuelves "other species"
return "other species"
# de esta forma tampoco haría falta que te crearas 3 dataframes distintos que luego tuviernas que concatenar.
Hacía el final del jupyter empieza a haber un poco de jaleito con el orden de trabajo, hay como mucha limpieza que vamos separando para luego juntar. Me faltó un poquito más de orden Edu para ser capaces de seguir el flujo de trabajo de una forma más sencilla.
Para eso nos podemos usar markdown, que es un lenguaje de texto que nos permite escribir texto con formato. Te dejo por aquí algo de documentación por si te aporta valor
Bueno Edu, te dejo por aquí un pequeño resumen de todo que te fui comentado a la largo de la corrección:
.gitignore
Aún con todo lo que te dije Edu, hiciste un buen trabajo. Enfrentarse a este csv
no es fácil y lo has superado con creces, enhorabuena 💪💪!
https://github.com/Eduardo-Rivera98/Proyecto_Pandas.git