0% encontró este documento útil (0 votos)
114 vistas73 páginas

Clase 6 - Introducción A La Manipulación de Datos Con Pandas (Parte II)

Este documento presenta información sobre el manejo de datos nulos en Pandas. Explica que los datos nulos son comunes y pueden afectar el rendimiento de los modelos de machine learning. Luego detalla estrategias como reemplazarlos por valores constantes, el promedio u otra métrica, o usar SimpleImputer en Scikit-Learn.

Cargado por

Nicolas Caminos
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
114 vistas73 páginas

Clase 6 - Introducción A La Manipulación de Datos Con Pandas (Parte II)

Este documento presenta información sobre el manejo de datos nulos en Pandas. Explica que los datos nulos son comunes y pueden afectar el rendimiento de los modelos de machine learning. Luego detalla estrategias como reemplazarlos por valores constantes, el promedio u otra métrica, o usar SimpleImputer en Scikit-Learn.

Cargado por

Nicolas Caminos
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 73

Esta clase va a ser

grabada
Clase 06. DATA SCIENCE

Introducción a la
manipulación de datos con
Pandas (Parte II)
Temario

05 06 07
Introducción a la
Programación con manipulación de datos Visualizaciones y
arrays: Introducción a con Pandas (Parte II) primeros pasos con
Numpy DS I
✓ Estructura de datos ✓ Fuentes de datos

✓ Numpy y ndarrays ✓ Series y data frame ✓ Matplotlib


✓ Tipos de datos ✓ Selección de datos
✓ Tipos de gráficos
✓ Indexado y acceso ✓ Operaciones

✓ Operaciones básicas ✓ Agregaciones ✓ Customizaciones so


bre gráficos
✓ Operaciones vectorizadas ✓ Strings
Objetivos de la clase

Conocer las estructuras de datos en Pandas

Comprender el uso de Pandas para la manipulación de


grandes volúmenes de datos
MAPA DE CONCEPTOS

Series
Estructuras de datos
de Pandas
Data Frames Lectura desde archivos

Selección de elementos
Manipulación de Tratamiento de datos
datos con Pandas ausentes
Operaciones

Agregaciones

Introducción a las Conversión a Objetos de Operaciones sobre


Series de TIempo Tiempo Strings
Repaso en Kahoot
Ejemplo en vivo
Uso de filtros para obtener comportamiento de una
acción
Aplicando conceptos de variables, índices booleanos y
filtros. Los datos se encuentran en:
https://raw.githubusercontent.com/JJTorresDS/stocks-
ds-edu/main/stocks.csv
Introducción a la librería en Pandas

Pandas Data Frame Pandas Series Manejo de datos nulos


Fuentes de
datos disponibles
Fuentes de datos disponibles

En esta pagina encontrarás muchas más APIs para descargar información:


https://github.com/public-apis/public-apis#finance
Series y
Data Frame
Recall: Pandas Series
Pandas Series
… como los Numpy arrays, pero con índices

✔ Se construyen a partir de otros objetos


particulares, como las listas o los Numpy
arrays
✔ Tienen índice propio.

Numeros = range(50, 70, 2)


Numeros_serie = pd.Series(Numeros) 👉
print(Numeros_serie)

print(Numeros_serie[2]) 👉
Pandas Series (Resumen)

En resumen, las series son objetos 1D que tienen 3


componentes principales.
✔ Índices: Pueden ser cualquier tipo de variable
✔ Valores: Asociados a cada índice
✔ Nombre: Que caracteriza a la serie
Recall: Pandas Data
Frames
Pandas Data Frames

Construyendo un tablero de ajedrez con Panda Data


Frames

Ajedrez_64 = np.arange(1,65).reshape(8,8)
Ajedrez_df = pd.DataFrame(
Ajedrez_64,
columns=range(1,9), 👉
index=['A','B','C','D','E','F','G','H']
)
Ajedrez_df
Pandas DataFrames (Resumen)

En resumen las series son objetos 2D (filas x


columnas) con las siguientes propiedades:
✔ Índices: Pueden ser cualquier tipo de variable
✔ Valores: Asociados a cada índice y a cada
columna
✔ Nombre: Que caracteriza al Dataframe
¡Son una generalización de series!
Selección de
datos
Recall: Selección de datos
Recordemos como se hacía selección de elementos en Series y DataFrames

¿Recuerdan la diferencia entre .loc


y .iloc?
Recall: Selección de datos
Recordemos como se hacía selección de elementos en Series y DataFrames
Operaciones con
datos
Manejo de datos nulos
Manejo de datos
nulos
✔ Los datos nulos son uno de los problemas más comunes a los
que se enfrenta un Data Scientist
REEMPLAZAR
POR IMAGEN ✔ Son un problema porque muchos algoritmos no están
diseñados para trabajar con ellos y pueden disminuir el
performance en general de las tareas de aprendizaje
automático
✔ Son más comunes de lo que las personas piensan.
✔ Pueden surgir por malos esquemas de muestreo, falla de
sensores, renuencia a responder en encuestas, malos diseños de
captura de datos
Manejo de datos nulos

Para poder manejar estos datos, en general, se ✔ Reemplazar por un valor seleccionado
usan las siguientes estrategias: al azar de los otros registros:
○ Usar la media, mediana o moda
✔ Introducir un valor constante para los
para rellenar el valor
nulos o una categoría llamada
○ Valor estimado usando un
Desconocido en variables categóricas
modelo

Podemos aplicar estas técnicas de forma


manual o usando
SimpleImputer de ScikitLearn
Manejo de datos nulos

¡Les pedimos que abran el documento


correspondiente en Google Collab para que podamos
trabajar juntos el ejemplo en vivo sobre cómo
trabajar datos nulos!
Manejo de datos nulos: Forma
Manual
Si queremos reemplazar las columnas numéricas por
media podemos hacer esto
0 1 2 3 4 5 6 7 8
0 6.0 148.0 72.0 35.0 NaN 33.6 0.627 50 1.0
1 1.0 85.0 66.0 29.0 NaN 26.6 0.351 31 NaN
url='https://raw.githubusercontent.com/jbrownlee/ 2 8.0 183.0 64.0 NaN NaN 23.3 0.672 32 1.0
Datasets/master/pima-indians-diabetes.csv'
df= pd.read_csv(url,sep=',', header=None)
👉 3
4
1.0 89.0 66.0 23.0 94.0 28.1 0.167 21 NaN
NaN 137.0 40.0 35.0 168.0 43.1 2.288 33 1.0
print(df.shape)

0 1 2 3 4 5 6 7 8
# reemplazar con la media 0 6.00 148.0 72.0 35.00 155.55 33.6 0.63 50 1.0
1 1.00 85.0 66.0 29.00 155.55 26.6 0.35 31 1.0
df.fillna(df.mean(), inplace=True)
print(df.shape)
👉 2 8.00 183.0 64.0 29.15 155.55 23.3 0.67 32 1.0
3 1.00 89.0 66.0 23.00 94.00 28.1 0.17 21 1.0
4 4.49 137.0 40.0 35.00 168.00 43.1 2.29 33 1.0
Manejo de datos nulos:
SimpleImputer
Si queremos reemplazar las columnas numéricas por
media podemos hacer esto
0 1 2 3 4 5 6 7 8
0 6.0 148.0 72.0 35.0 NaN 33.6 0.627 50 1.0
1 1.0 85.0 66.0 29.0 NaN 26.6 0.351 31 NaN
url='https://raw.githubusercontent.com/jbrownlee/
Datasets/master/pima-indians-diabetes.csv'
👉 2
3
8.0 183.0 64.0 NaN NaN 23.3 0.672 32 1.0
1.0 89.0 66.0 23.0 94.0 28.1 0.167 21 NaN
4 NaN 137.0 40.0 35.0 168.0 43.1 2.288 33 1.0
df= pd.read_csv(url,sep=',', header=None)
print(df.shape)

# reemplazar con la media Missing: 0


0 1 2 3 4 5 6 7 8
valores = df.values #numpy array con los valores
imputador = SimpleImputer(missing_values=np.nan,
👉 0 6.00 148.0 72.0 35.00 155.55 33.6 0.63 50.0 1.0
1 1.00 85.0 66.0 29.00 155.55 26.6 0.35 31.0 1.0
2 8.00 183.0 64.0 29.15 155.55 23.3 0.67 32.0 1.0
strategy='mean') #definir el imputador 3 1.00 89.0 66.0 23.00 94.00 28.1 0.17 21.0 1.0
# transformar el dataset 4 4.49 137.0 40.0 35.00 168.00 43.1 2.29 33.0 1.0

transformados = imputador.fit_transform(valores)
transformados=pd.DataFrame(transformados)
print(transformados.head().round(2))
Manejo de datos nulos:
SimpleImputer
Si queremos reemplazar las columnas numéricas por
mediana podemos hacer esto
url='https://raw.githubusercontent.com/jbrownlee/ 0 1 2 3 4 5 6 7 8
Datasets/master/pima-indians-diabetes.csv' 0 6.0 148.0 72.0 35.0 NaN 33.6 0.627 50 1.0
df= pd.read_csv(url,sep=',', header=None) 👉 1
2
1.0 85.0 66.0 29.0 NaN 26.6 0.351 31 NaN
8.0 183.0 64.0 NaN NaN 23.3 0.672 32 1.0
print(df.shape)
3 1.0 89.0 66.0 23.0 94.0 28.1 0.167 21 NaN
4 NaN 137.0 40.0 35.0 168.0 43.1 2.288 33 1.0

# reemplazar con la mediana


valores = df.values #numpy array con los valores
imputador = SimpleImputer(missing_values=np.nan, 0 1 2 3 4 5 6 7 8
0 6.0 148.0 72.0 35.0 125.0 33.6 0.63 50.0 1.0
strategy='median') #definir el imputador
1 1.0 85.0 66.0 29.0 125.0 26.6 0.35 31.0 1.0
# transformar el dataset
transformados = imputador.fit_transform(valores)
👉 2
3
8.0
1.0
183.0 64.0 29.0 125.0 23.3 0.67 32.0 1.0
89.0 66.0 23.0 94.0 28.1 0.17 21.0 1.0
transformados=pd.DataFrame(transformados) 4 4.0 137.0 40.0 35.0 168.0 43.1 2.29 33.0 1.0
print(transformados.head().round(2))
Manejo de datos nulos:
SimpleImputer
Si queremos reemplazar las columnas numéricas por
moda podemos hacer esto

0 1 2 3 4 5 6 7 8
url='https://raw.githubusercontent.com/jbrownlee/
0 6.0 148.0 72.0 35.0 NaN 33.6 0.627 50 1.0
Datasets/master/pima-indians-diabetes.csv'
df= pd.read_csv(url,sep=',', header=None)
👉 1
2
1.0 85.0 66.0 29.0 NaN 26.6 0.351 31 NaN
8.0 183.0 64.0 NaN NaN 23.3 0.672 32 1.0
print(df.shape) 3 1.0 89.0 66.0 23.0 94.0 28.1 0.167 21 NaN
4 NaN 137.0 40.0 35.0 168.0 43.1 2.288 33 1.0

# reemplazar con la moda


valores = df.values #numpy array con los valores 0 1 2 3 4 5 6 7 8
0 6.0 148.0 72.0 35.0 105.0 33.6 0.63 50.0 1.0
imputador = SimpleImputer(missing_values=np.nan,
strategy='most_frequent') #definir el imputador 👉 1 1.0 85.0 66.0 29.0 105.0 26.6 0.35 31.0 1.0
2 8.0 183.0 64.0 32.0 105.0 23.3 0.67 32.0 1.0
# transformar el dataset
3 1.0 89.0 66.0 23.0 94.0 28.1 0.17 21.0 1.0
transformados = imputador.fit_transform(valores) 4 1.0 137.0 40.0 35.0 168.0 43.1 2.29 33.0 1.0
transformados=pd.DataFrame(transformados)
print(transformados.head().round(2))
Agregaciones con
Pandas
Recall: Agregaciones

De la clase anterior recordemos que ... ✔ Las agregaciones son un tipo de operación.
✔ Se realizan sobre un conjunto de datos.
✔ Retornan un resultado que es una medida
resumen del conjunto de datos
✔ Las principales agregaciones de Numpy son:
✔ np.sum, np.mean, np.max, np.std, np.var
Agregaciones en Pandas

Pandas permite realizar agregaciones sobre Data


Frames enteros o porciones del mismo.
En primer lugar, importemos nuestro dataset de df_lluvias_archivo = pd.read_csv('<ruta>/pune_1965_to_2002.csv')
prueba:

1. Descargue el archivo con formato .csv desde


este enlace.
2. Copie la ruta del archivo y pásela al método
read_csv de Pandas:
Lectura de Datasets

Hasta el momento, nuestro dataset luce así: ✔ Se trata de mediciones de precipitaciones (en
milímetros)
✔ Existe un total de trece columnas, una para el
año y otras doce para cada uno de los meses
✔ Tiene un índice numérico.

Sería conveniente que el índice sea la columna


Year 🤔
Construyamos un nuevo Data Frame con este índice
Lectura de Datasets
indice = list(df_lluvias_archivo.Year)
indice 👉

columnas = df_lluvias_archivo.columns[1:]
columnas 👉

Guardamos en un arreglo todos los valores,


excepto los de la primera columna 👉 valores = df_lluvias_archivo.values[:,1:]
Lectura de Datasets
Ensamblamos las partes… 🦾🤖

¡Y listo!
df_lluvias = pd.DataFrame(valores,index=indice,columns=columnas)
df_lluvias
Ya tenemos preparado
nuestro Data Frame
Agregaciones en Pandas
✔ Suma de las precipitaciones para cada mes.
👉 df_lluvias.sum()
✔ Promedio de precipitaciones de cada año.

df_lluvias.mean(axis='columns') 👉
El método Describe
El método describe
👉 df_lluvias.describe().round(1)
Este método nos ayuda a…

✔ Obtener un breve resumen del Data Frame con


describe()

✔ Redondear los valores de un Data Frame con el


método round()
El método describe
✔ Si transponemos el Data Frame antes de 👉 df_lluvias.T.describe().round(1)
aplicar describe, obtenemos el resumen según
el año
El método Groupby
El método groupby
✔ La función groupby () se utiliza para dividir los
datos en grupos según algunos criterios.

✔ Los objetos pandas se pueden dividir en


cualquiera de sus ejes.

✔ Se puede realizar cualquier operación con las


agrupaciones siempre y cuando el tipo de dato
lo permita
El método groupby Jan Feb Mar
Year
1965 0.029 0.069 0.000
El método groupby nos permite agrupar por una o 1966 0.905 0.000 0.000
más categorías y posteriormente aplicar una función 1967 0.248 3.390 1.320
de resumen por ejemplo (media, mediana, moda, 1968 0.318 3.035 1.704
max, min). 1969 0.248 2.524 0.334
1970 0.070 0.000 0.001
1971 0.000 0.000 0.000
1972 0.000 0.029 0.000
1973 0.000 2.969 0.234
print(df_lluvias_archivo.groupby('Year')
['Jan','Feb','Mar'].mean().head(15))
👉 1974 0.000 0.000 6.427
1975 0.333 0.585 0.000
1976 0.000 0.000 5.993
1977 0.000 2.981 3.289
1978 0.061 4.197 4.00 4

Break
¡10 minutos y volvemos!
Operaciones con
Strings
Operaciones con Strings
✔ A menudo, tendremos que trabajar con datos en
forma de Strings, es decir cadenas de caracteres
o texto.

✔ Es muy probable que no tengan el formato


requerido

✔ Pandas provee métodos para manipular Strings


masivamente
Operaciones con Strings
Para estos ejemplos, usaremos el dataset de presidentes de EEUU, ¡trabajaremos juntos en vivo!
1) Descargue el archivo .csv en este enlace.

Presidentes_archivo = pd.read_csv('<ruta>/us_presidents 2.csv')

2) Seleccione la columna president

Presidentes_nombres = pd.Series(Presidentes_archivo['president'])
Presidentes_nombres
Operaciones con Strings
Veamos algunos ejemplos...

✔ Convertir a mayúsculas

Presidentes_nombres.str.upper( 👉
)

✔ Longitud total, incluyendo espacios y otros caracteres que puedan aparecer

Presidentes_nombres.str.len() 👉
Operaciones con Strings
Veamos algunos ejemplos...

✔ Evaluar si comienzan con una determinada letra

Presidentes_nombres.str.startswith('J') 👉
✔ Separar en una lista
usando el espacio como separador

Presidentes_nombres.str.split()) 👉
Introducción a Series de
Tiempo
Series de Tiempo
… datos, ligados al tiempo

✔ Son tipos de datos especiales donde el tiempo toma un rol fundamental.

✔ Observamos cambios en los valores de la variable a lo largo del tiempo.

✔ Si ignoramos esa dimensión temporal, los valores pierden contexto.

✔ Son variables aleatorias indexadas por el tiempo


Series de Tiempo
… datos, ligados al tiempo 🕐

Python provee tres tipos de datos relacionados al tiempo:


✔ Time stamp o marca de tiempo: representan un punto en el tiempo. Por ejemplo, fecha
y hora.

✔ Período: representan un intervalo de tiempo. Por ejemplo, los minutos transcurridos


desde que comenzó la clase hasta ahora.

✔ Duración: representa una duración medida en tiempo, pero independientemente del


momento en que sucede. Por ejemplo, 15 minutos.
Series de Tiempo
… datos, ligados al tiempo.
Por su parte, Pandas provee un objeto índice para cada uno de esos objetos temporales:

Tipo de dato Objeto en Python Índice en Pandas

Time stamp Timestamp DateTimeIndex

Período Period PeriodIndex

Duración Timedelta TimeDeltaIndex


Ejemplo en vivo
Comprendamos el uso y manipulación de objetos tipo
serie de Tiempo en Python
Operando objetos de
tiempo
Operando objetos de tiempo
Veamos algunos ejemplos...
✔ Convertir String a Timestamp:

fecha = pd.to_datetime('03/01/2020',dayfirst=True)
fecha
👉

✔ Días desde el 3 de enero al del 2020 al 10 de enero del 2020:

fin = pd.to_datetime('10/01/2020',dayfirst=True)
fechas_1 = pd.date_range(start=fecha, end=fin)
Operando objetos de tiempo
Veamos algunos ejemplos...

✔ Ocho fechas desde el 3 de enero de 2020, con períodos:

fechas_2 = pd.date_range(start=fecha, periods=8)


fechas_2

✔ La frecuencia por defecto es de un día. Por lo tanto, ocho períodos representan ocho días.

👉
Operando objetos de tiempo
Veamos algunos ejemplos...

✔ Cambiando la frecuencia a meses en lugar de días:

fechas_3 = pd.date_range(start= fecha, periods= 8, freq='M')


fechas_3

✔ Notar que como día se toma el último de cada período


Operando objetos de tiempo
Veamos algunos ejemplos...

✔ Ocho meses consecutivos, a partir del mes de inicio:

mes_inicio = fecha.strftime('%Y-%m') 👉
mes_inicio

fechas_4 = pd.period_range(start=mes_inicio, periods=8, freq='M')


fechas_4

👉
Operando objetos de tiempo
Veamos algunos ejemplos...

✔ ¿Cuánto tiempo pasó desde el primer periodo al último?

cuanto_tiempo = fechas_3[7] - fechas_3[0]


cuanto_tiempo
👉

¡Al utilizar operadores normales sobre objetos de tiempo, obtenemos como resultado objetos de tiempo!
Operando objetos de tiempo
Veamos algunos ejemplos...

✔ ¿Cuántos meses pasaron desde el primer periodo al último?


👉
cuanto_tiempo_meses = fechas_3[7].to_period('M') - fechas_3[0].to_period('M')
cuanto_tiempo_meses

👉
Conversión a
DateTimeIndex
Conversión a DateTimeIndex
Veamos algunos ejemplos...
Ahora que sabemos manipular objetos de tiempo, retomemos el Data Frame de
presidentes. Seleccionamos las fechas de asunción

fechas_presidentes_orig = Presidentes_archivo['start']
fechas_presidentes_orig
👉

type(fechas_presidentes_orig) 👉 ❌
Conversión a DateTimeIndex
Veamos algunos ejemplos...

Transformemos las fechas en formato string a índices de tiempo

fechas_presidentes = pd.DatetimeIndex(fechas_presidentes_orig)
fechas_presidentes

👉
Conversión a DateTimeIndex
Veamos algunos ejemplos...

Ahora que tenemos las fechas en el tipo de dato correcto, construyamos la Serie

Serie_presidentes = pd.Series(Presidentes_nombres.values,index=fechas_presidentes)
Serie_presidentes

¡Listo!
Ya podemos ejecutar operaciones con objetos de
tiempo.
Manipulación de
Dataframes con Pandas
Duración: 15 minutos
ACTIVIDAD EN CLASE

Manipulación de Trabajaremos de forma individual.

Dataframes con Tiempo estimado: 15 minutos.

Pandas
✔ Ir al siguiente repositorio y descargar el siguiente archivo (BTCUSD_1hr.csv): Bitcoin

✔ Cargar el archivo usando la función pd.read_csv()

✔ Utilizar el método .describe() para obtener un resumen numérico rápido de las variables

✔ Obtenga la cantidad de nulos por medio del atributo .isna()

✔ Extraer el mes de la columna Date y utilizar el método .groupby() para calcular la media mensual para cada variable

✔ Hacer un gráfico de los precios de Bitcoin y analizar tendencias. Que medida se les ocurre pueda establecer la volatilidad cada día?
CLASE N°6

Glosario
Manejo de datos nulos: conjunto de técnicas que nos permiten manipular y trabajar con los datos nulos (e.g
Imputación, eliminación, reemplazo por un valor representativo como la mediana)

Método Describe: método incorporado en los dataframes para obtener un resumen numérico básico de las
variables numéricas presentes (conteo, min, max, media, cuartiles, desviación estándar)

Método Groupby: método incorporado en los dataframes que permite agrupar los datos por agluna categoría
específica y aplicar alguna función de agregación

Operaciones con strings: son todas aquellas herramientas que nos permiten manipular datos con formato str,
las librerías más comunes para esto son re y los métodos incorporados de str.
CLASE N°6

Glosario
Serie de tiempo: cualquier variable aleatoria indexada por el tiempo que se caracterizan por tener métodos
especiales de análisis (e.g Modelos ARIMA, SARIMAX)

Timestamp: tipo de dato ligado a series de tiempo, bastante común y se reconoce con formato
DateTimeIndex en Python

Period: tipo de dato ligado a series de tiempo que se reconoce con formato PeriodIndex en Python

TimeDelta: tipo de dato ligado a series de tiempo que se reconoce con formato TimeDeltaIndex en Python
¿Preguntas?
Resumen
de la clase hoy
✓ Operaciones con datos en Pandas
✓ Agregaciones con Pandas
✓ Manejo de datos ausentes
✓ Operaciones con Strings
✓ Introducción a Series de Tiempo
Opina y valora
esta clase
Muchas gracias.

También podría gustarte