Está en la página 1de 36

INTRODUCCIÓN A PYTHON

ORIENTADO A LA RESOLUCIÓN DE
PROBLEMAS DE OPTIMIZACIÓN EN
INGENIERÍA
(VI Edición, 2021)
Daniel Gutiérrez Reina, d.gutierrez.reina@gmail.com

Ignacio González Prieto, ignaciogp87@gmail.com

Mario Durán Martínez, mjduran@uma.es


Bloques del curso

 Bloque I: Introducción a Python y sus librerías para


análisis de datos (20 horas)
 Bloque II: Introducción a los algoritmos genéticos (10
horas)
Partes del primer bloque

 Parte I (Python General): Aprender nociones básicas sobre programación en


Python. Tipos de objetos (listas, tuplas, diccionarios, etc.), manejo de
funciones, control de flujo, y mucho más!!! → 12 horas aprox.
 Parte II (Numpy): Vectores o arrays multi dimensionales en Python. → 2,5
horas aprox.
 Parte III (Maplotlib): Representación gráfica en Python. → 2,5 hora aprox.
 Parte IV (Pandas): Manejo de datos en Python (dataframe). → 2,5 horas
aprox.
 Parte V (Scipy): Librería científica → 1 hora.
 Parte VI (Seaborn): Visualización de datos → 1 hora.
Recapitulando … Punto de partida
Hasta ahora sólo hemos aprendido los componentes más básicos de Python.

Vamos a comenzar a aprender los paquetes de Python más utilizados para el análisis de datos.
Tipos de secuencias que hemos visto
Listas: son mutables y accedemos a sus elementos por índices numéricos, del 0 a la longitud -1.
→ Filtrado mediante la función nativa filter.
→ Para añadir nuevos elementos necesito métodos (append).

Tuplas y cadenas: son inmutables y accedemos a sus elementos por índices numéricos, del 0 a
la longitud -1.

Diccionarios: son mutables y accedemos a sus elementos por “keys”, la “key” puede ser
cualquier objeto inmutable.
→ Filtrado más complicado.
→ Podemos añadir nuevos elementos sobre la marcha, creando una nueva pareja key-value.

Arrays numpy: son mutables y accedemos a sus elementos por índices numéricos, del 0 a la
longitud -1.
→ Filtrado sencillo mediante broadcasting y operaciones lógicas.
→ No podemos añadir nuevos elementos.
Empecemos con Pandas
Series: Son objetos con forma de array que contienen un array de datos (de
tipo numpy, también puede ser un lista) y tiene asociado un array de
etiquetas (tags).

tags contenido
→Abrir pandas1.py

→ Podemos acceder a los valores mediante las etiquetas


→ Filtrado de etiquetas
→ Se parecen a los diccionarios, de hecho un diccionario es fácilmente
convertible en una Serie.

Web oficial:
http://pandas.pydata.org/
Más cosas sobre Series en Pandas

Ejercicio: Definir una Serie con los personajes de tu “serie” favorita.


Demasiado métodos para memorizar!
Versión de pandas

Sí, unos cuantos métodos!

https://pandas.pydata.org/pandas- Consultar documentación


docs/stable/generated/pandas.Series.html

Ayuda de ipython!

Ojo! El método append() concatena series!


Más cosas sobre Series en Pandas
NaN: Not a number → El contenido de una serie se rellena con este
valor si la longitud del contenido no coincide con la longitud de las
etiquetas → NaN es de tipo flotante.

→Abrir pandas2.py

Para detectar y cambiar los NaN:

• isnull: genera una máscara booleana para indicar si es NaN o no.

• Dropna: devuelve una serie filtrada sin los NaN.

• Fillna: rellena los NaN con otros valores.


Más cosas sobre Series en Pandas
Método .apply(): Nos permite aplicar un función a todos los elementos de un
Serie.

Recordar que los valores de una Serie son un array de numpy. Por lo que sería
parecido a utilizar el método .vectorize() que hemos visto ateriormente.
Selección de elementos
Formas de seleccionar elementos: (pandas3.py)

• Selección explícita → Utilizando los índices que asignamos cuando se crea la


serie → Método loc[a:b] → No cumple la regla de los intervalos [a, b].

• Selección implícita → Utilizando el orden de los elementos como si fuera un


array de numpy. Tenemos dos alternativas:
• Slicing [:]
• Método iloc[:].
Resumen Series
❑ Tenemos dos array uno para los datos y otro para los índices.

❑ Cuando trabajamos con los datos es como si estuviéramos trabajando con Arrays
de numpy (todo lo que sabemos nos vale!)

❑ Tienen características de diccionarios:


• El vector de índices no tiene porque.
• Podemos añadir elementos una vez creada la serie (esto no se puede con los
arrays).

❑ Son objetos mutables → tenemos que utilizar el método copy.

❑ El imposible saber todos los métodos → hay que mirar la documentación para no
reinventar la rueda.
DataFrames en Pandas
DataFrame: Estructura de hoja datos (objeto), con una serie de columnas
que pueden contener datos de distintos tipos → Una colección de series.
También lo podemos ver como un diccionario en el que el contenido son
listas.
MÉTODOS

→ pandas4.py

Para acceder a los datos:

→ Utilizando el nombre de la columna df[“ciudad”]


→ Utilizando las columnas como atributos df.ciudad
DataFrames en Pandas
Características a tener en cuenta (pandas4.py):

• Podemos indicar el orden de las columnas (atributo columns)

• Podemos indicar el valor de los índices (atributo index)

• Podemos introducir contenido sobre la marcha (funciona como un diccionario)

• Si falta contenido NaN → Para resolver los NaN podemos utilizar los mismo métodos
que hemos visto con las series.

• El objeto Dataframe tiene muchísimos atributos y métodos


https://pandas.pydata.org/docs/reference/frame.html
DataFrames en Pandas
Acceso a los datos (pandas5.py):

• Recordar que podemos acceder por df[“nombre”] o df.nombre

• Selección puede ser df[“columna”][“fila”]

• Selección (slicing) explícita (df.loc[fila, columna]) o implícita igual que con las series df.iloc[fila, columna].

• Selección fila, columna → explícito .at[fila, columna], implícito .iat[fila,columna]

• Podemos copiar columnas

• Todas las operaciones de selección y copia devuelve una dataframe nuevo, es una copia del original
por lo que cualquier modificación no afecta al original.

• SettingwithCopyWarning
DataFrames en Pandas
Filtrado (pandas6.py):

• Funciona con máscara y broadcasting al igual que el filtrado con numpy

• Genera un Dataframe nuevo (no está relacionado con original) → Si intentamos modificar
el nuevo Dataframe nos dará un warning.

• Recordar que las operaciones booleanas entre las máscaras.

Tutorial sobre el warning settingwithcopywarning

https://realpython.com/pandas-settingwithcopywarning/
DataFrames en Pandas
Eliminar datos (pandas7.py):

• La función nativa del me permite eliminar cualquier objeto → siempre me vale.

• Método drop me permite eliminar filas y columnas.

• Axis dataframe
Obtener los datos desde archivos
Vamos a ver como podemos obtener los datos desde un archivo y
convertirlos en un DataFrame. Podemos leer casi cualquier tipo de archivo.

Recordáis las List Comprenhension

→Abrir pandas8.py
Leer un CSV y convertirlo a DataFrame

Son unos cuantos …

Siempre consultar documentación:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html
Datos estadísticos del DataFrame
Para obtener valores estadísticos tenemos dos opciones:

1) Considerar que cada columna del Dataframe es un array de numpy (o incluso el Dataframe
completo como una matriz) → Utilizar todo lo que sabemos de numpy.

2) Utilizar métodos propios del Dataframe (utilizar el axis): Funcionan como las funciones
Universales (ufunc) de numpy.
Datos estadísticos del DataFrame

Podemos aplicar una gran cantidad métodos estadísticos

http://pandas.pydata.org/pandas-docs/stable/api.html#api-dataframe-stats
Escribir los resultados en una hoja excel

Métodos:

Ejercicio: utilizando pandas6.py, crear un nuevo sensor que sea el resultado de


el valor absoluto de restar S1 y S2, guardar el resultado en el archivo
resultado.csv

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html
Vamos a operar un poco sobre el DataFrame
Operaciones sobre el Dataframe (pandas9.py):

• Incluir una nueva columna es muy sencillo ya que el Dataframe funciona como un
diccionario especializado df[“nueva_columna”].

• Realizar operaciones matemáticas entre columnas es muy sencillo porque son


Arrays de numpy (+, - *, etc.).

• Repasamos filtrado. Cuando realizamos el filtrado los índices del Dataframe


resultado cambian → .reset_index() para resolverlo.

• Método filter otra opción más para filtrar.


Vamos a operar un poco sobre el DataFrame
Añadir filas y concatenar dataframes (pandas10.py):

• Para añadir nuevas filas podemos utilizar el método append, debemos tener en cuenta que
devuelve un nuevo dataframe (hay que tener cuidado con los índices → ignores_index = True)

• Para concatenar dataframes debemos utilizar pd.concat([df1, df2], axis=0), el atributo axis
nos permite decidir si concatenamos por columnas (axis = 0) o por filas (axis = 1).

Operación de merge (pandas11.py):

• One-to-one o inner join: cuando tenemos un columna en común entre los dataframes → si no hay
filas que coinciden se descartan.

• Many-to-one: cuando en la columna en común aparecen entradas repetidas en uno de los


dataframes.

• Many-to-many: cuando en la columna en común aparecen entradas repetidas en los dos


dataframes que queremos unir.
Vamos a operar un poco sobre el DataFrame
Operación de merge (pandas11.py):

• One-to-one o inner join: cuando tenemos un columna en común entre los dataframes → si no hay
filas que coinciden se descartan.
Vamos a operar un poco sobre el DataFrame
Operación de merge (pandas11.py):

• Many-to-one: cuando en la columna en común aparecen entradas repetidas en uno de los


dataframes.
Vamos a operar un poco sobre el DataFrame
Operación de merge (pandas11.py):

• Many-to-many: cuando en la columna en común aparecen entradas repetidas en los dos


dataframes que queremos unir.
Vamos a operar un poco sobre el DataFrame
Operación de merge (pandas11.py):

• Atributo on si queremos elegir la columna.

• left_on y right_on se utilizan si los dataframes tiene nombres distintos en las columnas que
queremos utilizar para unir.

• Si queremos utilizar los índices de alguno de los dos dataframes debemos utilizar left_index y
right_index.
Graficar → Pandas y Matplotlib
Tenemos dos opciones: (pandas12.py)

1) Consideramos que cada columna es un array y aplicamos todo lo que sabemos Métodos:
de matplotlib.

2) Utilizamos los método propios del Dataframe para visualizar los datos.
Trabajando con datos reales DTN
Descripción del experimento:

• el archivo upb2011.dat contiene los datos de encuentro entre diferentes dispositivos móviles.
un encuentro no es más que una comunicaciones Inalámbrica entre dos personas que portan
un dispositivo móvil (teléfono móvil).

• Cada columna del archivo representa información distinta. Nosotros vamos a centrarnos en las
primeras cuatro columnas (emisor, receptor, t_inicio, t_final).

→Abrir pandas13.py
→Usar upb2011.dat
Ordenar dataframes según el contenido de
ciertas columnas
Ejercicio: Utilizando el archivo upb2011.dat ordenar los encuentro entre nodos por
El tiempo de inicio en el que se producen.

Visualizar el número de encuentros (acumulativo) en función del tiempo. Eje y acumulación


de encuentros, eje x tiempo.
Trabajando con datos de Exoplanetas: Ley de
Benford
Ley de Benford: (pandas14.py)

También conocida como la ley del primer dígito, asegura que, en gran variedad de conjuntos de datos
numéricos que existen en la vida real, la primera cifra es 1 con mucha más frecuencia que el resto
de los números. Además, según crece este primer dígito, más probable es que se encuentre en la
primera posición. La ley también asegura cierta frecuencia para los siguientes dígitos.
Ordenar dataframes según el contenido de
ciertas columnas
Ejemplo

→Abrir pandas15.py
→usar medidas.csv

ascendente descendente
Inspeccionar DataFrames → Data Science
A veces trabajamos con muchos datos. Los dataframes tienen atributos y métodos
para ver la forma que tienen los datos.

Atributos:
.info()
.shape

Métodos:

.info()
.heap()
.tail()

→Abrir pandas16.py
→usar upb2011.dat
DataFrames que utilizaremos en Machine
Learning
house_data_small.csv: características de casas, precio, habitaciones, m2, etc.

→ Abrir pandas17.py

Ejercicio: Ordenar el dataframe en función del precio de las casas.

Ejercicio: Representar gráficamente el precio de las casas (variable Y) con respecto a los metros
cuadrados la vivienda (sqft_living) (variables X). Utilizar para ello un diagrama de dispersión.
(scatter plot).
Bibliografía

 http://pandas.pydata.org/

 Python for Data Analysis, Editorial. O’Reilly. Autor. Wes McKinney

 http://www.python-course.eu/course.phphttp://www.python-
course.eu/course.php

 https://www.machinelearningplus.com/python/101-pandas-exercises-
python/

También podría gustarte