From 8d0351622bdc221b6c4bc0172de7a6eab1a4365a Mon Sep 17 00:00:00 2001 From: arthur Date: Thu, 21 Aug 2025 15:29:10 +0700 Subject: [PATCH 1/2] add visuallize tab --- data_comparator.py | 165 ++++++++++++++++++++++++++++++++++++++++++- templates/index.html | 83 ++++++++++++++++++++++ web_gui.py | 87 +++++++++++++++++++++++ 3 files changed, 332 insertions(+), 3 deletions(-) diff --git a/data_comparator.py b/data_comparator.py index 0c78606..b5005c2 100644 --- a/data_comparator.py +++ b/data_comparator.py @@ -3,7 +3,25 @@ import numpy as np from typing import Dict, List, Tuple, Any from dataclasses import dataclass -@dataclass +def normalize_episode(episode: str) -> str: + """Normalize episode numbers to handle cases like '54' vs '54.0'""" + if not episode or episode.strip() == '': + return episode + + try: + # Convert to float first to handle both int and float formats + episode_float = float(episode.strip()) + + # If it's a whole number (like 54.0), convert to int format + if episode_float.is_integer(): + return str(int(episode_float)) + else: + # Keep decimal format for non-whole numbers + return str(episode_float) + except (ValueError, TypeError): + # If conversion fails, return original episode string + return episode.strip() + class ComparisonItem: """Represents a single item for comparison""" title: str @@ -11,6 +29,12 @@ class ComparisonItem: source_sheet: str row_index: int + def __init__(self, title: str, episode: str, source_sheet: str, row_index: int): + self.title = title + self.episode = normalize_episode(episode) # Normalize episode on creation + self.source_sheet = source_sheet + self.row_index = row_index + def __hash__(self): return hash((self.title, self.episode)) @@ -340,7 +364,7 @@ class KSTCoordiComparator: return mismatch_details - def get_comparison_summary(self, sheet_filter: str = None) -> Dict[str, Any]: + def get_comparison_summary(self, sheet_filter: str | None = None) -> Dict[str, Any]: """Get a comprehensive summary of the comparison for a specific sheet only""" # Get sheet names for filtering options sheet_names = list(self.data.keys()) if self.data else [] @@ -467,9 +491,144 @@ class KSTCoordiComparator: return grouped + def generate_visualize_data(self, sheet_filter: str | None = None) -> List[Dict[str, Any]]: + """Generate data structure for Excel-like visualization""" + # Get comparison data for the specified sheet + summary = self.get_comparison_summary(sheet_filter) + mismatch_details = summary['mismatch_details'] + + visualize_rows = [] + + # Helper function to create a row + def create_row(coordi_title="", coordi_chapter="", kst_title="", kst_chapter="", + row_type="matched", reason="", title_for_sort=""): + return { + 'coordi_title': coordi_title, + 'coordi_chapter': coordi_chapter, + 'kst_title': kst_title, + 'kst_chapter': kst_chapter, + 'row_type': row_type, + 'reason': reason, + 'title_for_sort': title_for_sort or coordi_title or kst_title, + 'priority': 1 if row_type != 'matched' else 2 # Mismatches first + } + + # 1. Handle Coordi-only items + for item in mismatch_details['coordi_only']: + visualize_rows.append(create_row( + coordi_title=item['title'], + coordi_chapter=item['episode'], + row_type='coordi_only', + reason='Only in Coordi' + )) + + # 2. Handle KST-only items + for item in mismatch_details['kst_only']: + visualize_rows.append(create_row( + kst_title=item['title'], + kst_chapter=item['episode'], + row_type='kst_only', + reason='Only in KST' + )) + + # 3. Handle Mixed duplicates (exists in both but duplicated on one side) + mixed_items = {} # Group by title+episode + for item in mismatch_details['mixed_duplicates']: + key = f"{item['title']}_{item['episode']}" + if key not in mixed_items: + mixed_items[key] = { + 'title': item['title'], + 'episode': item['episode'], + 'has_kst_duplicate': False, + 'has_coordi_duplicate': False + } + + if item['duplicate_side'] == 'KST': + mixed_items[key]['has_kst_duplicate'] = True + elif item['duplicate_side'] == 'COORDI': + mixed_items[key]['has_coordi_duplicate'] = True + + for key, item in mixed_items.items(): + # First row: show it exists in both + visualize_rows.append(create_row( + coordi_title=item['title'], + coordi_chapter=item['episode'], + kst_title=item['title'], + kst_chapter=item['episode'], + row_type='mixed_duplicate', + reason='Mixed duplicate' + )) + + # Additional rows for duplicates + if item['has_kst_duplicate']: + visualize_rows.append(create_row( + kst_title=item['title'], + kst_chapter=item['episode'], + row_type='mixed_duplicate', + reason='Duplicate in KST', + title_for_sort=item['title'] + )) + + if item['has_coordi_duplicate']: + visualize_rows.append(create_row( + coordi_title=item['title'], + coordi_chapter=item['episode'], + row_type='mixed_duplicate', + reason='Duplicate in Coordi', + title_for_sort=item['title'] + )) + + # 4. Handle Pure duplicates + for item in mismatch_details['kst_duplicates']: + visualize_rows.append(create_row( + kst_title=item['title'], + kst_chapter=item['episode'], + row_type='pure_duplicate', + reason='Duplicate in KST' + )) + + for item in mismatch_details['coordi_duplicates']: + visualize_rows.append(create_row( + coordi_title=item['title'], + coordi_chapter=item['episode'], + row_type='pure_duplicate', + reason='Duplicate in Coordi' + )) + + # 5. Handle Matched items (perfect matches) + matched_by_title = summary['grouped_by_title']['matched_by_title'] + for title, items in matched_by_title.items(): + for item in items: + visualize_rows.append(create_row( + coordi_title=item['title'], + coordi_chapter=item['episode'], + kst_title=item['title'], + kst_chapter=item['episode'], + row_type='matched', + reason='Perfect match' + )) + + # Sort: Mismatches first (priority 1), then matches (priority 2), then by Korean title + chapter + def sort_key(x): + # Extract episode number for proper numeric sorting + coordi_episode = x.get('coordi_chapter', '') or '' + kst_episode = x.get('kst_chapter', '') or '' + episode = coordi_episode or kst_episode + + # Try to convert episode to number for proper sorting, fallback to string + try: + episode_num = float(episode) if episode else 0 + except (ValueError, TypeError): + episode_num = 0 + + return (x['priority'], x['title_for_sort'], episode_num) + + visualize_rows.sort(key=sort_key) + + return visualize_rows - def print_comparison_summary(self, sheet_filter: str = None): + def print_comparison_summary(self, sheet_filter: str | None = None): """Print a formatted summary of the comparison for a specific sheet""" summary = self.get_comparison_summary(sheet_filter) diff --git a/templates/index.html b/templates/index.html index bb50abd..4c437d2 100644 --- a/templates/index.html +++ b/templates/index.html @@ -173,6 +173,32 @@ border: 1px solid #ddd; border-radius: 4px; } + + /* Vibrant color styles for Visualize tab */ + .coordi-only-row { + background-color: #ff4444 !important; /* Bright red */ + color: white; + } + + .kst-only-row { + background-color: #4488ff !important; /* Bright blue */ + color: white; + } + + .mixed-duplicate-row { + background-color: #ff8800 !important; /* Bright orange */ + color: white; + } + + .pure-duplicate-row { + background-color: #8844ff !important; /* Bright purple */ + color: white; + } + + .matched-row { + background-color: white !important; /* White background */ + color: black; + } @@ -203,6 +229,7 @@
Summary
Different
+
Visualize
@@ -255,6 +282,25 @@
+ +
+

Data

+
+ + + + + + + + + + + + +
Coordi TitleCoordi ChapterKST TitleKST ChapterStatus
+
+
@@ -468,6 +514,9 @@ // Update Different tab updateDifferentTable(results.mismatch_details); + + // Update Visualize tab + updateVisualizeTable(results.visualize_data); } function updateSummaryTable(matchedData) { @@ -587,6 +636,40 @@ }); } + function updateVisualizeTable(visualizeData) { + const tbody = document.getElementById('visualize-table-body'); + tbody.innerHTML = ''; + + // Data is already sorted by the backend (mismatches first, then matches, all by Korean title) + visualizeData.forEach(row => { + const tr = tbody.insertRow(); + tr.insertCell(0).textContent = row.coordi_title || ''; + tr.insertCell(1).textContent = row.coordi_chapter || ''; + tr.insertCell(2).textContent = row.kst_title || ''; + tr.insertCell(3).textContent = row.kst_chapter || ''; + tr.insertCell(4).textContent = row.reason || ''; + + // Apply vibrant color highlighting based on row type + switch (row.row_type) { + case 'coordi_only': + tr.className = 'coordi-only-row'; + break; + case 'kst_only': + tr.className = 'kst-only-row'; + break; + case 'mixed_duplicate': + tr.className = 'mixed-duplicate-row'; + break; + case 'pure_duplicate': + tr.className = 'pure-duplicate-row'; + break; + case 'matched': + tr.className = 'matched-row'; + break; + } + }); + } + // Auto-analyze on page load with default file window.onload = function() { // Initialize sheet filter with loading state diff --git a/web_gui.py b/web_gui.py index 0510d9f..0e5a547 100644 --- a/web_gui.py +++ b/web_gui.py @@ -61,6 +61,10 @@ def analyze_data(): # Add matched data to results comparison_results['matched_data'] = matched_items_data + # Generate visualize data + visualize_data = comparator_instance.generate_visualize_data(sheet_filter) + comparison_results['visualize_data'] = visualize_data + return jsonify({ 'success': True, 'results': comparison_results @@ -307,6 +311,32 @@ def create_templates_dir(): border: 1px solid #ddd; border-radius: 4px; } + + /* Vibrant color styles for Visualize tab */ + .coordi-only-row { + background-color: #ff4444 !important; /* Bright red */ + color: white; + } + + .kst-only-row { + background-color: #4488ff !important; /* Bright blue */ + color: white; + } + + .mixed-duplicate-row { + background-color: #ff8800 !important; /* Bright orange */ + color: white; + } + + .pure-duplicate-row { + background-color: #8844ff !important; /* Bright purple */ + color: white; + } + + .matched-row { + background-color: white !important; /* White background */ + color: black; + } @@ -337,6 +367,7 @@ def create_templates_dir():
Summary
Different
+
Visualize
@@ -389,6 +420,25 @@ def create_templates_dir():
+ +
+

Data

+
+ + + + + + + + + + + + +
Coordi TitleCoordi ChapterKST TitleKST ChapterStatus
+
+
@@ -602,6 +652,9 @@ def create_templates_dir(): // Update Different tab updateDifferentTable(results.mismatch_details); + + // Update Visualize tab + updateVisualizeTable(results.visualize_data); } function updateSummaryTable(matchedData) { @@ -721,6 +774,40 @@ def create_templates_dir(): }); } + function updateVisualizeTable(visualizeData) { + const tbody = document.getElementById('visualize-table-body'); + tbody.innerHTML = ''; + + // Data is already sorted by the backend (mismatches first, then matches, all by Korean title) + visualizeData.forEach(row => { + const tr = tbody.insertRow(); + tr.insertCell(0).textContent = row.coordi_title || ''; + tr.insertCell(1).textContent = row.coordi_chapter || ''; + tr.insertCell(2).textContent = row.kst_title || ''; + tr.insertCell(3).textContent = row.kst_chapter || ''; + tr.insertCell(4).textContent = row.reason || ''; + + // Apply vibrant color highlighting based on row type + switch (row.row_type) { + case 'coordi_only': + tr.className = 'coordi-only-row'; + break; + case 'kst_only': + tr.className = 'kst-only-row'; + break; + case 'mixed_duplicate': + tr.className = 'mixed-duplicate-row'; + break; + case 'pure_duplicate': + tr.className = 'pure-duplicate-row'; + break; + case 'matched': + tr.className = 'matched-row'; + break; + } + }); + } + // Auto-analyze on page load with default file window.onload = function() { // Initialize sheet filter with loading state From f561d702d1e010962ec2e7e1493ff4e96c58d9a3 Mon Sep 17 00:00:00 2001 From: arthur Date: Thu, 21 Aug 2025 15:48:40 +0700 Subject: [PATCH 2/2] add logic for multiple duplication --- data/Compare DE.xlsx | Bin 0 -> 96096 bytes data_comparator.py | 49 ++++++++++++------ test_ba_confirmed_cases.py | 101 ------------------------------------- test_sheet_filtering.py | 57 --------------------- 4 files changed, 34 insertions(+), 173 deletions(-) create mode 100644 data/Compare DE.xlsx delete mode 100644 test_ba_confirmed_cases.py delete mode 100644 test_sheet_filtering.py diff --git a/data/Compare DE.xlsx b/data/Compare DE.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a74ed0b674ab4b47ab056c8e696f58e8955a1264 GIT binary patch literal 96096 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�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 1: - second_sheet = sheet_names[1] - print(f"\n=== TEST 2: Specific sheet filter ({second_sheet}) ===") - try: - summary2 = comparator.get_comparison_summary(second_sheet) - print(f"Selected sheet: {summary2['current_sheet_filter']}") - print(f"KST total: {summary2['original_counts']['kst_total']}") - print(f"Coordi total: {summary2['original_counts']['coordi_total']}") - print(f"Matched: {summary2['matched_items_count']}") - print("✓ Test 2 passed") - except Exception as e: - print(f"✗ Test 2 failed: {e}") - else: - print("\n=== TEST 2: Skipped (only one sheet available) ===") - - # Test 3: Verify no duplicates across sheets (this was the original problem) - print(f"\n=== TEST 3: Verify duplicate detection within single sheets only ===") - for sheet_name in sheet_names: - summary = comparator.get_comparison_summary(sheet_name) - print(f"Sheet '{sheet_name}':") - print(f" KST duplicates: {summary['mismatches']['kst_duplicates_count']}") - print(f" Coordi duplicates: {summary['mismatches']['coordi_duplicates_count']}") - - print("\n✓ All tests completed!") - -if __name__ == "__main__": - test_sheet_filtering() \ No newline at end of file