[MÚSICA] [MÚSICA] Muchas veces cuando cargamos los datos que queremos procesar o analizar, descubrimos que hay problemas de calidad. Estos problemas pueden ser registros faltantes, registros con valores nulos o peor aún registros con valores que no tienen ningún sentido en el contexto que se está estudiando. Otra cosa que puede pasar, es que algunos valores esten en un formato que sea incómodo utilizar en los análisis que vayamos a hacer. Por ejemplo, columnas que digan si o no en lugar de tener valores booleanos. En este vídeo, veremos algunas funciones de pandas para detectar y corregir algunos de estos problemas. En vídeos siguientes, estudiaremos otros mecanismos que también podemos utilizar para corregir o mejorar la calidad de nuestros datos. Para empezar, estudiemos primero los diferentes tipos de valores nulos que podemos encontrar en un data frame. En primer lugar, tenemos el valor nulo en numpy que se llama N a N o Not a Number y traduce no es un número. Este es el valor con el que numpy indica que debería haber un número, pero no hay nada. No es un 0 y tampoco es un valor menos infinito o infinito como en otros lenguajes. Es sólo una marca que indica que hace falta un número en ese lugar. Después tenemos el valor N a T o Not a Time que define Pandas y que se usa para indicar que en un lugar donde debería haber una fecha hace falta un valor o hay un valor que no tiene sentido. Por ejemplo, si intentamos cargar el 30 de febrero de 2020 en un data frame pandas debería reemplazarlo por el valor N a T. Finalmente, tenemos el valor de None de Python el cual sirve para indicar que hace falta un valor y se utiliza para columnas que no sean ni numéricas ni de tipo fecha. Veamos ahora un pequeño ejemplo en el que estamos creando un data frame llamado df con 3 columnas y 1 sola fila. En la columna llamada número dejamos el valor N a N, en la columna llamada fecha dejamos el valor N a T y en la columna llamada cadena dejamos el valor None. Si imprimimos el data frame, veremos que su contenido son los 3 valores nulos. Si usamos la función info, veremos que las columnas son de tipo número, tipo fecha y tipo objeto respectivamente. Finalmente, tenemos la función is Na de pandas. Esta función es tremendamente útil porque nos permite saber cuáles valores en un data frame o en una serie son nulos, sin tener que preocuparnos por su tipo. En el caso del ejemplo, vemos que para los 3 valores de nuestro data frame la función is na retorna al valor true. Apliquemos ahora estas ideas a nuestros datos de contratación estatal. En este caso, tenemos un data frame llamado filtradas con un subconjunto de los datos y las columnas, que nos servirán para los ejemplos de este vídeo. Al invocar la función info y revisar la cantidad de registros por columna, encontramos que las columnas fecha de inicio del contrato y fecha de fin del contrato, hay menos registros que en las otras. Esto nos indica que en esas columnas hay valores nulos. Para descubrir cuáles registros tienen fechas nulas, usamos el mecanismo de selección que you estudiamos pero en este caso usamos la función is na para seleccionar sólo las filas en las que la columna fecha de fin del contrato tenga un valor nulo. El resultado lo guardamos en el data frame llamado sin finalización y al utilizar la función info sobre este data frame, vemos que esta función tiene 38 registros de los cuales ninguno tiene fecha de fin del contrato y sólo 7 tiene fecha de inicio. En esta imagen también podemos ver que las columnas dónde deberían estar las fechas, son de tipo object y no son realmente de tipo fecha. Convírtamosla entonces al tipo correcto para poder hacer cálculos con más facilidad. Resolvamos la siguiente pregunta, para revisar lo que estamos aprendiendo. En primer lugar, vamos a averiguar de qué tipo son realmente los datos que tenemos almacenados en la columna fecha de fin del contrato. Para eso extraemos el valor de una fila cualquiera y usamos la función type para consultar su tipo. En este caso nuestras fechas están almacenadas como cadenas de caracteres. Ahora usaremos una función de pandas para convertir cadenas de caracteres a fechas. Primero lo aplicaremos sobre la fecha que acabamos de extraer y luego lo haremos sobre la columna anterior. La función que nos interesa se llama to date time y sirve para convertir entre diferentes tipos de datos y fechas, aunque casi siempre se usa con cadenas de caracteres. Esta función es capaz de convertir cadenas en cualquier formato que le indiquemos, día mes año, mes año día, año mes día hora minutos o cualquier otra cosa. Sin embargo, en este caso vamos a utilizarla con el parámetro infer_datetime_format con valor true, para que la función misma intente adivinar el formato de la cadena. En este caso, la función no retorna algo tipo Timestamp con la fecha primero de enero del 2019 a las 00:00:00. En el segundo ejemplo estamos intentando convertir una fecha que no tiene sentido, el 30 de febrero del 2020. Como en la invocación usamos también el parámetro errors, con el valor coerce que significa obligar, el resultado es el valor nulo de pandas para fechas, es decir, N a T. Sino hubiéramos usado el tercer parámetro, la invocación de la función nos habría generado un error y no un valor nulo. Apliquemos ahora estas mismas ideas a la columna entera. En el ejemplo, estamos usando como primer parámetro de la función to_datetime la columna entera llamada fecha fin del contrato. y estamos usando los mismos valores que antes para los parámetros infer_datetime_format y errors. El resultado es una nueva serie que almacenamos en una nueva columna llamada fechas corregidas. Para verificar que todo haya quedado bien, vamos a contar cuántos valores quedaron con valores nulos en la columna fechas corregidas. Para esto usamos la función is na que nos retorna una serie con valores verdaderos o falsos y luego usamos la función value counts. Esto nos muestra que sólo en 39 de las filas hay fechas nulas. Sin embargo, hace un rato habíamos visto que había 38 filas sin fecha del fin del contrato. Ahora tenemos una fecha más con valor nulo. ¿Qué pasó? Para descubrirlo vamos a utilizar la expresión que vemos en la pantalla y que se basa en 2 condiciones, la primera revisa en qué filas la fecha de fin del contrato no es nula. La segunda revisa en qué filas la fecha corregida si lo es. Como el operador booleano que usamos entre las 2 condiciones es un and, el resultado serán los registros en los cuales la fecha original no era nula pero la corregida si lo es. El resultado que obtenemos después de quedarnos sólo con las columnas relevantes, es que de un contrato cuya fecha de finalización esta planeada para el 22 de diciembre del año 8201. Aparentemente, eso no es una fecha válida para pandas. Veamos ahora una pregunta para revisar que todo este claro. Finalmente, veamos un pequeño ejemplo de las ventajas de tener fechas almacenadas en campos que realmente son de tipo fecha. Si tenemos una columna de tipo fecha podemos utilizar la expresión dt.year para extraer únicamente el año. En este ejemplo, estamos usando esto para construir una nueva columna en la que guardaremos sólo el año de finalización de cada contrato. Sin embargo, hay algo incómodo con nuestra nueva columna y es que los valores que tenemos en ella son de tipo float y no in. Esto no tiene mucho sentido para almacenar el número de un año, así que convertiremos esa columna a una columna de tipo in. Pero antes de poder hacer eso, tenemos que asegurarnos que en la columna no haya ningún valor nulo, sino es así la conversión fallará. Podemos usar entonces la función fill na, que se encarga de reemplazar todos los valores nulos de una serie de un data frame, con el valor que le pasemos por parámetro. En este caso, usaremos el valor 0. El resultado de la operación que vemos en la pantalla es que en la columna año, todos los valores nulos serán reemplazados por el valor 0. Ahora si podemos hacer la conversión de la columna año para que sea de tipo in. Eso lo logramos con la función astype que recibe el tipo que se da como parámetro y retorna la serie con los valores convertidos. Si hubiéramos invocado esta función antes de cambiar los valores nulos por 0, habríamos obtenido un error porque en pandas una columna de tipo in no puede tener valores nulos. Con esta misma función podemos hacer conversiones básicas de tipo, por ejemplo a cadenas o a números decimales. Para terminar, en este vídeo estudiamos varios mecanismos para detectar y corregir valores nulos dentro de nuestros datos. Estudiamos algunos conceptos básicos sobre las columnas de tipo fecha y aprendimos a cambiar el tipo de algunas columnas. Estos temas son de los más complejos dentro de pandas y lo invitamos a que revise la documentación para obtener más detalles. En los 3 enlaces de abajo, se puede encontrar más información para trabajar con valores nulos o faltantes, información sobre fechas en pandas, información sobre los tipos de datos soportados dentro de un data frame y las conversiones que pueden hacerse entre ellos. [MÚSICA]