import_material_strategy_learning.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. """Import local material strategy learning analysis into DB.
  2. This script is idempotent for the default run_id. It only writes internal
  3. learning tables and has no Tencent/Feishu side effects.
  4. """
  5. from __future__ import annotations
  6. import argparse
  7. import logging
  8. import sys
  9. from datetime import date
  10. from pathlib import Path
  11. from dotenv import load_dotenv
  12. _HERE = Path(__file__).parent
  13. load_dotenv(_HERE / ".env")
  14. sys.path.insert(0, str(_HERE))
  15. from tools.material_strategy_learning import ( # noqa: E402
  16. ensure_strategy_learning_tables,
  17. import_current_material_analysis,
  18. )
  19. DEFAULT_RUN_ID = "material_30d_20260607_20260706_top5000"
  20. DEFAULT_ANALYSIS_DIR = _HERE / "outputs/data/material_analysis_20260708"
  21. def parse_args() -> argparse.Namespace:
  22. parser = argparse.ArgumentParser(description="导入高消耗素材策略学习结果")
  23. parser.add_argument("--run-id", default=DEFAULT_RUN_ID)
  24. parser.add_argument("--window-start", default="2026-06-07")
  25. parser.add_argument("--window-end", default="2026-07-06")
  26. parser.add_argument(
  27. "--performance-csv",
  28. type=Path,
  29. default=_HERE / "outputs/data/high_consumption_materials_30d_20260707_223644.csv",
  30. )
  31. parser.add_argument(
  32. "--performance-summary-json",
  33. type=Path,
  34. default=_HERE / "outputs/data/high_consumption_materials_30d_20260707_223644_summary.json",
  35. )
  36. parser.add_argument(
  37. "--visual-annotations-csv",
  38. type=Path,
  39. default=DEFAULT_ANALYSIS_DIR / "top100_visual_annotations.csv",
  40. )
  41. parser.add_argument(
  42. "--visual-summary-json",
  43. type=Path,
  44. default=DEFAULT_ANALYSIS_DIR / "top100_visual_annotation_summary.json",
  45. )
  46. parser.add_argument(
  47. "--report-path",
  48. type=Path,
  49. default=DEFAULT_ANALYSIS_DIR / "top100_visual_annotation_report.md",
  50. )
  51. parser.add_argument(
  52. "--sql-file",
  53. default="examples/auto_put_ad_mini/sql/high_consumption_materials_30d.sql",
  54. )
  55. parser.add_argument("--top-n", type=int, default=5000)
  56. parser.add_argument("--annotation-version", default="top100_rule_v1")
  57. parser.add_argument("--dry-run", action="store_true", help="只检查文件和建表,不导入数据")
  58. return parser.parse_args()
  59. def _require_file(path: Path) -> None:
  60. if not path.exists():
  61. raise FileNotFoundError(f"文件不存在:{path}")
  62. def main() -> int:
  63. logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
  64. args = parse_args()
  65. for path in (
  66. args.performance_csv,
  67. args.performance_summary_json,
  68. args.visual_annotations_csv,
  69. args.visual_summary_json,
  70. args.report_path,
  71. ):
  72. _require_file(path)
  73. ensure_strategy_learning_tables()
  74. if args.dry_run:
  75. print("OK: 策略学习表已确认存在,输入文件检查通过")
  76. return 0
  77. result = import_current_material_analysis(
  78. run_id=args.run_id,
  79. window_start=date.fromisoformat(args.window_start),
  80. window_end=date.fromisoformat(args.window_end),
  81. performance_csv=args.performance_csv,
  82. performance_summary_json=args.performance_summary_json,
  83. visual_annotations_csv=args.visual_annotations_csv,
  84. visual_summary_json=args.visual_summary_json,
  85. report_path=args.report_path,
  86. sql_file=args.sql_file,
  87. top_n=args.top_n,
  88. annotation_version=args.annotation_version,
  89. )
  90. print(
  91. "OK: 导入完成 "
  92. f"run_id={result.run_id} "
  93. f"snapshot_rows={result.snapshot_rows} "
  94. f"annotation_rows={result.annotation_rows} "
  95. f"report_rows={result.report_rows}"
  96. )
  97. return 0
  98. if __name__ == "__main__":
  99. raise SystemExit(main())