Стандартизация категорий

Очистка данных на Java

Dennis Lee

Software Engineer

Зачем стандартизировать категории?

  • Несогласованные названия категорий: данные нельзя сгруппировать
  • Разные варианты написания «Fruits & Vegetables»
  • Решение: стандартизировать категории

 

 

Исходная категория Количество
Fruits & Vegetables 10
fruits & veg 20
Fruits&Veg 30
Очистка данных на Java

Шаги стандартизации

  1. Определите стандартные категории
    FRUITS_AND_VEGETABLES
    DAIRY
    UNCATEGORIZED
    
  2. Сопоставьте варианты со стандартными категориями
    Fruits & Vegetables -> FRUITS_AND_VEGETABLES
    fruits & veg -> FRUITS_AND_VEGETABLES
    Fruits&Veg -> FRUITS_AND_VEGETABLES
    
  3. Выполните анализ — например, подсчитайте категории, такие как FRUITS_AND_VEGETABLES
Очистка данных на Java

Определение стандартных категорий с помощью enum

// Define standard categories
public enum ProductCategory {
    FRUITS_AND_VEGETABLES,
    DAIRY,
    UNCATEGORIZED;
}

// Example category
System.out.println(ProductCategory.FRUITS_AND_VEGETABLES);
FRUITS_AND_VEGETABLES
Очистка данных на Java

Сопоставление исходных категорий со стандартными

import java.util.HashMap;
import java.util.Map;
// Define map of raw category variations to standard categories
Map<String, ProductCategory> rawCategories = new HashMap<>();
// Variation 1: Fruits & Vegetables
rawCategories.put("Fruits & Vegetables", ProductCategory.FRUITS_AND_VEGETABLES);
// Variation 2: fruits & veg
rawCategories.put("fruits & veg", ProductCategory.FRUITS_AND_VEGETABLES);
// Variation 3: Fruits&Veg
rawCategories.put("Fruits&Veg", ProductCategory.FRUITS_AND_VEGETABLES);
Очистка данных на Java

Сопоставление вариантов со стандартными категориями: результаты

System.out.println(rawCategories.get("fruits & veg")); // Get standard category
FRUITS_AND_VEGETABLES

 

rawCategories: только для визуализации; столбцы представляют пары ключ-значение в Map

Исходная категория Стандартная категория
Fruits & Vegetables FRUITS_AND_VEGETABLES
fruits & veg FRUITS_AND_VEGETABLES
Fruits&Veg FRUITS_AND_VEGETABLES
Очистка данных на Java

Обработка неизвестных категорий

String unknownCategory = "Mystery Category";

// Return UNCATEGORIZED if category not found in rawCategories
ProductCategory category = rawCategories.getOrDefault(
        unknownCategory, ProductCategory.UNCATEGORIZED);

System.out.println("Unknown: " + category);
Mystery Category: UNCATEGORIZED
Исходная категория Стандартная категория
Mystery Category UNCATEGORIZED
Очистка данных на Java

Создание неизменяемого сопоставления

import java.util.Collections;
Map<String, ProductCategory> categories =
        Collections.unmodifiableMap(rawCategories); // Create immutable view

try { categories.put("new", ProductCategory.DAIRY); // Will throw exception } catch (UnsupportedOperationException e) { System.out.println("Cannot modify immutable map"); }
Cannot modify immutable map
Очистка данных на Java

Извлечение категорий из набора данных

// Extract category and quantity from our grocery inventory dataset
Map<String, Integer> rawData = 
        Map.of("Fruits & Vegetables", 10, 
               "fruits & veg", 20,
               "Fruits&Veg", 30);

rawData: сопоставление, извлечённое из набора данных о складских запасах продуктов

Исходная категория Количество
Fruits & Vegetables 10
fruits & veg 20
Fruits&Veg 30
Очистка данных на Java

Поиск стандартной категории

Map<ProductCategory, Integer> stockByCategory =
        new EnumMap<ProductCategory, Integer>(ProductCategory.class);

rawData.forEach((raw, quantity) -> // Lookup standard category in categories and sum quantities stockByCategory.merge(categories.get(raw), quantity, Integer::sum));

categories: сопоставление для поиска стандартной категории

Исходная категория Стандартная категория
Fruits & Vegetables FRUITS_AND_VEGETABLES
fruits & veg FRUITS_AND_VEGETABLES
Fruits&Veg FRUITS_AND_VEGETABLES
Очистка данных на Java

Суммирование по стандартной категории

System.out.println(stockByCategory);
{FRUITS_AND_VEGETABLES=60}

 

stockByCategory: сопоставление после поиска rawData в categoryMap

Стандартная категория Количество
FRUITS_AND_VEGETABLES 60
Очистка данных на Java

Группировка по стандартной категории: итоги

1) Извлеките карту rawData с категориями и количествами из набора данных (фрагмент ниже)

Исходная категория Количество
Fruits & Vegetables 10

2) Создайте categories для поиска стандартных категорий (фрагмент ниже)

Исходная категория Стандартная категория
Fruits & Vegetables FRUITS_AND_VEGETABLES

3) Вычислите stockByCategory, выполнив поиск rawData в categories (фрагмент ниже)

Стандартная категория Количество
FRUITS_AND_VEGETABLES 60
Очистка данных на Java

Всё вместе

Основные импорты

import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
  • Создайте enum для стандартных категорий
  • Постройте сопоставление категорий с помощью HashMap
  • Сделайте сопоставление неизменяемым с помощью Collections.unmodifiableMap
  • Обрабатывайте неизвестные категории с помощью .getOrDefault()
  • Группируйте по стандартным категориям с помощью .merge()
Очистка данных на Java

Давайте потренируемся!

Очистка данных на Java

Preparing Video For Download...