類別標準化

使用 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」:將 rawDatacategoryMap 查找後的對應關係

標準類別 數量
FRUITS_AND_VEGETABLES 60
使用 Java 進行資料清理

依標準類別分組:總結

1)自資料集中擷取 rawData(下方為節錄)

原始類別 數量
Fruits & Vegetables 10

2)建立 categories 以查找標準類別(下方為節錄)

原始類別 標準類別
Fruits & Vegetables FRUITS_AND_VEGETABLES

3)查找 rawData 並計算 stockByCategory(下方為節錄)

標準類別 數量
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...