Agreguemos un segundo conjunto de datos para los mismos estudiantes. Esta vez, registraremos la cantidad típica de horas por semana que dedicaron a estudiar.
>>>[50 50 47 97 49 3 53 42 26 74 82 62 37 15 70 27 36 35 48 52 63 64]
>>>array([[10. , 11.5 , 9. , 16. , 9.25, 1. , 11.5 , 9. , 8.5 ,
14.5 , 15.5 , 13.75, 9. , 8. , 15.5 , 8. , 9. , 6. ,
10. , 12. , 12.5 , 12. ],
[50. , 50. , 47. , 97. , 49. , 3. , 53. , 42. , 26. ,
74. , 82. , 62. , 37. , 15. , 70. , 27. , 36. , 35. ,
48. , 52. , 63. , 64. ]])
Ahora los datos consisten en una matriz bidimensional; una variedad de matrices. Veamos su forma.
>>>(2, 22)
La Student_Data contiene dos elementos, cada uno de los cuales es una matriz que contiene 22 elementos.
Para navegar esta estructura, debe especificar la posición de cada elemento en la jerarquía. Entonces, para encontrar el primer valor en la primera matriz (que contiene los datos de las horas de estudio), puede usar el siguiente código.
>>>10.0
Ahora tiene una matriz
multidimensional que contiene el tiempo de estudio del estudiante y la
información de calificación, que puede usar para comparar el tiempo de
estudio con la calificación de un estudiante.
>># Get the mean value of each sub-array
>>>
Average study hours: 10.52
>>>Average grade: 49.18
Explorando datos tabulares con pandas
Numpy proporciona una gran parte de la funcionalidad y las herramientasque necesita para trabajar con números, como matrices de valores numéricos.
Sin embargo, cuando comienza a lidiar con tablas de datos bidimensionales,
el Pandas ofrece una estructura más conveniente para trabajar: DataFrame.
Ejecute la siguiente celda para importar la biblioteca Pandas y crear un
marco de datos con tres columnas. La primera columna es una lista de nombres
de estudiantes, y la segunda y tercera columna son las matrices numpy
que contienen el tiempo de estudio y los datos de grado.
name | StudyHours | Grade | |
---|---|---|---|
0 | Dan | 10.00 | 50.0 |
1 | Joan | 11.50 | 50.0 |
2 | Pedro | 9.00 | 47.0 |
3 | Rosie | 16.00 | 97.0 |
4 | Ethan | 9.25 | 49.0 |
5 | Vicky | 1.00 | 3.0 |
6 | Fredric | 11.50 | 53.0 |
7 | Jimmie | 9.00 | 42.0 |
8 | Rhonda | 8.50 | 26.0 |
9 | Giovanni | 14.50 | 74.0 |
10 | Francesca | 15.50 | 82.0 |
11 | Rajab | 13.75 | 62.0 |
12 | Naiyana | 9.00 | 37.0 |
13 | Kian | 8.00 | 15.0 |
14 | Jenny | 15.50 | 70.0 |
15 | Jakeem | 8.00 | 27.0 |
16 | Helena | 9.00 | 36.0 |
17 | Ismat | 6.00 | 35.0 |
18 | Anila | 10.00 | 48.0 |
19 | Skye | 12.00 | 52.0 |
20 | Daniel | 12.50 | 63.0 |
21 | Aisha | 12.00 | 64.0 |
Encontrar y filtrar datos en un marco de datos
Puede usar el LOC para recuperar datos para un valor de índice específico,
como este.
>>>
5 | |
---|---|
name | Vicky |
StudyHours | 1.0 |
Grade | 3.0 |
name | StudyHours | Grade | |
---|---|---|---|
0 | Dan | 10.00 | 50.0 |
1 | Joan | 11.50 | 50.0 |
2 | Pedro | 9.00 | 47.0 |
3 | Rosie | 16.00 | 97.0 |
4 | Ethan | 9.25 | 49.0 |
5 | Vicky | 1.00 | 3.0 |
>>df_students.iloc[0:5]
name | StudyHours | Grade | |
---|---|---|---|
0 | Dan | 10.00 | 50.0 |
1 | Joan | 11.50 | 50.0 |
2 | Pedro | 9.00 | 47.0 |
3 | Rosie | 16.00 | 97.0 |
4 | Ethan | 9.25 | 49.0 |
>>_df_8['StudyHours'].plot(kind='hist', bins=20, title='StudyHours')
>>plt.gca().spines[['top', 'right',]].set_visible(False)
iloc[0:5]
resultados y compararlos con el loc[0:5]
ILOC identifica los valores de datos en un marcado de datos por posición , que se extiende más allá de las filas a las columnas. Entonces, por ejemplo, puede usarlo para encontrar los valores para las columnas en las posiciones 1 y 2 en la fila 0, como esta:
0 | |
---|---|
StudyHours | 10.0 |
Grade | 50.0 |
usa LOC para ubicar elementos de datos basados en valores de índice
en lugar de posiciones. En ausencia de una columna de índice explícito,
las filas en nuestro marco de datos se indexan como valores enteros,
>>>50.0
Aquí hay otro truco útil. Puede usar el LOC para encontrar filas indexadas basadas en una expresión de filtrado que hace referencia a columnas con nombre que no sea el índice, como este:
name | StudyHours | Grade | |
---|---|---|---|
21 | Aisha | 12.0 | 64.0 |
name | StudyHours | Grade | |
---|---|---|---|
21 | Aisha | 12.0 | 64.0 |
name | StudyHours | Grade | |
---|---|---|---|
21 | Aisha | 12.0 | 64.0 |
Los tres ejemplos anteriores subrayan una verdad confusa sobre trabajar con pandas. A menudo, hay múltiples formas de lograr los mismos resultados. Otro ejemplo de esto es la forma en que se refiere a un nombre de columna DataFrame.
Puede especificar el nombre de la columna como un valor de índice con nombre
(como en el df_students['Name']
Ejemplos que hemos visto hasta ahora), o puede
usar la columna como propiedad del DataFrame, como este:
name | StudyHours | Grade | |
---|---|---|---|
21 | Aisha | 12.0 | 64.0 |
--2025-02-08 02:05:49--
https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/ml-basics/grades.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)...
185.199.108.133, 185.199.109.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)
|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 322 [text/plain]
Saving to: ‘grades.csv’
Como puede ver en el código de ejemplo, puede especificar opciones como
el delimitador de la columna y qué fila (si los hay) contiene encabezados de columna.
(En este caso, el delimitador es una coma y la primera fila contiene los nombres
de la columna. Estas son la configuración predeterminada, por lo que podríamos
haber omitido los parámetros).
Manejo de valores faltantes
Uno de los problemas más comunes con los que los científicos de datos deben
tratar son los datos incompletos o faltantes. Entonces, ¿cómo sabríamos que DataFrame contiene valores faltantes? Puede usar el ISNull para identificar qué valores
individuales son nulos, así:
Name | StudyHours | Grade | |
---|---|---|---|
0 | False | False | False |
1 | False | False | False |
2 | False | False | False |
3 | False | False | False |
4 | False | False | False |
5 | False | False | False |
6 | False | False | False |
7 | False | False | False |
8 | False | False | False |
9 | False | False | False |
10 | False | False | False |
11 | False | False | False |
12 | False | False | False |
13 | False | False | False |
14 | False | False | False |
15 | False | False | False |
16 | False | False | False |
17 | False | False | False |
18 | False | False | False |
19 | False | False | False |
20 | False | False | False |
21 | False | False | False |
22 | False | False | True |
23 | False | True | True |
0 | |
---|---|
Name | 0 |
StudyHours | 1 |
Grade | 2 |
Así que ahora sabemos que falta un de estudio de estudio y dos de grado valores
Para verlos en contexto, podemos filtrar el marco de datos para incluir solo
filas donde cualquiera de las columnas (eje 1 del marco de datos) es nula.
Name | StudyHours | Grade | |
---|---|---|---|
22 | Bill | 8.0 | NaN |
23 | Ted | NaN | NaN |
Cuando se recupera el marco de datos, los valores numéricos faltantes se muestran
como nan ( no un número ).Entonces, ahora que hemos encontrado los valores nulos,
¿qué podemos hacer con ellos? Un enfoque común es imputar valores de reemplazo. Por ejemplo, si falta el número de horas de estudio, podríamos suponer que el estudiante estudió durante una cantidad promedio de tiempo y reemplazar el valor que falta con las horas medias de estudio. Para hacer esto, podemos usar el Fillna , como este:
Name | StudyHours | Grade | |
---|---|---|---|
0 | Dan | 10.000000 | 50.0 |
1 | Joann | 11.500000 | 50.0 |
2 | Pedro | 9.000000 | 47.0 |
3 | Rosie | 16.000000 | 97.0 |
4 | Ethan | 9.250000 | 49.0 |
5 | Vicky | 1.000000 | 3.0 |
6 | Frederic | 11.500000 | 53.0 |
7 | Jimmie | 9.000000 | 42.0 |
8 | Rhonda | 8.500000 | 26.0 |
9 | Giovanni | 14.500000 | 74.0 |
10 | Francesca | 15.500000 | 82.0 |
11 | Rajab | 13.750000 | 62.0 |
12 | Naiyana | 9.000000 | 37.0 |
13 | Kian | 8.000000 | 15.0 |
14 | Jenny | 15.500000 | 70.0 |
15 | Jakeem | 8.000000 | 27.0 |
16 | Helena | 9.000000 | 36.0 |
17 | Ismat | 6.000000 | 35.0 |
18 | Anila | 10.000000 | 48.0 |
19 | Skye | 12.000000 | 52.0 |
20 | Daniel | 12.500000 | 63.0 |
21 | Aisha | 12.000000 | 64.0 |
22 | Bill | 8.000000 | NaN |
23 | Ted | 10.413043 | NaN |
Name | StudyHours | Grade | |
---|---|---|---|
0 | Dan | 10.00 | 50.0 |
1 | Joann | 11.50 | 50.0 |
2 | Pedro | 9.00 | 47.0 |
3 | Rosie | 16.00 | 97.0 |
4 | Ethan | 9.25 | 49.0 |
5 | Vicky | 1.00 | 3.0 |
6 | Frederic | 11.50 | 53.0 |
7 | Jimmie | 9.00 | 42.0 |
8 | Rhonda | 8.50 | 26.0 |
9 | Giovanni | 14.50 | 74.0 |
10 | Francesca | 15.50 | 82.0 |
11 | Rajab | 13.75 | 62.0 |
12 | Naiyana | 9.00 | 37.0 |
13 | Kian | 8.00 | 15.0 |
14 | Jenny | 15.50 | 70.0 |
15 | Jakeem | 8.00 | 27.0 |
16 | Helena | 9.00 | 36.0 |
17 | Ismat | 6.00 | 35.0 |
18 | Anila | 10.00 | 48.0 |
19 | Skye | 12.00 | 52.0 |
20 | Daniel | 12.50 | 63.0 |
21 | Aisha | 12.00 | 64.0 |
Explore los datos en el marco de datos
Ahora que hemos limpiado los valores faltantes, estamos listos para explorar
los datos en DataFrame. Comencemos por comparar las horas y calificaciones
medias de estudio.
Average weekly study hours: 10.52
Average grade: 49.18
Name | StudyHours | Grade | |
---|---|---|---|
1 | Joann | 11.50 | 50.0 |
3 | Rosie | 16.00 | 97.0 |
6 | Frederic | 11.50 | 53.0 |
9 | Giovanni | 14.50 | 74.0 |
10 | Francesca | 15.50 | 82.0 |
11 | Rajab | 13.75 | 62.0 |
14 | Jenny | 15.50 | 70.0 |
19 | Skye | 12.00 | 52.0 |
20 | Daniel | 12.50 | 63.0 |
21 | Aisha | 12.00 | 64.0 |
por lo que puede trabajar con sus columnas como cualquier otro marco de datos.
Por ejemplo, encontremos la calificación promedio para los estudiantes
que emprendieron más de la cantidad promedio de tiempo de estudio.
66.7
Supongamos que la calificación aprobatoria para el curso es de 60.
Podemos usar esa información para agregar una nueva columna a DataFrame
que indica si se aprobó o no cada estudiante.
Primero, crearemos una serie que contenga el indicador PASS/FALLA
(Verdadero o Falso), y luego concatenaremos esa serie como una nueva
columna (Eje 1) en el DataFrame.
Name | StudyHours | Grade | Pass | |
---|---|---|---|---|
0 | Dan | 10.00 | 50.0 | False |
1 | Joann | 11.50 | 50.0 | False |
2 | Pedro | 9.00 | 47.0 | False |
3 | Rosie | 16.00 | 97.0 | True |
4 | Ethan | 9.25 | 49.0 | False |
5 | Vicky | 1.00 | 3.0 | False |
6 | Frederic | 11.50 | 53.0 | False |
7 | Jimmie | 9.00 | 42.0 | False |
8 | Rhonda | 8.50 | 26.0 | False |
9 | Giovanni | 14.50 | 74.0 | True |
10 | Francesca | 15.50 | 82.0 | True |
11 | Rajab | 13.75 | 62.0 | True |
12 | Naiyana | 9.00 | 37.0 | False |
13 | Kian | 8.00 | 15.0 | False |
14 | Jenny | 15.50 | 70.0 | True |
15 | Jakeem | 8.00 | 27.0 | False |
16 | Helena | 9.00 | 36.0 | False |
17 | Ismat | 6.00 | 35.0 | False |
18 | Anila | 10.00 | 48.0 | False |
19 | Skye | 12.00 | 52.0 | False |
20 | Daniel | 12.50 | 63.0 | True |
21 | Aisha | 12.00 | 64.0 | True |
Pass
False 15
True 7
Name: Name, dtype: int64
StudyHours Grade
Pass
False 8.783333 38.000000
True 14.250000 73.142857
Los marcos de datos son increíblemente versátiles y facilitan la manipulación de datos. Muchas operaciones de DataFrame devuelven una nueva copia del DataFrame, por lo que si desea modificar un marcado de datos pero mantenga la variable existente, debe asignar el resultado de la operación a la variable existente. Por ejemplo, el siguiente código clasifica los datos del estudiante en orden descendente por calificación y asigna el marco de datos ordenado resultante a la DF_STUDENTS .
Name | StudyHours | Grade | Pass | |
---|---|---|---|---|
3 | Rosie | 16.00 | 97.0 | True |
10 | Francesca | 15.50 | 82.0 | True |
9 | Giovanni | 14.50 | 74.0 | True |
14 | Jenny | 15.50 | 70.0 | True |
21 | Aisha | 12.00 | 64.0 | True |
20 | Daniel | 12.50 | 63.0 | True |
11 | Rajab | 13.75 | 62.0 | True |
6 | Frederic | 11.50 | 53.0 | False |
19 | Skye | 12.00 | 52.0 | False |
1 | Joann | 11.50 | 50.0 | False |
0 | Dan | 10.00 | 50.0 | False |
4 | Ethan | 9.25 | 49.0 | False |
18 | Anila | 10.00 | 48.0 | False |
2 | Pedro | 9.00 | 47.0 | False |
7 | Jimmie | 9.00 | 42.0 | False |
12 | Naiyana | 9.00 | 37.0 | False |
16 | Helena | 9.00 | 36.0 | False |
17 | Ismat | 6.00 | 35.0 | False |
15 | Jakeem | 8.00 | 27.0 | False |
8 | Rhonda | 8.50 | 26.0 | False |
13 | Kian | 8.00 | 15.0 | False |
5 | Vicky | 1.00 | 3.0 | False |
Resumen
Numpy y DataFrames son los caballos de batalla de la ciencia de datos en Python.
Nos proporcionan formas de cargar, explorar y analizar datos tabulares.
Como aprenderemos en módulos posteriores, incluso los métodos de análisis avanzados generalmente dependen de Numpy y Pandas para estos roles importantes.
En nuestro próximo libro de trabajo, veremos cómo crear gráficos y explorar
sus datos de manera más interesante.
No hay comentarios.:
Publicar un comentario