synthdata-compute
既存のデータセットから派生テーブル、集計テーブル、または変換テーブルを生成できます。ユーザーが「月次スコアの計算」「月別の集計」「サマリーテーブルの作成」「リスクスコアの算出」「パーセンタイルランクの計算」「イベントのロールアップ」「生データからのベンチマーク作成」「計算列の追加」といった処理や、生成された生データテーブルとダウンストリーム分析との橋渡しが必要な場合に使用します。xlsx、csv、jsonの入力形式に対応しており、Claudeが計算ロジックを記述し、スクリプトがデータの入出力を処理します。
description の原文を見る
Compute derived, aggregated, or transformed tables from existing datasets. Use this skill when the user needs to "compute monthly scores", "aggregate by month", "create a summary table", "derive risk scores", "compute percentile ranks", "roll up events", "create benchmarks from raw data", "add a computed column", or bridge the gap between raw generated tables and downstream analytics. Works on xlsx, csv, or json input. Claude writes the computation logic; the script handles data I/O.
SKILL.md 本文
Synthdata Compute
既存データセットから集計、スコア付け、または変換されたテーブルを導出します。このスキルは、生成された合成データ(synthdata-generate によって作成)と、ダウンストリームツールが期待する導出メトリクス(月次ロールアップ、複合スコア、パーセンタイルランク、セグメント要約)の間のギャップを埋めます。
前提条件
pip install openpyxl pandas numpy --break-system-packages
ワークフロー
ステップ 1: 入力と期待される出力を特定する
ユーザーに以下を質問します:
- 入力: どのファイルですか?(xlsx ワークブック、csv ディレクトリ、json ファイル)
- 計算: 何が必要ですか?(自然言語 — 例:「イベントテーブルから月次リスクスコアを計算」)
- 出力: 結果をどこに保存しますか?(デフォルト:入力ファイルの横にシート/ファイルを追加)
ステップ 2: データを検査する
スクリプトをインスペクトモードで実行して、操作するデータを理解します:
python3 scripts/compute.py --inspect --input data.xlsx
各テーブルの名前、列名と dtype、行数、および 3 行のサンプルを出力します。計算ロジックを作成する前にスキーマを理解するために使用します。
ステップ 3: 計算を作成する
事前読み込みされた DataFrame で動作する Python ファイルを作成します。スクリプトは以下を提供します:
tables— テーブル名を pandas DataFrame にマッピングする辞書(すべての入力テーブルが事前読み込みされています)pd— pandasnp— numpyresult— 空の辞書;各出力テーブルに{name: DataFrame}のペアを割り当てます
計算ファイルの例(monthly_risk.py):
import pandas as pd
import numpy as np
users = tables['users']
threats = tables['threat_events']
sims = tables['phishing_sims']
training = tables['training']
dlp = tables['dlp_events']
abuse = tables['abuse_mailbox']
# イベント日付から月を抽出
threats['month'] = pd.to_datetime(threats['event_date']).dt.to_period('M')
sims['month'] = pd.to_datetime(sims['sim_date']).dt.to_period('M') if 'sim_date' in sims else ...
# ユーザーごと、月ごとにグループ化して集計
# ... (Claude はユーザーの要件に基づいて完全なロジックを作成します)
result['monthly_risk'] = monthly_risk_df
計算を .py ファイルに保存してから実行します。
ステップ 4: 実行する
python3 scripts/compute.py --input data.xlsx --code monthly_risk.py --output data_with_scores.xlsx
CLI フラグ:
| フラグ | 説明 |
|---|---|
--input | ソースデータセット(xlsx/csv-dir/json) |
--output | 出力パス(デフォルト: <input>_computed.<ext>) |
--inspect | テーブルスキーマを出力して終了 |
--code | 計算ロジックを含む Python ファイルのパス |
--expr | インライン Python 式(シンプルなワンライナー用) |
--append | 計算されたテーブルを入力ファイルのコピーに追加(xlsx のみ) |
インラインモード(シンプルな計算用):
python3 scripts/compute.py --input data.xlsx --output scored.xlsx \
--expr "result['summary'] = tables['events'].groupby('category').size().reset_index(name='count')"
ステップ 5: 検証する
実行後、スクリプトは以下を出力します:
- 各出力テーブルの名前、行数、列名
- 各出力テーブルの 5 行サンプル
- 出力パスの確認
ユーザーと一緒に出力を確認してから次に進みます。
一般的な計算レシピ
計算ロジックを作成する際のスタートポイントとして、これらのパターンを使用します。
月次イベントロールアップ
events = tables['threat_events']
events['month'] = pd.to_datetime(events['event_date']).dt.to_period('M').astype(str)
monthly = events.groupby(['user_id', 'month']).agg(
threat_events=('event_id', 'count'),
real_clicks=('clicked', 'sum'),
credentials_entered=('credentials_entered', 'sum'),
).reset_index()
result['monthly_threats'] = monthly
加重サブスコアからの複合スコア
# ウェイトの合計は 1.0 である必要があります
WEIGHTS = {'threat': 0.35, 'sim': 0.25, 'dlp': 0.20, 'training': 0.10, 'reporting': 0.10}
df['composite'] = (
df['threat_score'] * WEIGHTS['threat']
+ df['sim_score'] * WEIGHTS['sim']
+ df['dlp_score'] * WEIGHTS['dlp']
+ df['training_score'] * WEIGHTS['training']
+ df['reporting_score'] * WEIGHTS['reporting']
)
リスク層の割り当て
def assign_tier(score):
if score >= 75: return 'Critical'
if score >= 50: return 'High'
if score >= 25: return 'Medium'
return 'Low'
df['risk_tier'] = df['composite_risk_score'].apply(assign_tier)
パーセンタイルランク
df['percentile'] = df['composite_risk_score'].rank(pct=True) * 100
セグメント要約(ピアベンチマーク)
peers = tables['peers_detail']
metrics = ['sim_click_rate', 'training_completion', 'composite_risk_score']
rows = []
for segment_col in ['segment_healthcare', 'segment_geo', 'segment_size']:
cohort = peers[peers[segment_col] == 1]
for m in metrics:
rows.append({
'segment': segment_col, 'metric': m,
'mean': cohort[m].mean(), 'median': cohort[m].median(),
'p25': cohort[m].quantile(0.25), 'p75': cohort[m].quantile(0.75),
})
result['segment_summaries'] = pd.DataFrame(rows)
部門別の内訳
users = tables['users']
risk = tables['monthly_risk']
merged = risk.merge(users[['user_id', 'department']], on='user_id')
dept = merged.groupby('department').agg(
avg_risk=('composite_risk_score', 'mean'),
critical_count=('risk_tier', lambda x: (x == 'Critical').sum()),
user_count=('user_id', 'nunique'),
).sort_values('avg_risk', ascending=False).reset_index()
result['department_risk'] = dept
このスキルと他のスキルを使い分ける時
| 必要な処理 | スキル |
|---|---|
| スキーマ/テンプレートから新しい行を生成 | synthdata-generate |
| Excel → JSON を抽出 | synthdata-extract |
| 既存データに行/列を追加 | synthdata-extend |
| PII を偽の値に置き換え | synthdata-anonymize |
| 既存データから集計、スコア付け、ランク付け、または新しいテーブルを導出 | synthdata-compute |
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- rappdw
- リポジトリ
- rappdw/synthdata
- ライセンス
- MIT
- 最終更新
- 2026/4/10
Source: https://github.com/rappdw/synthdata / ライセンス: MIT