import_material_strategy_learning.py 3.7 KB

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