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#

  1. Abrir un notebook nuevo y ponerle de nombre Practico2_{mi_apellido}.ipynb.

  2. Copiar el código de creación del dataframe df_ejercicio2 y realizar las siguientes consignas:

    1. Qué puede observar de los datos? qué características tienen?

    2. Listar los tipos de datos de cada columna.

    3. Qué tipos de datos nulos existen? explicar sus diferencias.

    4. Verificar los valores nulos existentes. Analizar cada una de las columnas.

    5. 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 a boolean?

    6. Mostrar un ejemplo del funcionamiento del parámetro value (de fillna()) para la columna cliente reemplazando por el valor ‘NoName’. Recomendación: hacer una copia del dataframe para no sobreescribir el dataframe df_ejercicio2. Esto se hace con copy()

    7. Investigue y explique los métodos bfill y ffill y realice los siguientes ejercicios explicando el resultado:

      1. Para la columna producto aplique bfill.

      2. Para la columna precio aplique ffill con el parámetro limit = 1.

      3. Aplique ffill con axis = 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]    
})
  1. Copiar el código necesario para crear el dataframe df_redundante del instructivo de 2.2. Tratamiento de valores duplicados

    1. Agregar una o mas tuplas que muestren inconsistencias en el dataframe y explicarlas. Recomendación: para agregar mas de una tupla usar df.concat() explicado en sección 1.4.

    2. Para el método .duplicated():

      1. Mostrar con ejemplos el funcionamiento del parámetro subset.

      2. Mostrar con ejemplos el funcionamiento del parámetro keep, con sus opciones 'first', 'last' y False.

    3. Para el método .drop_duplicates() (Recomendación: hacer una copia del dataframe para no sobreescribir el dataframe. Esto se hace con copy()):

      1. Mostrar con ejemplos el funcionamiento del parámetro subset e inplace = True .

      2. Mostrar con ejemplos el funcionamiento del parámetro keep, con sus opciones 'first', 'last'. y False, creando un `dataframe que solo posea el nombre, apellido y ciudad.

      3. Mostar con ejemplos el funcionamiento del parámetro ignore_index.

  2. Copiar este código para crear el df_personas:

    1. Realizar un diagrama de dispersión (scatter) para graficar las edades (eje y = edades; eje x = rango de edades). Qué conclusiones puede obtener?

    2. Identificar los cuartiles de las edades. Qué significan los valores obtenidos?

    3. Identificar el IQR, limites mínimos y máximos de las edades. Qué significan los valores obtenidos?

    4. Realizar un diagrama de caja (boxplot) con las edades. Qué conclusiones puede obtener?

    5. 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.

    6. Crear un dataframe que posea los valores atípicos encontrados y reemplazarlos por la media. Volver a graficar el boxplot.

    7. 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  
    ]
})
  1. Dado el siguiente dataframe llamado df_ventas_inconsistente al final de este ejercicio, realizar:

    1. Describa para cada columna las reglas que deben cumplir los datos

    2. Detectar todas las inconsistenias para cada una acorde a las reglas definidas

    3. 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#

  1. Explicar las diferencias entre los métodos concat() y merge() de Pandas.

  2. Crear un nuevo dataframe, llamado df_ventas1 que lea los datos del archivo desde el archivo ventas1.csv que se puede descargar desde aquí. El separador de los datos es un ‘|’. Tip: Se puede abrir el csv desde Pandas directamente con la url https://cursoepa.fi.uncoma.edu.ar/archivos_datasets/ventas1.csv

  3. Crear un nuevo dataframe, llamado df_ventas2 que lea los datos del archivo ventas2.csv que se puede descargar desde aquí. El separador de los datos es un ‘|’.

  4. Concatenar los dos dataframes previos con los siguiente parámetros y explicar los resultados:

    1. con axis = 0.

    2. con axis = 1.

  5. Dividir el dataframe df_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.

    1. Concatenar (concat()) con join = inner. Qué siginifica el join cuando concatenamos?

  6. Eliminar los productos duplicados de df_productos. Se pueden primero identificar con .value_counts().

  7. Agregar tres productos nuevos a df_productos:

    1. (“P026”,”Calza biker”,23500.34), (“P027”,”Boina”,3300.5), (“P028”,”Medias largas”,1500)

  8. Combinar (merge()) los dataframes df_vendido y df_productos por idProducto según lo siguiente:

    1. con how = inner. Al dataframeresultante ponerle el nombre df_completo.

    2. con how = left

    3. con how = rigth

    4. Cambiar el nombre a la columna idProducto por idProductoVendido (método rename()) en df_vendido y combinar con how = outer y on.

  9. Considerando el COUNT() y el COUNT(DISTINCT ...) del lenguaje SQL, busque sus correspondencias en Pandas para cada caso. Qué sucede cuando hay nulos?

  10. En base a df_completo hacer:

    1. Listar la cantidad de ventas de cada producto. Por ejemplo, camisetas cantidad 15. Se debe listar idProducto, nombreProducto, y la cantidadVendida

    2. Listar la cantidad de facturas realizadas en el año 2024. Tip: Para acceder a los años deben hacer df_completo['fechaVenta'].dt.year donde dt permite acceder a cada elemento de la fecha y aplicarle la función.

    3. Crear una nueva columna a df_completo, llamada total que calcule el precio unitario del producto por la cantidad y coloque el total gastado.

    4. Listar el total recaudado por mes y año.

      1. Cambiar el nombre de la columna resultante del total a totalGastadoPorMes.

ParteIII: Para los VALIENTES!#

  1. En base a los archivos csv de girasol y maiz, realizar a cada uno de ellos:

    1. Importar los archivos a dataframes

    2. Convertir 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.

    3. 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.

    4. Analice los valores atípicos y grafique según IQR e histogramas.

    5. Unir ambos dataframes haciendo join en las columnas que considere necesarias.

    6. Listar ordenado el rendimiento total (en kg/hectárea) por provincia de cada cultivo.

    7. Listar ordenado por año la producción total en toneladas.

    8. Obtener el año con peor producción.

    9. Obtener el año con mejor producción.

  2. Investigar y dar ejemplos del uso de los métodos pivot() y pivot_table(). La documentación puede verse aca.

  3. Realizar los siguientes gráficos para cada cultivo:

    1. 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.

    2. 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.

    3. 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.