From 85c595367ee4fd5c00f0a368688181287060486a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=AE=97=E5=B9=B3?= Date: Thu, 11 Jun 2026 21:21:25 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20add=20run=5Fcompare.sh=20orchestration?= =?UTF-8?q?=20script=20for=20dataset=C3=97algo=20comparison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/run_compare.sh | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 scripts/run_compare.sh diff --git a/scripts/run_compare.sh b/scripts/run_compare.sh new file mode 100755 index 0000000..7874cf0 --- /dev/null +++ b/scripts/run_compare.sh @@ -0,0 +1,88 @@ +#!/usr/bin/env bash +# run_compare.sh — 对所有内置数据集 × 6 算法跑对比可视化 +# +# 用法: +# bash scripts/run_compare.sh [数据集目录] [输出目录] +# +# 默认: +# 数据集目录: ../../datasets/builtin +# 输出目录: render_compare +# +# 管道: inject → detect-batch → render-algo → montage + +set -euo pipefail + +BUILTIN_DIR="${1:-../../datasets/builtin}" +OUTPUT="${2:-render_compare}" +ALGOS="ksigma iqr grubbs shesd lof sample_ad_model" +URL="${TS_ANA_TD_URL:-ws://root:taosdata@localhost:6041}" + +# 多列数据集映射: dataset_name → value_col +# 未在此映射中的数据集默认使用 "value" 列 +declare -A VALUE_COLS=( + ["ecg_002"]="ECG1" + ["sensor_007"]="ankle_horiz_fwd" +) + +mkdir -p "$OUTPUT/det" "$OUTPUT/algo" + +total=0 +ok=0 +skip=0 + +for dataset_dir in "$BUILTIN_DIR"/*/; do + name=$(basename "$dataset_dir") + csv="$dataset_dir/data.csv" + [[ -f "$csv" ]] || { echo "SKIP $name: no data.csv"; ((skip++)); ((total++)); continue; } + + # 确定 value 列 + value_col="${VALUE_COLS[$name]:-value}" + + echo "=== $name (value_col=$value_col) ===" + + # 1. 注入 + echo " [1/3] inject..." + uv run python -m ts_anomaly_td inject \ + --csv "$csv" --stable "$name" --value-col "$value_col" --url "$URL" \ + || { echo " inject FAILED, skipping $name"; ((total++)); continue; } + + # 2. 逐算法检测 + 渲染 + panels=() + for algo in $ALGOS; do + det_json="$OUTPUT/det/${name}_${algo}.json" + algo_png="$OUTPUT/algo/${name}_${algo}.png" + + echo " [2/3] detect $algo..." + uv run python -m ts_anomaly_td detect-batch \ + --stable "$name" --algo "$algo" --json --url "$URL" \ + > "$det_json" 2>/dev/null || true + + echo " [2/3] render $algo..." + uv run python -m ts_anomaly_td render-algo \ + --gt-csv "$csv" --det-json "$det_json" --algo "$algo" \ + --output "$algo_png" --value-col "$value_col" \ + --title "$name / $algo" \ + || { echo " render $algo FAILED"; continue; } + + panels+=("$algo_png") + done + + # 3. 拼图 + if [[ ${#panels[@]} -gt 0 ]]; then + echo " [3/3] montage (${#panels[@]} panels)..." + uv run python -m ts_anomaly_td montage \ + --inputs "${panels[@]}" \ + --output "$OUTPUT/${name}_compare.png" \ + --cols 2 \ + --title "$name — 算法对比" + echo " → $OUTPUT/${name}_compare.png" + ((ok++)) + else + echo " no panels, skip montage for $name" + fi + ((total++)) +done + +echo "" +echo "=== 完成: $ok/$total 成功, $skip 跳过 ===" +ls -la "$OUTPUT"/*_compare.png 2>/dev/null || echo "(无拼图输出)"