PRACTICO 2#
Preparación de Datos
El Practico 2 debe ser enviado por PEDCO de la asignatura, en la sección correspondiente. Curso EPA - PEDCO
ParteI: Limpieza de Datos#
Abrir un notebook nuevo y ponerle de nombre
Practico2_{mi_apellido}.ipynb.Copiar el código de creación del
dataframedf_ejercicio2y realizar las siguientes consignas:Qué puede observar de los datos? qué características tienen?
Listar los tipos de datos de cada columna.
Qué tipos de datos nulos existen? explicar sus diferencias.
Verificar los valores nulos existentes. Analizar cada una de las columnas.
Convertir cada una de las columnas al tipo de dato correcto. Como hay valores nulos, convertir a los tipos de Pandas. Qué pasó al convertir la columna pagoCash a
bool? y aboolean?Mostrar un ejemplo del funcionamiento del parámetro
value(defillna()) para la columna cliente reemplazando por el valor ‘NoName’. Recomendación: hacer una copia deldataframepara no sobreescribir eldataframe df_ejercicio2. Esto se hace concopy()Investigue y explique los métodos
bfillyffilly realice los siguientes ejercicios explicando el resultado:Para la columna producto aplique
bfill.Para la columna precio aplique
ffillcon el parámetrolimit = 1.Aplique
ffillconaxis = 1. Cómo son los tipos de datos de cada columna ahora?
import pandas as pd
import numpy as np
df_ejercicio2 = pd.DataFrame({
"id": ["1", "2", np.nan, "4", None, pd.NA, 6, 7],
"precio": ["100.5", None, "300.1", "400", np.nan, pd.NA, 300, 456.9],
"fecha": ["2024-01-01", "no válida", pd.NaT, "2024-01-04", None, "2025-03-15", "2024-21-01", "2025-10-05"],
"cliente": ["Ana", "Luis", "None", "Sofía", pd.NA, "Juan", None, "Lucila"],
"producto": ["Remera", None, "Campera", pd.NA, "Pantalon", "Camisa", np.nan, "Medias"],
"pagoCash": ["True", True, None, False, np.nan, pd.NA, 1, True]
})
Copiar el código necesario para crear el
dataframedf_redundantedel instructivo de 2.2. Tratamiento de valores duplicadosAgregar una o mas tuplas que muestren inconsistencias en el
dataframey explicarlas. Recomendación: para agregar mas de una tupla usardf.concat()explicado en sección 1.4.Para el método
.duplicated():Mostrar con ejemplos el funcionamiento del parámetro
subset.Mostrar con ejemplos el funcionamiento del parámetro
keep, con sus opciones'first','last'yFalse.
Para el método
.drop_duplicates()(Recomendación: hacer una copia deldataframepara no sobreescribir eldataframe. Esto se hace concopy()):Mostrar con ejemplos el funcionamiento del parámetro
subseteinplace = True.Mostrar con ejemplos el funcionamiento del parámetro
keep, con sus opciones'first','last'. yFalse, creando un `dataframe que solo posea el nombre, apellido y ciudad.Mostar con ejemplos el funcionamiento del parámetro
ignore_index.
Copiar este código para crear el
df_personas:Realizar un diagrama de dispersión (scatter) para graficar las edades (eje y = edades; eje x = rango de edades). Qué conclusiones puede obtener?
Identificar los cuartiles de las edades. Qué significan los valores obtenidos?
Identificar el IQR, limites mínimos y máximos de las edades. Qué significan los valores obtenidos?
Realizar un diagrama de caja (boxplot) con las edades. Qué conclusiones puede obtener?
Realizar los cáculos de los bordes de cada bins previos a graficar histogramas con las edades. Hacerlo con 2 bins, y con 5 bins. Luego graficar.
Crear un
dataframeque posea los valores atípicos encontrados y reemplazarlos por la media. Volver a graficar el boxplot.Guardar como imágenes todos los gráficos previos.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# dataFrame con edades normales y algunas atípicas
df_personas = pd.DataFrame({
'Nombre': [
'Ana', 'Luis', 'María', 'Pedro', 'Carla', 'Jorge', 'Lucía', 'Raúl', 'Marta', 'Sofía',
'Diego', 'Laura', 'Andrés', 'Valeria', 'Pablo', 'Elena', 'Tomás', 'Clara', 'Iván', 'Rosa'
],
'Edad': [
25, 30, 28, 150, 27, -5, 29, 200, 26, 32,
31, 33, 40, 120, 22, 19, 18, 300, 24, 28
]
})
Dado el siguiente
dataframellamado df_ventas_inconsistente al final de este ejercicio, realizar:Describa para cada columna las reglas que deben cumplir los datos
Detectar todas las inconsistenias para cada una acorde a las reglas definidas
Tratar cada una de inconsistenias con la forma que considere mejor se adapte al ejemplo.
import pandas as pd
df_ventas_inconsistente = pd.DataFrame({
'producto': ['Laptop', 'Celular', 'TV', 'Monitor', 'Tableta', 'Celular', 'Smartphone', 'TV'],
'precio_unitario': [1200.00, -500.00, 0, 350.99, 220.50, 799.99, 999.99, None],
'cantidad': [1, 2, 'tres', 0, 5, 1, -1, 2],
'fecha_venta': [
'2025-08-28',
'2026-01-01',
'2023-12-10',
'2025-08-29',
'2025-09-01',
'2022-03-15',
'2025-08-30',
'2024-11-11'
],
'fecha_lanzamiento': [
'2020-01-01',
'2026-12-01',
'2020-05-10',
'2025-09-01',
'2024-09-01',
'2022-04-01',
'2020-01-01',
'2025-12-01'
],
'vendedor': ['Ana', 'Luis', '', 'Pedro', 'Sofía', 'Juan', 'Luis', 'N/A'],
'moneda': ['USD', 'usd', 'dólares', 'USD', 'USD', 'EUR', 'USD', 'U$S']
})
ParteII: Integración y agregación#
Explicar las diferencias entre los métodos
concat()ymerge()de Pandas.Crear un nuevo
dataframe, llamado df_ventas1 que lea los datos del archivo desde el archivoventas1.csvque se puede descargar desde aquí. El separador de los datos es un ‘|’. Tip: Se puede abrir elcsvdesde Pandas directamente con la url https://cursoepa.fi.uncoma.edu.ar/archivos_datasets/ventas1.csvCrear un nuevo
dataframe, llamado df_ventas2 que lea los datos del archivoventas2.csvque se puede descargar desde aquí. El separador de los datos es un ‘|’.Concatenar los dos
dataframesprevios con los siguiente parámetros y explicar los resultados:con
axis = 0.con
axis = 1.
Dividir el
dataframedf_ventas2 en dos: uno llamado df_productos que posea los atributos idProducto, nombreProducto y precioUnitario, y otro, llamado df_vendido los atributos numeroFactura, fechaVenta, idProducto, cantidadComprada y pagoCash.Concatenar (
concat()) conjoin = inner. Qué siginifica el join cuando concatenamos?
Eliminar los productos duplicados de df_productos. Se pueden primero identificar con
.value_counts().Agregar tres productos nuevos a df_productos:
(“P026”,”Calza biker”,23500.34), (“P027”,”Boina”,3300.5), (“P028”,”Medias largas”,1500)
Combinar (
merge()) losdataframesdf_vendido y df_productos por idProducto según lo siguiente:con
how = inner. Aldataframeresultante ponerle el nombre df_completo.con
how = leftcon
how = rigthCambiar el nombre a la columna idProducto por idProductoVendido (método
rename()) en df_vendido y combinar conhow = outeryon.
Considerando el
COUNT()y elCOUNT(DISTINCT ...)del lenguajeSQL, busque sus correspondencias en Pandas para cada caso. Qué sucede cuando hay nulos?En base a df_completo hacer:
Listar la cantidad de ventas de cada producto. Por ejemplo, camisetas cantidad 15. Se debe listar idProducto, nombreProducto, y la cantidadVendida
Listar la cantidad de facturas realizadas en el año 2024. Tip: Para acceder a los años deben hacer
df_completo['fechaVenta'].dt.yeardondedtpermite acceder a cada elemento de la fecha y aplicarle la función.Crear una nueva columna a df_completo, llamada total que calcule el precio unitario del producto por la cantidad y coloque el total gastado.
Listar el total recaudado por mes y año.
Cambiar el nombre de la columna resultante del total a totalGastadoPorMes.
ParteIII: Para los VALIENTES!#
En base a los archivos
csvde girasol y maiz, realizar a cada uno de ellos:Importar los archivos a
dataframesConvertir cada columna al tipo de dato corresto cuando sea posible. Note que para el archivo de girasol hay una columna mas, llamada rendim_Xxkgxha que es una copia de la columna rendimiento_kgxha, pero con errores.
Limpiar los datos de cada uno en cuanto a nulos y duplicados. A su vez, aplique políticas diferentes para el tratamiento de los errores.
Analice los valores atípicos y grafique según IQR e histogramas.
Unir ambos
dataframeshaciendo join en las columnas que considere necesarias.Listar ordenado el rendimiento total (en kg/hectárea) por provincia de cada cultivo.
Listar ordenado por año la producción total en toneladas.
Obtener el año con peor producción.
Obtener el año con mejor producción.
Investigar y dar ejemplos del uso de los métodos
pivot()ypivot_table(). La documentación puede verse aca.Realizar los siguientes gráficos para cada cultivo:
Realizar un gráfico de barras que posea la cantidad total de producción en toneladas de cada provincia, de los años 2000 a 2015.
Realizar un gráfico de líneas que posea la cantidad de superficie sembrada en hectáreas en Santa Fé durante todos los años disponibles.
Realizar un gráfico de barras que muestre las hectáreas sembradas vs las cosechadas en la provincia de Buenos Aires desde el año 2010. El gráfico debe mostrar dos barras por cada año.