#!/usr/bin/env bash # run_compare.sh — 对所有内置数据集 × 6 算法跑对比可视化 # # 用法: # bash scripts/run_compare.sh [数据集目录] [输出目录] # # 默认: # 数据集目录: ../../datasets/builtin # 输出目录: render_compare # # 管道: inject → detect-batch → render-algo → montage set -uo 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 "(无拼图输出)"