1. INTRODUCCIÓN
2. NUMPY
2.1 - Nociones básicas sobre matrices
2.2 - Matriz unidimensional
2.3 - Matriz bidimensional
2.4 - Matriz tridimensional
2.5 - Otras funcionalidades
3. PANDAS
3.1 - Dataframes
3.2 - Series
3.3 - Exportar e importar
3.4 - Otras funcionalidades
4. PRÁCTICA: ANALIZAR ENCUESTAS
4.1 - Obtener datos de encuestas
4.2 - Crear dataframe
4.3 - Analizar datos
4.4 - Generar gráficas con MATPLOTLIB
4.5 - Otras funcionalidadse de MATPLOTLIB
Numpy es una biblioteca de Python para funciones matemáticas de alto nivel especialmente diseñada para trabajar con matrices (arrays) y vectores. Al estar escrita en C aporta una mayor velocidad y flexibilidad para trabajar con datasets (conjuntos de datos del mismo tipo) y son una excelente alternativa a las listas de Python.
Pandas es una extensión de Numpy para manipulación y análisis de datos que trabaja con dataframes (conjuntos de datos que pueden ser o no de distintos tipos).
Tanto los datasets como los dataframes son estructuras rectangulares de datos que se almacenan en filas y columnas, la única diferencia es que mientras las matrices almacenan un unico tipo de datos, los dataframes pueden contener distintos tipos de datos.
Matplotlib es una biblioteca de Python para la generación de gráficos a partir de datos contenidos en listas o arrays, fue diseñada para recordar a Matlab.
Para instalar ejecutar en la consola de comandos:
pip install numpy
pip install pandas
pip install matplotlib
La forma convencional de importar Numpy es mediante su alias np. Vamos a crear una lista y su equivalente en matriz:
import numpy as np
lista = [10,20,30]
matriz = np.array([10,20,30])
print(lista)
print(matriz)
Podemos acceder a sus elementos de la misma forma, por ejemplo al segundo elemento, recuerda que en Python se empieza a contar desde 0:
print(lista[1])
print(matriz[1])
Ahora veremos qué pasa al multiplicar por 2:
a = lista*2
b = matriz*2
print(a)
print(b)
Cronometramos cuánto se tarda en hacer la misma operación con una lista y una matriz:
%%time
a = [numero for numero in range (0,1000000)]
z= []
for i in range(0,len(a)):
r = a[i] * 2
z.append(r)
%%time
a = [numero for numero in range (0,1000000)]
a2= np.array(a)
z2 = a2*2
Ahora vemos cuánto ocupan en memoria la lista y la matriz:
import sys
print("la lista ocupa",sys.getsizeof(z),"bytes")
print("la matriz ocupa",sys.getsizeof(z2),"bytes")
Pasamos una lista a matriz:
import numpy as np
lista_2 = [2,3,4,5]
matriz_2 = np.array(lista_2)
print(matriz_2)
Podemos declarar una matriz lineal con:
np.linspace(start = 0, stop = 10, num = 5, dtype = float)
b = np.linspace(1,10,10,dtype=int)
print(b)
Podemos tener matrices de múltiples dimensiones:

A = np.array([(1,2,3),(7,8,9),(13,14,15),(19,20,21)])
A

A[2,1]
print("Nº de dimensiones:",A.ndim)
print("Nº de elementos:",A.size)
print("Forma de la matriz (filas, columnas):",A.shape)
Vamos a generar una matriz tridimensional con numeros enteros aleatorios del 1 al 5:
B = np.random.randint(1,6,size = (3,3,3))
B
print("Nº de dimensiones:",B.ndim)
print("Nº de elementos:",B.size)
print("Forma de la matriz (dimensión, filas, columnas):",B.shape)
Si quisieramos acceder al elemento situado en la 1ª dimensión, 3ª fila, 2ª columna (recuerda que se empieza a contar desde 0):
B[0,2,1]
Lo expuesto hasta ahora solo ha sido una breve introducción a la biblioteca Numpy y a cómo trabajar con matrices pero sería conveniente profundizar más porque es un gran soporte para matemáticas.
pi = np.pi
print(pi)
Puedes encontrar más información en este Tutorial de Numpy.
La forma convencional de importar Pandas es mediante su alias pd pero como una de sus funciones más importantes es la creación de dataframes empezaremos llamando a las dos. Vamos a crear un dataframe simple para ver rápidamente lo que podemos hacer con esta biblioteca.
Creamos un diccionario en el que las claves serán los nombres de las columnas y los valores serán listas con los registros o filas de nuestra tabla. Evidentemente tendremos que asignar el mismo número de registros para cada columna. Asignamos a la variable df la conversión del diccionario a dataframe.
import pandas as pd
from pandas import DataFrame
coches = {'marca': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
'precio': [22000,25000,27000,35000]}
df = DataFrame(coches, columns = ['marca', 'precio'])
df
Vemos el tipo de la variable df, su longitud y su tamaño:
print("tipo:",type(df))
print("longitud:",len(df))
print("tamaño:",df.size)
Si queremos listar los nombres de las columnas:
list(df)
Si queremos listar por columnas:
df.marca
columnas = df[['precio','marca']]
print(columnas)
Si queremos el primer elemento de una columna:
df.precio[0]
Si queremos listar la primera fila:
df.loc[0]
Ahora veremos cómo realizar cálculos estadísticos para analizar nuestros datos:
df.precio.describe()
Nos dice que tenemos 4 registros en precio, la media aritmética sería 27250, la desviación típica 5560.275773, el valor mínimo 22000, el máximo 35000, el cuartil inferior 24250, la mediana 26000 y el cuartil superior 29000.
Podemos pedir también solo uno de los parámetros si así lo deseamos, por ejemplo la media aritmética:
df.precio.mean()
Podemos serializar una lista para trabajar con ella:
datos = [2,3,4,5,64,5,7]
serie = pd.Series(datos)
print(serie)
serie.describe()
Y si quisieramos pasar de pandas a lista:
lista = serie.tolist()
lista
Veamos otro ejemplo con listas anidadas:
campos = [['nombre', 'teléfono', 'email'], ['dirección', 'código postal'], ['información']]
agenda = pd.Series(campos)
agenda
Ahora compactaremos la serie para eliminar los anidamientos:
agenda2 = agenda.apply(pd.Series).stack().reset_index(drop=True)
agenda2
Si queremos agregar más elementos:
agenda2 = agenda2.append(pd.Series(['A', 'B']))
agenda2
si queremos listar por orden alfabético:
agenda2 = agenda2.sort_values()
agenda2
df
Exportamos nuestro dataframe de coches a formato csv o a excel:
exportar_csv = df.to_csv ('coches.csv', index = None, header=True)
# Para exportar a Excel -> pip install openpyxl
exportar_excel = df.to_excel ('coches.xlsx', index = None, header=True)
Ahora importamos el csv:
autos = pd.read_csv('coches.csv')
autos
Puedes encontrar más información en este Tutorial de Pandas.
El periódico El País ofrece el detalle de todas las Encuestas Electorales que se han ido publicando desde las últimas elecciones generales. En la misma página podemos encontrar el archivo CSV con todos los datos, procederemos a descargarlo y ver qué podemos hacer con ellos.

import pandas as pd
from pandas import DataFrame
# Leer csv
tabla = pd.read_csv('tabla.csv')
# Crear dataframe
datos = DataFrame(tabla)
# Imprimir datos
datos
Podemos observar que tenemos 73 filas y 16 columnas, y que los campos que no tienen datos aparecen como NaN. Ahora si queremos listar los nombres de las columnas:
list(datos)
Si queremos obtener todos los datos de una columna, por ejemplo PSOE:
datos.PSOE
Podemos obtener un cálculo estadístico fácilmente, por ejemplo de Unidas Podemos:
datos.UP.describe()
Observamos que la media aritmética es de un 13,05% de intención de voto y que los datos están bastante agrupados puesto que la desviación típica es de 1,06.
Ahora vamos a ver los datos de C's:
datos.Cs.describe()
Podemos observar que mientras la media es de un 12,7% la desviación típica de 2,45 nos indica que los datos están más dispersos que los de UP.
Como el objetivo es aprender a hacer gráficas y no hacer un estudio riguroso sobre las encuestas, antes de realizar la gráfica eliminaremos algunos registros que están mal ordenados o duplicados para simplificar el gráfico. Hay que decir también que aunque el formato de las fechas esté mal no perderemos el tiempo en corregirlo.
f = datos.drop([0,1,3,4,5,6,7,8,9,10,11,12,13,14,17],axis=0)
%matplotlib inline
import matplotlib.pyplot as plt
# Establecemos el eje X con las fechas
x = f.date
# Y creamos las variables de los 5 primeros partidos
psoe = f.PSOE
pp = f.PP
cs = f.Cs
up = f.UP
vox = f.VOX
# Nombre de las funciones
nombre1 = 'PSOE'
nombre2 = 'PP'
nombre3 = "C's"
nombre4 = 'UP'
nombre5 = 'VOX'
# Definimos el tamaño del gráfico
fig, axes = plt.subplots(figsize=(18,9))
# Título del gráfico
título = ("Intención de voto")
axes.set_title(título)
# Etiquetas de los ejes X e Y
axes.set_xlabel("Fecha")
axes.set_ylabel("Porcentaje de voto")
axes.set_xticklabels(x,rotation=90 )
# Rejilla
axes.grid(True)
# Creamos la gráfica
axes.invert_xaxis()
axes.plot(x,psoe,'red', x,pp,'blue', x,cs,'orange', x,up,'purple', x, vox, 'green')
axes.legend([nombre1, nombre2, nombre3, nombre4, nombre5])
# Guardamos foto
# fig.savefig(título + '.png', dpi=300)
Con Matplotlib podemos realizar también histogramas, gráficos de barras, diagramas de dispersión, etc.
Puedes encontrar más información en este Tutorial de Matplotlib.