feat: render-column (GT top + algos stacked), fix hour60 parsing, vivid anomaly markers

This commit is contained in:
张宗平
2026-06-11 22:11:48 +08:00
parent 7866a6b629
commit 404555ac0e
5 changed files with 198 additions and 41 deletions
+12 -40
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# run_compare.sh — 对所有内置数据集 × 6 算法跑对比可视化
# run_compare.sh — 对所有内置数据集跑纵向对比可视化(render-column
#
# 用法:
# bash scripts/run_compare.sh [数据集目录] [输出目录]
@@ -8,23 +8,21 @@
# 数据集目录: ../../datasets/builtin
# 输出目录: render_compare
#
# 管道: inject → detect-batch → render-algo → montage
# 管道: inject → render-column(自动检测 + 渲染)
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"
mkdir -p "$OUTPUT"
total=0
ok=0
@@ -41,48 +39,22 @@ for dataset_dir in "$BUILTIN_DIR"/*/; do
echo "=== $name (value_col=$value_col) ==="
# 1. 注入
echo " [1/3] inject..."
echo " [1/2] 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"
# 2. 纵向对比渲染(内部自动检测 6 算法)
echo " [2/2] render-column..."
uv run python -m ts_anomaly_td render-column \
--gt-csv "$csv" --stable "$name" --value-col "$value_col" \
--output "$OUTPUT/${name}_compare.png" --url "$URL" \
&& { echo "$OUTPUT/${name}_compare.png"; ((ok++)); } \
|| { echo " render-column FAILED"; }
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 "(无拼图输出)"
ls -la "$OUTPUT"/*_compare.png 2>/dev/null || echo "(无输出)"