Limpieza y estandarización de columnas

Limpieza de datos en Java

Dennis Lee

Software Engineer

Conjunto de datos de ventas de libros

Libros Autores Idioma First_Published Sales_in_Millions Average_Price
A Tale of Two Cities Charles Dickens English 1859 200.0 12.99
The Little Prince (Le Petit Prince) Antoine de Saint-Exupéry French 1943 200.0 15.50
Harry Potter and the Philosopher's Stone J. K. Rowling English 1997 120.0 19.99
And Then There Were None Agatha Christie English 1939 100.0 14.95
Limpieza de datos en Java

Examinar tipos de datos

import tech.tablesaw.api.Table;
import tech.tablesaw.api.StringColumn;
import tech.tablesaw.api.DoubleColumn;
Table books = Table.read().csv("bestsellers.csv");

for (String colName : books.columnNames()) {

// Imprimir nombre de columna y su tipo System.out.println(colName + ": " + books.column(colName).type()); }
Limpieza de datos en Java

Tipos de datos: resultados

Books: STRING
Authors: STRING
Language: STRING
First_Published: INTEGER
Sales_in_Millions: INTEGER
Average_Price: DOUBLE
Limpieza de datos en Java

Convertir formatos numéricos

// Convertir IntColumn a DoubleColumn porque Tablesaw lo inferió como INTEGER
DoubleColumn sales = books.intColumn("Sales_in_Millions")
      .asDoubleColumn();

System.out.println("Tipo de datos de la columna sales tras la conversión: " + sales.type());
Data type of sales column after conversion: DOUBLE
// Es posible convertir un DoubleColumn a un IntColumn
IntColumn salesAsInt = sales.asIntColumn();
Limpieza de datos en Java

Multiplicar columnas

DoubleColumn averagePrice = books.doubleColumn("Average_Price");

// Calcular ingresos totales multiplicando dos columnas
DoubleColumn totalRevenue = sales.multiply(averagePrice)

.setName("Total_Revenue_Millions");
books.addColumns(totalRevenue); System.out.println("\nMultiplicar dos columnas: Ventas × Precio = Ingresos"); System.out.println(books.selectColumns("Books", "Sales_in_Millions", "Average_Price", "Total_Revenue_Millions") .first(4).print());
Limpieza de datos en Java

Multiplicar columnas: resultados

Multiplicar dos columnas: Ventas * Precio = Ingresos

| Libros                              | Ventas_en_ | Precio    | Ingresos_totales_ |
|                                     | millones   | promedio  | millones          |
|-------------------------------------|------------|-----------|-------------------|
| A Tale of Two Cities                | 200        | 12.99     | 2598              |
| The Little Prince (Le Petit Prince) | 200        | 15.50     | 3100              |
| Harry Potter and                    | 120        | 19.99     | 2398.80           |
|   the Philosopher's Stone           |            |           |                   |
| And Then There Were None            | 100        | 14.95     | 1495              |
Limpieza de datos en Java

Regex para paréntesis

  • El patrón \\(.*\\) coincide con paréntesis
  • Ejemplos: "(Organic)", "(2 pack)", "(Large)"
  • Resultado: "Apple (Organic)" pasa a "Apple"
\\(     // Abrir paréntesis (escapado con \)
.*      // Cualquier carácter (.) cero o más veces (*)
\\)     // Cerrar paréntesis (escapado con \)
Limpieza de datos en Java

Manejo de caracteres especiales

// Quitar traducciones entre paréntesis de los títulos
StringColumn titlesNoParentheses = titles
        // Para cada título, quitar paréntesis y espacios alrededor
        .map(t -> t.replaceAll("\\(.*\\)", "").trim())
        // Asignar nombre a la nueva columna
        .setName("Titles without parentheses");

System.out.println("Original: " + titles.get(1)); // Primer elemento de la columna
System.out.println("Limpio: " + titlesNoParentheses.get(1));
Original: The Little Prince (Le Petit Prince)
Limpio: The Little Prince
Limpieza de datos en Java

Combinar operaciones de texto

// Combinar quitar paréntesis y convertir a minúsculas
StringColumn titlesCombinedCleaning =
        titles.map(t -> t.replaceAll("\\(.*\\)", "") // Quitar paréntesis

.trim() // Quitar espacios alrededor
.toLowerCase()) // Convertir a minúsculas .setName("Clean_Titles_Combined"); // Nombre de la columna System.out.println("Título original: " + titles.get(1)); System.out.println("Título tras limpieza: " + titlesCombinedCleaning.get(1));
Título original: The Little Prince (Le Petit Prince)
Título tras limpieza: the little prince
Limpieza de datos en Java

Todo junto

books.column(colName).type(); // Obtener el tipo de columna
books.intColumn("Sales_in_Millions").asDoubleColumn(); // Convertir tipo
DoubleColumn totalRevenue = sales.multiply(averagePrice) // Multiplicar columnas
    .setName("Total_Revenue_Millions"); // Nombrar la nueva columna
titles.map(String::toLowerCase) // Convertir a minúsculas
    .setName("Lowercase_Titles"); // Nombrar la nueva columna
titles.map(t -> t.replaceAll("\\(.*\\)", "").trim()) // Quitar paréntesis
    .setName("Titles without parentheses"); // Nombrar la nueva columna
Limpieza de datos en Java

¡Vamos a practicar!

Limpieza de datos en Java

Preparing Video For Download...