UD3 Datos Librerías Numpy Pandas
UD3 Datos Librerías Numpy Pandas
I. Introducción y objetivos
III. Numpy
IV. Pandas
V. Resumen
VII. Glosario
VIII. Bibliografía
Lección 1 de 8
I. Introducción y objetivos
En este módulo se exponen dos de las librerías por excelencia dentro del mundo de la ciencia de datos:
Numpy y Pandas.
1
Previamente, se verá cómo tratar con archivos de tipo JSON, XML y CSV, algo imprescindible a la
hora de trabajar con Pandas.
2
Además, se darán a conocer utilidades de la librería para el manejo de arrays y otros cálculos
aritméticos y se enseñarán las principales funciones que podemos utilizar sobre arrays, tanto de
una dimensión (unidimensionales), como de más de una dimensión (multidimensionales), así
como el tipo de operaciones que es posible realizar sobre estos.
3
Finalmente, se explicará qué son los dataframes y cómo podemos trabajar con estos a través de
la librería Pandas.
C O NT I NU A R
1 Conocer los principales tipos de archivos con los que podemos trabajar en Python.
Algunos de los archivos más utilizados por los científicos de datos son XML, CSV y JSON. En la siguiente
sección, se dedica un epígrafe a cada uno de ellos.
Se aconseja seguir el contenido de esta sesión a través de los siguientes notebooks:
GESTIÓN_DE_ARCHIVOS.zip
3.9 KB
GESTIÓN_DE_ARCHIVOS_html.zip
43.7 KB
C O NT I NU A R
FECHA,ARTICULO,CUANTIA,PRECIO UNIDAD,TOTAL
15/03/2020,Barra Pan,2,0.55,1.1
16/03/2020,Bolígrafo Bic,3,0.22,0.66
17/03/2020,Cuaderno,1,1.25,1.25
18/03/2020,Refresco,5,0.8,4
19/03/2020,Silla Gamer,1,153,153
20/03/2020,Paquete folios A4,3,2.48,7.44
21/03/2020,Pack x6 Vaso cristal,2,6,12
22/03/2020,Manzanas (Kg.),1,2.48,2.48
23/03/2020,Naranjas (Kg.),2,1.29,2.58
24/03/2020,Naranja Malla,1,1.5,1.5
2
1 Valores separados por comas [En línea] URL disponible en este enlace.
C O NT I NU A R
Para importar y poder leer un archivo CSV en Python, lo primero que tenemos que saber es cómo importar
una librería.
NOTA: una librería consiste en un conjunto de funciones empaquetadas que, al
importarse en Python, nos permiten disponer de más funcionalidades para realizar
diferentes tareas, en este caso, para procesar archivos. En Python, para importar una
librería escribiremos lo siguiente: “import nombre_de_la_librería”.
En este caso, la librería en cuestión para procesar archivos CSV se llama “csv” 2.
C O NT I NU A R
Lo siguiente que debemos tener en cuenta, es cómo abrir un archivo; para ello, siempre
utilizaremos la función open, la cual tiene los siguientes parámetros:
1
Es importante atender a la anterior imagen, ya que, cuando se utiliza la función open por sí sola, no se lee el
archivo como tal, sino que se crea un objeto de entrada y salida con base en el archivo.
comprascsv.zip
427 B
C O NT I NU A R
1
Figura 4. “csv.reader”.
Fuente: elaboración propia.
Para poder procesar el archivo y que tenga en Python la estética de una tabla, se hará uso de la
función de la librería CSV “csv.reader”.
2
Como se puede comprobar, todavía queda trabajo, ya que, de nuevo, se genera un objeto con
base en el archivo, en este caso “csv.reader”. Para darle forma, los archivos CSV deben utilizarse
como listas. Para ello, simplemente se utilizará la función list para transformar nuestro archivo
en un conjunto de listas. .
3
Finalmente, se obtiene el archivo CSV procesado en Python. Es importante recalcar que los CSV
toman todos los valores como cadenas de texto, por lo que, para realizar futuras acciones sobre
columnas como “cuantía”, “precio unidad” y “total”, habría que modificar (cast) las variables de
cadena (STR) a entero (INT). Una de las grandes ventajas que nos va a ofrecer Pandas es que
reconocerá automáticamente el tipo de las variables y nos ahorrará este trabajo.
4
Una vez expuesto cómo leer un archivo CSV, se procederá a su escritura. El primer paso es añadir
más líneas (filas) al CSV actual, es decir: añadir más elementos a la lista que contiene el CSV
procesado.
5
Finalmente, con el CSV actualizado, se utilizarán las siguientes líneas de código para escribirlo y
guardarlo.
En esta ocasión, a diferencia del proceso de lectura, en la función open se utiliza el “mode ‘w’” en
lugar de la función “csv.reader”. Por el contrario, se utiliza “csv.writer” para obtener un objeto
writer y, lo más importante de todo, para poder exportar todas las líneas (filas) de la lista, se utiliza
la función writerows sobre un objeto “csv.writer” creado previamente.
7
C O NT I NU A R
"IBEX_35":[
],
"IBEX_MEDIUM_CAP": [
]
}
2
C O NT I NU A R
Para gestionar archivos JSON, se utiliza la librería JSON[4]. El primer paso es importar un archivo JSON. Al
igual que en los archivos CSV, se utiliza la función open.
Ejemplo
Un ejemplo de lectura de un JSON puede ser el siguiente:
import json
with open('mercados.json', 'rb') as f:
mercados = json.load(f)
Exportar el archivo
–
Del ejemplo anterior, se debe prestar especial atención a la función json.load(objecto_open), ya que se
encarga de exportar el archivo de cadena de texto, que es lo que se obtiene al aplicar la función open a la
estructura JSON o de diccionario de datos para que podamos obtener sus claves y valores.
Resultado
–
El resultado obtenido no es más que un diccionario de datos que tiene como valores listas que en su
interior tienen más diccionarios de datos, por lo que, si se tienen conocimientos sobre claves, valores e
índices, se podrá acceder a cualquier valor fácilmente.
Una vez expuestos los diferentes elementos de un JSON, se describirá el proceso de escritura de un
diccionario de datos como un JSON.
1
Una vez se obtienen nuevos campos, se utiliza el siguiente fragmento de código para escribir el
diccionario de datos en un archivo JSON.
json.dump(mercados, outfile)
3
En este caso, además de seleccionar el nombre y utilizar “modo ‘w’” en la función open, se tendrá
que utilizar la función “json.dump” para que tome un diccionario de datos y pueda guardarse
como un JSON. El archivo se guarda de la siguiente manera:
4
Se puede observar que se ha guardado en una sola línea todo el JSON. Si se quiere guardar de
una forma más estética, propia de un JSON, se deberá utilizar el argumento indent para que se
generen tabulaciones y saltos de línea internamente.
C O NT I NU A R
Para ilustrar esto, así como las diversas formas de leer y trabajar con la información e un fichero de este
tipo, se utilizará el siguiente XML:
<TuNombre>Juan Manuel</TuNombre>
C O NT I NU A R
Tanto para CSV y JSON se ha hecho uso de la función open para poder procesar archivos y generar objetos
de lectura y escritura. En este caso, es distinto: se necesita una librería tanto como para abrir los XML, como
para procesar su información, existen varias librerías destinadas para tal efecto, en nuestro caso
import xml.dom.minidom
–
Figura 18. Librería DOM.
Fuente: elaboración propia.
1 2 3 4
Una vez importada la librería, para abrir un archivo XML hay que parsear el archivo; para ello, hacemos uso
de la función parse sobre el archivo “books.xml” que podrás descargar más abajo.
1 2 3 4
Se obtiene un objeto de la librería DOM que contiene nuestro archivo para ser procesado. El primer paso es
procesar el elemento principal del archivo, que en nuestro caso es < Catalog> … </Catalog>. Para ello,
disponemos de la función “documentElement”, que sirve para ubicar el elemento principal del XML.
Figura 20. Procesando archivo XML (II).
Fuente: elaboración propia.
1 2 3 4
Si atendemos al resultado de la variable “libros_object”, vemos que el objeto DOM reconoce correctamente
el elemento general Catalog. Ahora, lo que tenemos que hacer es seguir procesando los diferentes
elementos. El más próximo en nuestro caso es <Book> … </Book>, es decir: la información de diferentes
libros que tiene almacenado el archivo. En lugar de utilizar “documentElement”, ahora identificaremos a los
diferentes elementos por el nombre de su etiqueta con la función “getElementByTagName”.
Es muy importante ver los resultados que ofrece el objeto elemento DOM, ya que podemos
encontrar dos listas que contienen los dos elementos libros, por lo que, llegados a este punto,
habrá que ir iterando sobre los diferentes subelementos del elemento Book para obtener la
información de forma legible.
Después, cada elemento Book contiene información que es accesible de la misma manera que se accede
al propio elemento Book, por lo tanto, seguiremos utilizando “getElementByTagName”. En este caso,
trataremos de obtener la información del elemento Author.
1 2 3 4
Como ya no hay más elementos sobre los que iterar, sino que ya queremos acceder directamente al
contenido (por ejemplo, el primer autor: Garghentini, Davide), tenemos que acceder a los elementos de las
listas DOM Element. Cada lista es de longitud uno, pero lo comprobamos a continuación:
Es decir, las listas son indexables por [0]. Es importante recordar que, en caso de tener más elementos
sobre Author, habría que crear un nuevo bucle for para ir recorriendo estos subelementos. Por lo tanto,
sobre la lista del elemento Author, para acceder al contenido utilizamos la función “.childNodes”, que nos
devolverá una nueva lista.
1 2 3 4
De nuevo, se obtienen dos listas que son de longitud 1, es decir, indexables por [0]. Finalmente, para acceder
al contenido de un nodo hijo, habrá que hacer uso de la función data.
Figura 25. Procesando archivo XML (VII).
Fuente: elaboración propia.
1 2 3 4
Una vez se obtiene la información final sobre los autores, la misma operación es aplicable para el resto de
nodos. En este punto, ya solo se tendría que almacenar la información en listas, diccionarios de datos, etc. y
procesarla.
Análogamente, si se realizan estas acciones de forma iterativa, se podría haber utilizado este fragmento de
código, que es equivalente:
III. Numpy
Los arrays de Numpy 7 son mucho más eficientes que las listas de Python,
especialmente en problemas numéricos. Por lo general, son siempre de un mismo
tipo de dato (salvo en casos especiales). Numpy proporciona operaciones que se
aplican sobre todo el array, al contrario que las listas de Python, que ya hemos
visto que hay que ir iterando sobre cada valor.
Del mismo modo que en las listas en Python, los arrays se indexan de la misma forma, es decir, empezando
de 0 a n.
El tipo de datos cambia. Por lo general, trabajaremos en lugar de int, en int64 (int32 en el caso de tener
instalada una versión de Python de 32 bits). Del mismo modo, trabajaremos en float64 (o float32) en lugar de
float.
NUMPYhtlm.zip
52 KB
C O NT I NU A R
1
Para comenzar nuestro aprendizaje con los arrays de Numpy, importaremos la librería Numpy y
crearemos nuestro primer array.
import numpy
Algo que se mencionó en pasadas unidades es que, cuando se importa una librería, se están
importando nuevas funcionalidades y también nuevos tipos y clases. En el caso de los arrays,
toman la clase “numpy.ndarray”.
3
import numpy as np
Se puede verificar que los resultados no cambian en nada, sino que simplemente se ha utilizado
otro nombre para trabajar con la librería Numpy. Respecto al array que hemos creado
anteriormente, hemos utilizado una lista, no obstante, podemos utilizar más tipos de estructuras
de datos. Veamos ahora un array formado por una tupla.
arr_tuple = np.array(mi_tupla)
5
También, aunque con algún cambio previo, se puede transformar un diccionario de datos a un
array.
'two': 'dos',
'three': 'tres'}
dict_list = list(my_dict.items())
arr_dict = np.array(dict_list)
La importancia, en este caso, recae en pasar previamente el diccionario de datos como una lista.
C O NT I NU A R
Una de las características principales de un array es que puede tener n dimensiones. Para conocer el
número de dimensiones de un array, disponemos de la función “ndim”.
b = np.array([1, 2, 3, 4, 5])
c = np.array([
])
d = np.array([
[
],
[
]
])
e = np.array([
[
])
2
print(b.ndim)
print(c.ndim)
print(d.ndim)
print(e.ndim)
4
C O NT I NU A R
En esta sección, se muestra cómo seleccionar diferentes elementos de un array. Es necesario recordar que,
a fin de cuentas, cada dimensión de un array es una lista, por lo que podemos emplear los métodos para
indexar listas.
b[0]
c[0]
c[0][2]
d[1]
d[1][0]
d[1][0][2]
Figura 36. Listas y sublistas de un array
Fuente: elaboración propia.
C O NT I NU A R
# de 3 elementos
Figura 37. Estructura de un array.
Fuente: elaboración propia.
C O NT I NU A R
Para esta sección creamos un array a través de la función arange, que nos permite generar un array
en función del rango de valores que le pasemos como parámetro. Si no especificamos un rango, generará
una secuencia.
my_array = np.arange(11)
my_array
Mostrar de posición n a m.
Figura 39. Array de n a m.
Fuente: elaboración propia.
my_array[0:3] # De posición 0 a 3
my_array[2:7] # De posición 2 a 7
2
my_array[:6] # De inicio a 6
3
my_array[6:] # De 6 a final
4
Mostrar desde la posición n a la posición m del array, en función del número de elementos. Por
ejemplo, como se ve en la figura 42, se toma un slice de un array desde un inicio hasta el final en
secuencias de tres en tres elementos.
Indexación negativa.
C O NT I NU A R
Es importante tener en cuenta que el elemento más interior de la estructura del array
debe ser divisible por su nueva estructura.
1
new_array = np.arange(36).reshape(2,3,6)
new_array
2
new_dims = e.reshape(2,2,6)
new_dims
3
Lo contrario de reestructurar un array es disolver todas sus dimensiones dejando un array plano;
para ello, existen las funciones ravel y flatten.
new_dims.ravel()
new_dims.flatten()
Principal diferencia
–
La principal diferencia entre los dos es que flaten devuelve una copia y ravel devuelve una vista, es decir: si
hacemos un cambio en el array original, se verá reflejado en la variable asignada a ravel.
Importante
–
Es importante recordar que los arrays son mutables, es decir, si no se realiza una copia correctamente, los
dos arrays compartirán las mismas posiciones de memoria.
C O NT I NU A R
pares = np.array([
[0, 2, 4],
[6, 8, 10],
])
impares = np.array([
[1, 3, 5],
[7, 9, 11],
[13, 15, 17]
])
HO R I Z O N TA L VER TI C A L C O N C AT E N AT E PR O F UN DI DA D
HO R I Z O N TA L VER TI C A L C O N C AT E N AT E PR O F UN DI DA D
Existe una función equivalente tanto a “vstack” como a “hstack”, que es concatenate. El funcionamiento de
este comando está marcado por el sentido de los ejes (axis), donde 0 será de forma vertical y 1 de forma
horizontal.
HO R I Z O N TA L VER TI C A L C O N C AT E N AT E PR O F UN DI DA D
A diferencia de las funciones para hacer stacking, el spliting necesita también que se
especifique el número de subarrays que quieren obtenerse. Este parámetro debe ser
divisible entre la longitud de los elementos del array. Tampoco puede ser mayor que
la longitud de elementos en el array.
S PLI T E N
S PLI T HO R I Z O N TA L S PLI T V E R T I C A L N UM PY. S PLI T
PR O F UN DI DA D
np.hsplit(pares, 3)
S PLI T E N
S PLI T HO R I Z O N TA L S PLI T V E R T I C A L N UM PY. S PLI T
PR O F UN DI DA D
np.vsplit(pares, 3)
De forma equivalente a “hsplit” y “vsplit”, podemos utilizar la función “numpy.split”, que necesita tanto el
número de subarrays como el eje sobre el que dividir.
S PLI T E N
S PLI T HO R I Z O N TA L S PLI T V E R T I C A L N UM PY. S PLI T
PR O F UN DI DA D
Este tipo de split requiere que la dimensión del array sea de tres como mínimo.
big = np.arange(27).reshape(3, 3, 3)
np.dsplit(big, 3)
Figura 56. Función split.
Fuente: elaboración propia.
C O NT I NU A R
“Tolist”
“Astype”
C O NT I NU A R
3.10. Copia y vista de un array
Es importante mencionar que, al igual que las listas, los arrays comparten posiciones en la memoria física,
por lo tanto, si no utilizamos los comandos necesarios para realizar una copia de un array correctamente, los
cambios que hagamos en el “array_a” se verán reflejados en el “array_b”.
Ejemplo básico
–
Se expone el ejemplo más básico: hacer una copia de un array y asignarlo a una nueva variable.
Figura 65. Copia de un array (II).
Fuente: elaboración propia.
Ejemplo con función view (I)
–
En los dos ejemplos anteriores, se ve que los arrays hay sufrido cambios producidos en los arrays copia.
Algo similar sucede si se utiliza la función view. Su uso se aconseja para mostrar arrays, pero no para
realizar cambios sobre los mismos.
C O NT I NU A R
rand = np.random.rand(10)
randn = np.random.rand(10)
randint = np.random.randint(20, 100, 10)
random = np.random.random(10)
beta = np.random.beta(0.2, 0.5, 10)
binomial = np.random.binomial(10, 0.5, 10)
gamma = np.random.gamma(0.25, 0.3, 10)
IV. Pandas
Actualmente, una de las librerías más utilizada por los científicos de datos es Pandas[8], cuyo nombre
proviene de panel data, de manera que simula las estructuras de múltiples dimensiones que se utilizan en
econometría. Es una librería que nos permite realizar prácticamente cualquier tipo de transformación sobre
nuestros datos.
Las principales estructuras de datos con las que se puede trabajar en esta librería son series y dataframes.
“pd”.import pandas as pd
PANDASipynb.zip
813.4 KB
PANDAShtml.zip
851.1 KB
C O NT I NU A R
4.1. Series
Se trata de una colección indexada que funciona de un modo similar a un diccionario de datos. Es la unidad
mínima con la que podemos trabajar en Pandas, de hecho, un dataframe no es más que una sucesión de
series.
Las series funcionan de forma similar a un diccionario de datos donde tenemos los archivos
formados por {clave_1: 'valor uno', clave_2. 'valor dos', ....., clave_n: 'valor m'}.
2
Las series pueden formarse a través de un array de Numpy o una lista y unos valores que
actuarán como índices (si no se introducen, se tomarán por defecto de 0 a la longitud del
conjunto de elementos).
criptos = pd.Series(
[5973.55, 13.85, 0.1575, 0.96, 215.29],
index= ['Bitcoin', 'Ethereum', 'XRP', 'Tether', 'BTC Cash']
)
criptos
C O NT I NU E
4.2. Dataframes
Los dataframes son el resultado de unir una o más series. Funcionan de forma
similar a una matriz (salvo por el tipo de dato), una base de datos relacional o una
hoja de cálculo, es decir: son indexables por filas y columnas.
Función principal
–
Su función principal es que nos permiten pasar prácticamente cualquier tipo de variable como arrays, listas,
diccionarios, etc. Es: pandas.DataFrame.
# Ejemplo 3 listas
# Creamos una lista
lista = ['hola mundo', 1, 3.14, 'adios']
# Pasamos la lista a un DataFrame
df_list = pd.DataFrame(lista)
df_list
(pandas.core.frame.DataFrame)
C O NT I NU A R
4.3. Cargando archivos a través de un CSV
Una de las grandes ventajas que supone trabajar con dataframes es que podemos cargar archivos muy
fácilmente y procesar sus filas y columnas. Hay varios tipos de datos que podemos cargar a Pandas: CSV,
JSON, HTML, EXCEL, HDF5, TXT, ORC, STATA, etc.
Todos los tipos de datos que podemos cargar se encuentran en este link.
A lo largo de esta sección, se mostrarán las principales funcionalidades de Pandas a través de un archivo
CSV cargado como dataframe. Para cargar un CSV como un dataframe, se dispone de la función “read_csv”.
Se requiere previa descarga del siguiente dataset, que contiene información sobre datos inmobiliarios de
California[9]:
Con solamente una línea de código, se puede disponer de un dataframe totalmente operativo para realizar
cualquier tipo de transformación sobre el mismo. Si observamos la propia estructura del dataframe, vemos
que nos muestra el nombre de todas las columnas.
1
A la izquierda del mismo, podemos ver el índice del dataframe. En este caso va de 0 a 20639 filas
(sin contar la cabecera).
2
Abajo podremos ver el número de filas totales (contando la cabecera) y el número de columnas.
este enlace.
C O NT I NU A R
Para acceder a una columna, se debe escribir entre corchetes el nombre de la misma.
houses['housing_median_age']
2
Si atendemos al tipo de clase que tiene una columna, veremos que es Series
type(houses['housing_median_age'])
3
houses.housing_median_age
C O NT I NU A R
4.5. Selección de múltiples columnas de un dataframe
Una vez determinado que un dataframe se compone de series, se procederá a explicar cómo
seleccionar varias columnas.
1
Para ello, simplemente se deben encerrar entre corchetes los nombres de las columnas que se
quieran seleccionar, como:
Para hacer lo mismo mediante indexación, es decir, obtener un subconjunto de columnas del
dataframe por la posición que ocupan las columnas, podemos hacer:
nombre_dataframe[nombre_dataframe.columns[[col_n, col_m]]]
3
También a través de la función “iloc”, que permite seleccionar tanto filas como columnas, donde
las filas serán el primer elemento entre corchetes y las filas el segundo [filas, columnas]:
houses[['housing_median_age', 'total_bedrooms']]
5
houses[target]
6
Mediante índices
houses.columns[1]
houses.columns[0: 4]
houses[houses.columns[2:6]]
Anteriormente, se ha visto el uso de la función “.iloc”. Es importante saber cómo se
distribuye un dataframe de manera estructural en cuanto a sus filas y columnas,
pues, como se mostrará a continuación, un dataframe se puede indexar tanto por
sus filas como por sus columnas.
E S T R UC T UR A E JE M PLO
dataframe[filas, columnas]: tanto las filas como las columnas son indexables.
E S T R UC T UR A E JE M PLO
En el siguiente ejemplo, se seleccionarán todas las filas (para seleccionar todas las filas o todas las
columnas se utiliza el operador “:”) y las columnas uno y tres:
houses.iloc[:,[1,3]]
Para seleccionar desde la primera fila hasta un límite se realiza dataframe[0:n]; análogamente, se
puede omitir el cero y realizar simplemente dataframe[ : n],
2
Para seleccionar una sola fila, no se puede hacer la misma operación que en las listas, indexar una única
posición lista[n], ya que esto no nos devuelve nada; para ello, tenemos que seleccionar como un rango
personalizado la fila que queremos mostrar más una posición dataframe[n:n+1]
Figura 104. Selección de una fila.
Fuente: elaboración propia.
houses[1000:1000]houses[1000:1001]
C O NT I NU A R
houses.iloc[0:10, 0:3]
C O NT I NU A R
4.8. Índices de un dataframe
Un índice es un identificador de cada fila; todos los elementos de una fila comparten el mismo índice. Los
índices por defecto, son de 0 a la longitud total del dataframe.
Creamos un nuevo dataframe:
1
# Creamos un dataframe
ventas = {
df = pd.DataFrame(ventas)
2
df.index
Figura 108. Índice de un dataframe.
Fuente: elaboración propia.
Dependiendo de cómo estén formados los datos, se podrán crear multiíndices basados en columnas
propias del dataframe. Las columnas region y year tienen elementos repetidos. Esto permitirá hacer
multiíndices donde se tenga un continente por año de ventas.
region_year.iloc[0]
Función loc
–
Con la función loc podemos buscar elementos en el índice.
df.loc['REGISTRO_6']
Especialmente para big data sets, se puede ver el consumo en memoria RAM de nuestro dataset
con “.memory_usage”.
11
Ver un resumen gráfico (basado en densidad, scatter plots y gráficas de correlaciones) de todas
las variables del dataframe con “.scatter_matrix”.
12
Lo mismo pasa con el comando tail: si no le pasamos como parámetro el número de filas a visualizar,
tomará las últimas cinco.
Como podemos comprobar, unique es una función que tiene un mayor impacto en variables categóricas.
Por lo general, las variables numéricas tienen demasiados valores diferentes y no es interesante su estudio
desde el punto de vista de valores únicos.
Vemos que la función describe nos muestra un resumen estadístico solo de las variables numéricas.
Muestra información sobre el número de filas, media, desviación estándar, valor mínimo, máximo e
información referente a sus cuartiles.
Copia de un dataframe
–
Al igual que en listas y arrays, los dataframes comparten memoria. Es fácil equivocarnos y asignar a una
nueva variable un dataframe completo. Posteriormente, en esta nueva variable se realizan modificaciones
teniendo en cuenta que solamente se están realizando en la copia del dataframe.
No obstante, esto no es verdad, dado que se están realizando modificaciones en ambos dataframes ya que,
al estar almacenados en memoria, comparten las mismas posiciones.
bad_copy = houses
# Modificamos la primera fila por ceros
bad_copy.iloc[[0]] = np.zeros(len(houses.columns))
bad_copy.head(3)
Observamos que los cambios se reflejan en el dataframe original.
houses.head(2)
houses = pd.read_csv('housing_California.csv')
# Copiamos correctamente el dataframe
df_copia = houses.copy()
df_copia.iloc[[0]] = np.zeros(len(houses.columns))
df_copia.head(2)
houses.head(2)
Figura 121 Matriz de correlación de un dataframe.
Fuente: elaboración propia.
Nombres de las columnas de un dataframe
–
Con la función columns podemos acceder a los nombres de las columnas. Devuelve el resultado en forma
de lista. Esto permitirá poder utilizar cualquier función ya conocida sobre el manejo de listas para trabajar
con los nombres de las columnas de un dataframe.
# Para verlo más claro, vamos a realizar una copia de las diez primeras posiciones del dataframe
ten_rows = houses.head(10).copy()
# Duplicamos la fila 9
ten_rows = ten_rows.append(ten_rows.iloc[[9]])
ten_rows = ten_rows.append(ten_rows.iloc[[9]])
Gracias a este tipo de visualizaciones podemos estudiar algunas correlaciones, la distribución que siguen
las variables y sus diagramas de densidad.
En este ejemplo, se muestra una agrupación de columnas por la media (AVG en SQL).
# Agrupamos por la media de los valores numéricos para la columna ocean_proximity
houses.groupby(['ocean_proximity']).mean()
Figura 131. “Crosstab”.
Fuente: elaboración propia.
C O NT I NU A R
Primero, se crean dos copias del dataframe original para explicar las funciones:
'total_rooms', 'total_bedrooms']].head(5).copy()
last_positions = houses[['housing_median_age',
'total_rooms',
'total_bedrooms']].tail(4).copy()
“A PPE N D” “ C O N C AT ” ( I ) “ C O N C AT ” ( I I ) “ C O N C AT ” ( I I I )
De un modo similar a las listas, con “append” uniremos los dataframes de forma consecutiva.
# Unimos ambos datasets con append
first_positions = first_positions.append(last_positions)
first_positions
Se han apilado los dos dataframes respetando sus índices. En la columna households se puede ver que el
dataframe original no tenía datos sobre esta columna y, al unir los dataframes, los toma todos como nulos.
Figura 133. Dataframes “append”.
Fuente: elaboración propia.
“A PPE N D” “ C O N C AT ” ( I ) “ C O N C AT ” ( I I ) “ C O N C AT ” ( I I I )
Es muy importante saber los tipos de unión (join) que podemos realizar al concatenar datasets:
outer: la unión se realiza por todos los elementos entre los datasets
Se recomienda echar un vistazo a la documentación para ver los diferentes tipos de unión o join que
podemos realizar. [En línea] URL disponible en este enlace.
En el apartado anterior, se han alterado los dataframes. Se vuelven a crear y se juntan por dos criterios de
unión descritos anteriormente.
“A PPE N D” “ C O N C AT ” ( I ) “ C O N C AT ” ( I I ) “ C O N C AT ” ( I I I )
first_positions = houses[['housing_median_age',
'total_rooms',
'total_bedrooms',
'ocean_proximity']].head(5).copy()
last_positions = houses[['housing_median_age',
'total_rooms',
'total_bedrooms',
'households',
'ocean_proximity']].tail(4).copy()
union_outer = pd.concat([first_positions, last_positions],
ignore_index=True, join='outer')
union_outer
Figura 134. Outer join.
Fuente: elaboración propia.
“A PPE N D” “ C O N C AT ” ( I ) “ C O N C AT ” ( I I ) “ C O N C AT ” ( I I I )
Es el mismo resultado que con “append” (salvo por el índice que se resetea).
C O NT I NU A R
4.12. Nuevas columnas
En muchas ocasiones, habrá que añadir nuevas columnas a un dataframe o realizar modificaciones entre las
columnas de un dataframe para obtener una nueva.
Para agregar una nueva columna, simplemente se puede crear una nueva variable con el nombre
del dataframe y el nombre de la columna que se va a crear. Primero, se creará un array para
utilizarlo como datos de la nueva columna.
print(union_inner.columns)
union_inner.head()
2
Hay que señalar que cualquier operación que se realice entre columnas en un dataframe se aplica
a todos y cada uno de los elementos de la columna. Para ejemplificar esto, se crea una nueva
columna que sea la división de dos columnas del dataframe. Es importante ver que, para ello, no
se utiliza ningún bucle.
# Podemos crear una nueva columna que sea la media de camas por habitaciones totales
union_inner['mean_bedrooms'] = round(union_inner['total_rooms'] /
union_inner['total_bedrooms'],2)
C O NT I NU A R
4.13. Borrar filas y columnas
En algunas ocasiones, cuando se realiza una limpieza de datos o, simplemente, porque no sean objeto de
análisis, será necesario borrar filas o columnas de un dataframe. Para ambos casos, la función es la misma:
drop. Si se quiere borrar filas, se usará en el parámetro axis el valor 0 y, para las columnas, el valor 1.
A continuación, se muestran algunos ejemplos:
1
union_inner
2
print(union_inner, "\n")
print(union_inner.head(5))
C O NT I NU A R
print(union_outer.isnull().sum())
print("----------------------------------")
print(union_outer.isnull().sum()/len(union_outer)*100)
Función “dropna”
–
Por el contrario, si lo que queremos es borrar los valores nulos de un dataframe, podemos hacer uso de la
función “dropna”
Al igual que se puede cargar datos de diferentes fuentes y procesarlos como un dataframe, posteriormente
se puede escribir un dataframe en una de las múltiples fuentes un uno de los diversos formatos de archivo
que acepta Pandas para exportar archivos.
V. Resumen
A lo largo de la presente unidad, se ha trabajado con los archivos más comunes que podemos
encontrarnos a la hora de obtener y procesar un dataset con formatos de archivos muy comunes que se
encuentran a la hora de leer datos con los que trabajar. Se ha visto cómo trabajarlos sin utilizarlos como
dataframes y las diferentes formas de gestionar archivos.
Se ha visto a los arrays de la mano de la librería Numpy y se ha expuesto como diferenciarlos tanto por
su número de dimensiones, como por su estructura y las diferentes operaciones que podemos realizar
sobre los mismos. Es necesario conocer los arrays porque son la materia prima principal de algoritmos
de aprendizaje automático.
Por último, no podía faltar entre las herramientas del científico de datos la librería Pandas. Se ha visto
cómo crear un dataframe de cero o cargarlo desde un archivo, hasta realizar algunas de sus
operaciones más complejas, como agrupación, gestión de datos faltantes o selección de filas y
columnas, hasta su volcado final en archivos que soporta la librería.
Lección 6 de 8
ENUNCIADO
Un array con 10 unos.
EJERCICIO 2
Crea un array con la secuencia de números del 20 a 40 (ambos inclusive), tomados de cinco en
cinco elementos.
Finalmente, elimina todas las dimensiones del array y devuelve un array plano.
EJERCICIO 3
Crea un objeto Pandas series a través de un array de 30 elementos aleatorios que sigan una
distribución beta con parámetros 0,1 y 0,8.
Crea una nueva columna con nombre “SQUARE_BETA”, que sea cada elemento de la distribución
beta al cuadrado.
EJERCICIO 4
Crea un dataframe en donde el array “edad” tenga como nombre de columna “Edad” y, para la lista
“puntuación”, nombre “Puntuacion”.
Crea una nueva columna llamada “Situacion” que tenga como valores “PROMOCIONA” o “REPITE”
en función de si los valores de la columna “Puntuacion” son mayores a cinco o no.
V E R S O L U C I O NE S
EJERCICIO_1_SOLUCION_ipynb.zip
898 B
EJERCICIO_2_SOLUCION_ipynb.zip
1.6 KB
EJERCICIO_3_SOLUCION_ipynb.zip
10.4 KB
EJERCICIO_4_SOLUCION_ipynb.zip
22.9 KB
Lección 7 de 8
VII. Glosario
Dataframe
–
Estructura de datos similar a una matriz, compuesta e indexable por filas y columnas, que puede aceptar
diferentes tipos de datos, no solo numéricos. Todas sus filas comparten el mismo índice.
Array
–
Tipo de dato estructurado que almacena los datos de forma similar a una lista. Podemos distinguir entre
arrays de una dimensión (vector) a arrays multidimensionales.
Pandas
–
Librería de procesamiento de datos que nos permite generar series y dataframes de forma muy sencilla, ya
sea creando nuestros propios dataframes como importándolos a través de archivo.
Numpy
–
Librería dedicada a la creación y procesamiento de arrays, así como de operaciones matriciales y de
álgebra lineal.
Archivo CSV
–
Archivo de texto en el que cada dato está separado por comas.
Archivo XML
–
Archivo estructurado bajo lenguaje de marcas, en el que podemos encontrar elementos que contienen los
datos y atributos de forma jerárquica.
Archivo JSON
–
Archivo similar a un diccionario de datos en donde los datos se distribuyen entre pares de clave : valor.
Series
–
Es la estructura de datos más básica de Pandas. A cada índice le corresponde un dato que se representan
en una columna junto con su índice; cuando existen más de una columna, se habla de un dataframe, ya que
todos sus datos comparten el mismo índice. Al seleccionar una única columna de un dataframe, se obtiene
un objeto series de esta.
Alias
–
Nombre con el que se asigna a una librería para simplificar y mejorar la legibilidad del código. En Python, un
alias se representa como as nombre_de_la_librería.
Slice
–
Porción de un conjunto de datos, ya sea de una lista, array, dataframe u otros.
Stacking
–
Resultado de unir o apilar uno o más arrays en un único array.
Spliting
–
Resultado de dividir un array en n nuevos arrays.
Indexación negativa
–
Propiedad de listas y cadenas de texto, principalmente. Se interpreta como la eliminación de los n últimos
elementos de una lista.
Lección 8 de 8
VIII. Bibliografía
Chin, L. Numpy essentials. Packt Publishing; 2016. [En línea] URL disponible en el siguiente
enlace.
Miller, C. Hands on data analysis with Numpy and Pandas implement Python packages from
data manipulation to processing. Packt Publishing; 2018. [En línea] URL disponible en el
siguiente enlace.
Idris, I. Python data analysis cookbook. Packt Publishing; 2016. URL disponible en el siguiente
enlace.