mcpField
D
dataset-comparer

dataset-comparer

github.com/dkyazzentwatwaデータ・データベース12468 回インストール29 週間前に更新
リポジトリ

dataset-comparer について

dataset-comparerは、CSVやExcelのデータセットを比較するPythonツールです。データ検証や変更追跡に向けて、キー列または行位置で照合し、差分を複数形式のレポートに出力します。

主な機能

  1. 01行の追加・削除・変更の検出
  2. 02キー列または行位置での照合
  3. 03列スキーマの比較
  4. 04比較列の除外・指定
  5. 05HTML、CSV、JSONレポート

活用シーン

  1. 01データ移行結果の検証
  2. 02ETL出力の確認
  3. 03前回同期後に追加されたレコードの特定
  4. 04エクスポートのスキーマ変更検出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dkyazzentwatwa/chatgpt-skills --skill dataset-comparer

インストール後、Claude Code で/dataset-comparerを入力して読み込まれたか確認します。

同梱ファイルscripts/dataset_comparer.pyscripts/requirements.txt

詳細

データセット比較ツール

2つのCSV/Excelデータセットを比較して、差分、追加、削除、値の変更を特定します。

機能

  • 行の比較:追加、削除、一致した行を検出します
  • 値の変更:一致した行の変更値を検出します
  • 列の比較:スキーマの差異を特定します
  • 統計情報:差分の概要を表示します
  • 差分レポート:HTML、CSV、JSON形式で出力します
  • 柔軟な照合:キー列または行位置で比較します

クイックスタート

from dataset_comparer import DatasetComparer

comparer = DatasetComparer()
comparer.load("old_data.csv", "new_data.csv")

# Compare by key column
diff = comparer.compare(key_columns=["id"])

print(f"Added rows: {diff['added_count']}")
print(f"Removed rows: {diff['removed_count']}")
print(f"Changed rows: {diff['changed_count']}")

# Generate report
comparer.generate_report("diff_report.html")

CLI の使用方法

# Basic comparison
python dataset_comparer.py --old old.csv --new new.csv

# Compare by key column
python dataset_comparer.py --old old.csv --new new.csv --key id

# Multiple key columns
python dataset_comparer.py --old old.csv --new new.csv --key id,date

# Generate HTML report
python dataset_comparer.py --old old.csv --new new.csv --key id --report diff.html

# Export differences to CSV
python dataset_comparer.py --old old.csv --new new.csv --key id --output diff.csv

# JSON output
python dataset_comparer.py --old old.csv --new new.csv --key id --json

# Ignore specific columns
python dataset_comparer.py --old old.csv --new new.csv --key id --ignore updated_at,modified_date

# Compare only specific columns
python dataset_comparer.py --old old.csv --new new.csv --key id --columns name,email,status

API リファレンス

DatasetComparer クラス
class DatasetComparer:
    def __init__(self)

    # Data loading
    def load(self, old_path: str, new_path: str) -> 'DatasetComparer'
    def load_dataframes(self, old_df: pd.DataFrame,
                       new_df: pd.DataFrame) -> 'DatasetComparer'

    # Comparison
    def compare(self, key_columns: list = None,
               ignore_columns: list = None,
               compare_columns: list = None) -> dict

    # Detailed results
    def get_added_rows(self) -> pd.DataFrame
    def get_removed_rows(self) -> pd.DataFrame
    def get_changed_rows(self) -> pd.DataFrame
    def get_unchanged_rows(self) -> pd.DataFrame

    # Schema comparison
    def compare_schema(self) -> dict

    # Reports
    def generate_report(self, output: str, format: str = "html") -> str
    def to_dataframe(self) -> pd.DataFrame
    def summary(self) -> str

比較方法

キーによる比較

主キーのようなキー列を照合して行を比較します:

diff = comparer.compare(key_columns=["customer_id"])

# Multiple keys for composite matching
diff = comparer.compare(key_columns=["order_id", "product_id"])
位置による比較

行の位置(行番号)で行を比較します:

diff = comparer.compare()  # No keys = positional comparison

出力形式

比較結果
{
    "summary": {
        "old_rows": 1000,
        "new_rows": 1050,
        "added_count": 75,
        "removed_count": 25,
        "changed_count": 50,
        "unchanged_count": 900,
        "total_differences": 150
    },
    "schema_changes": {
        "added_columns": ["new_field"],
        "removed_columns": ["old_field"],
        "type_changes": [
            {"column": "amount", "old_type": "int64", "new_type": "float64"}
        ]
    },
    "key_columns": ["id"],
    "compared_columns": ["name", "email", "status"],
    "ignored_columns": ["updated_at"]
}
変更された行の詳細
changes = comparer.get_changed_rows()

# Returns DataFrame with columns:
# _key: Key value(s) for the row
# _column: Column that changed
# _old_value: Original value
# _new_value: New value

スキーマの比較

列の構造を比較します:

schema = comparer.compare_schema()

# Returns:
{
    "old_columns": ["id", "name", "old_field"],
    "new_columns": ["id", "name", "new_field"],
    "common_columns": ["id", "name"],
    "added_columns": ["new_field"],
    "removed_columns": ["old_field"],
    "type_changes": [
        {"column": "price", "old_type": "int64", "new_type": "float64"}
    ],
    "old_row_count": 1000,
    "new_row_count": 1050
}

フィルタリングオプション

列を無視する

比較時に特定の列をスキップします:

diff = comparer.compare(
    key_columns=["id"],
    ignore_columns=["updated_at", "modified_by", "timestamp"]
)
特定の列を比較する

選択した列のみを比較します:

diff = comparer.compare(
    key_columns=["id"],
    compare_columns=["name", "email", "status"]  # Only these columns
)

レポート形式

HTML レポート
comparer.generate_report("diff_report.html", format="html")

機能:

  • 統計情報の概要
  • インタラクティブなテーブル
  • 色分けされた変更(緑=追加、赤=削除、黄=変更)
  • スキーマ比較セクション
CSV エクスポート
comparer.generate_report("diff_report.csv", format="csv")

すべての差分を表形式で含みます。

JSON 出力
comparer.generate_report("diff_report.json", format="json")

差分データ全体をJSON形式で出力します。

ワークフローの例

データ移行の検証
comparer = DatasetComparer()
comparer.load("source_data.csv", "migrated_data.csv")

diff = comparer.compare(key_columns=["id"])

if diff["summary"]["total_differences"] == 0:
    print("Migration successful - no differences!")
else:
    print(f"Found {diff['summary']['total_differences']} differences")
    comparer.generate_report("migration_issues.html")
ETL パイプラインの検証
comparer = DatasetComparer()
comparer.load("yesterday.csv", "today.csv")

diff = comparer.compare(
    key_columns=["transaction_id"],
    ignore_columns=["processing_timestamp"]
)

# Check for unexpected changes
changed = comparer.get_changed_rows()
if len(changed) > 0:
    print("Warning: Historical records changed!")
    print(changed)
増分更新の検出
comparer = DatasetComparer()
comparer.load("last_sync.csv", "current.csv")

diff = comparer.compare(key_columns=["customer_id"])

# Get new records for processing
new_records = comparer.get_added_rows()
print(f"New records to process: {len(new_records)}")

# Get deleted records
deleted = comparer.get_removed_rows()
print(f"Records to deactivate: {len(deleted)}")
スキーマ変更の検出
comparer = DatasetComparer()
comparer.load("v1_export.csv", "v2_export.csv")

schema = comparer.compare_schema()

if schema["added_columns"]:
    print(f"New columns: {schema['added_columns']}")

if schema["removed_columns"]:
    print(f"Removed columns: {schema['removed_columns']}")

if schema["type_changes"]:
    for change in schema["type_changes"]:
        print(f"Type change: {change['column']} "
              f"({change['old_type']} -> {change['new_type']})")

大規模データセットのヒント

非常に大規模なデータセットの場合:

# Compare in chunks
comparer = DatasetComparer()
comparer.load("large_old.csv", "large_new.csv")

# Use key column for efficient matching
diff = comparer.compare(key_columns=["id"])

# Export only differences (not full data)
comparer.generate_report("diff_only.csv", format="csv")

依存関係

  • pandas>=2.0.0
  • numpy>=1.24.0

コメント