piclecsv.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import os, pickle, csv, sys, re
  2. # ここに変換したいファイルを列挙(相対パスOK)
  3. files = [
  4. "outputs/plot_minwidthsum_perpair_vs_budget_Depolar.pickle",
  5. "outputs/plot_minwidthsum_perpair_weighted_vs_budget_Depolar.pickle",
  6. "outputs/plot_widthsum_alllinks_vs_budget_Depolar.pickle",
  7. "outputs/plot_widthsum_alllinks_weighted_vs_budget_Depolar.pickle",
  8. ]
  9. # 指標候補(見つかった順に採用)
  10. PREFERRED_KEYS = [
  11. "minwidthsum_weighted",
  12. "minwidthsum",
  13. "widthsum_alllinks_weighted",
  14. "widthsum_alllinks",
  15. "accuracy", # 念のため
  16. "value", # 念のため
  17. "metric" # 念のため
  18. ]
  19. def pick_metric_key(results):
  20. """results は {budget: {...}}。どのキーでCSV化するか自動推定"""
  21. for b, r in results.items():
  22. if isinstance(r, dict) and r:
  23. keys = set(r.keys())
  24. # ノイズになりがちなキーを除外
  25. keys -= {"per_pair_details", "details", "meta"}
  26. # 優先候補から探す
  27. for k in PREFERRED_KEYS:
  28. if k in keys:
  29. return k
  30. # それでも見つからなければ、数値っぽい最初のキー
  31. for k in keys:
  32. v = r.get(k)
  33. if isinstance(v, (int, float)) or (v is not None and not isinstance(v, (dict, list, tuple, set))):
  34. return k
  35. return None
  36. for path in files:
  37. if not os.path.exists(path):
  38. print(f"[WARN] not found: {path}")
  39. continue
  40. with open(path, "rb") as f:
  41. try:
  42. obj = pickle.load(f)
  43. except Exception as e:
  44. print(f"[ERROR] pickle.load failed for {path}: {e}")
  45. continue
  46. budgets = obj.get("budget_list", [])
  47. results = obj.get("results", {})
  48. if not budgets or not isinstance(results, dict) or not results:
  49. print(f"[WARN] {path}: budgets or results is empty(サイズが小さい594Bケースかも)")
  50. continue
  51. metric_key = pick_metric_key(results)
  52. if not metric_key:
  53. print(f"[WARN] {path}: 指標キーが見つからないためスキップ(resultsの中身を要確認)")
  54. continue
  55. out_csv = os.path.splitext(path)[0] + ".csv" # 同名で .csv を outputs/ に出力
  56. os.makedirs(os.path.dirname(out_csv), exist_ok=True)
  57. with open(out_csv, "w", newline="") as fcsv:
  58. w = csv.writer(fcsv)
  59. w.writerow(["budget", metric_key])
  60. for b in budgets:
  61. v = results.get(b, {}).get(metric_key)
  62. w.writerow([b, v])
  63. print(f"[OK] {out_csv} (列: budget,{metric_key})")