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
+31
View File
@@ -225,6 +225,15 @@ def build_parser() -> argparse.ArgumentParser:
p_mt.add_argument("--cols", type=int, default=2, help="列数 (default: 2)")
p_mt.add_argument("--title", default="", help="总标题")
# render-column
p_rc = sub.add_parser("render-column", help="GT 顶部 + 各算法纵向对比")
p_rc.add_argument("--gt-csv", required=True, help="GT CSV 文件路径")
p_rc.add_argument("--stable", required=True, help="supertable 名称")
p_rc.add_argument("--db", default="ts_anomaly", help="数据库名")
p_rc.add_argument("--value-col", default="value", help="数值列名 (default: value)")
p_rc.add_argument("--output", required=True, help="PNG 输出路径")
p_rc.add_argument("--url", default="ws://root:taosdata@localhost:6041", help="TDengine WebSocket URL")
return parser
@@ -258,6 +267,27 @@ def cmd_montage(args):
logger.info("montage complete: %s", args.output)
def cmd_render_column(args):
"""render-column 子命令:GT 顶部 + 各算法纵向对比。"""
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
from ts_anomaly_td.io_csv import read_csv
from ts_anomaly_td.visualize import render_column
ts, vals, labels = read_csv(args.gt_csv, value_col=args.value_col)
conn = TDConnection(args.url)
try:
db = args.db or "ts_anomaly"
conn.execute_no_result(f"USE {db}")
results = detect_all_algos(conn, args.stable)
finally:
conn.close()
title = f"{args.stable} — 算法对比"
render_column(ts, vals, labels, results, args.output, title=title)
def main():
parser = build_parser()
args = parser.parse_args()
@@ -271,6 +301,7 @@ def main():
"watch": cmd_watch,
"render-algo": cmd_render_algo,
"montage": cmd_montage,
"render-column": cmd_render_column,
}
fn = dispatch.get(args.command)