cross_validate.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. """
  2. 交叉验证:提取所有5份PDF的JSON数据,逐模块比较
  3. """
  4. import sys, os
  5. sys.path.insert(0, r'D:\workspace\cfc\docs\参考资料')
  6. import extract_full_report_v5 as m
  7. BASE = r'D:\workspace\cfc\docs\参考资料'
  8. pdfs = sorted(f for f in os.listdir(BASE) if f.lower().endswith('.pdf'))
  9. print(f'找到 {len(pdfs)} 份PDF\n')
  10. # 提取所有报告
  11. results = {}
  12. for fname in pdfs:
  13. label = fname.replace('.pdf', '')
  14. print(f'提取 {label}...')
  15. results[label] = m.extract_pdf_to_json(os.path.join(BASE, fname))
  16. all_labels = list(results.keys())
  17. print()
  18. # =============================================
  19. # 1. 报告概述
  20. # =============================================
  21. print('=' * 80)
  22. print('1. 报告概述')
  23. print('=' * 80)
  24. overview_fields = ['姓名', '编号', '年龄', '性别', '肠道预测年龄', '肠型',
  25. '肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属',
  26. '健康总分', '菌群健康', '慢病控制', '营养均衡']
  27. header = f"{'字段':<14}" + "".join(f"{l[:8]:<10}" for l in all_labels)
  28. print(header)
  29. print('-' * len(header))
  30. for field in overview_fields:
  31. vals = []
  32. for label in all_labels:
  33. v = results[label]['报告概述'].get(field, '—')
  34. vals.append(str(v)[:8])
  35. print(f"{field:<14}" + "".join(f"{v:<10}" for v in vals))
  36. # =============================================
  37. # 2. 疾病风险评估
  38. # =============================================
  39. print('\n' + '=' * 80)
  40. print('2. 疾病风险评估')
  41. print('=' * 80)
  42. # 收集所有疾病名
  43. all_diseases = set()
  44. for label in all_labels:
  45. for r in results[label]['疾病风险评估']:
  46. all_diseases.add(r['名称'])
  47. all_diseases = sorted(all_diseases)
  48. print(f'共 {len(all_diseases)} 个疾病指标')
  49. for d in all_diseases:
  50. vals = []
  51. for label in all_labels:
  52. found = [r for r in results[label]['疾病风险评估'] if r['名称'] == d]
  53. if found:
  54. v = found[0].get('数值', found[0].get('状态', '?'))
  55. else:
  56. v = '—'
  57. vals.append(str(v)[:8])
  58. print(f" {d:<14}" + "".join(f"{v:<10}" for v in vals))
  59. # =============================================
  60. # 3. 主要营养评估
  61. # =============================================
  62. print('\n' + '=' * 80)
  63. print('3. 主要营养评估')
  64. print('=' * 80)
  65. all_nutri = set()
  66. for label in all_labels:
  67. for r in results[label]['主要营养评估']:
  68. all_nutri.add(r['名称'])
  69. for n in sorted(all_nutri):
  70. vals = []
  71. for label in all_labels:
  72. found = [r for r in results[label]['主要营养评估'] if r['名称'] == n]
  73. vals.append(found[0]['数值'] if found else '—')
  74. print(f" {n:<10}" + "".join(f"{v:<8}" for v in vals))
  75. # =============================================
  76. # 4. 氨基酸评估
  77. # =============================================
  78. print('\n' + '=' * 80)
  79. print('4. 氨基酸评估')
  80. print('=' * 80)
  81. all_amino = set()
  82. for label in all_labels:
  83. for r in results[label]['氨基酸评估']:
  84. all_amino.add(r['名称'])
  85. for a in sorted(all_amino):
  86. vals = []
  87. for label in all_labels:
  88. found = [r for r in results[label]['氨基酸评估'] if r['名称'] == a]
  89. vals.append(found[0]['数值'] if found else '—')
  90. print(f" {a:<8}" + "".join(f"{v:<8}" for v in vals))
  91. # =============================================
  92. # 5. 维生素评估
  93. # =============================================
  94. print('\n' + '=' * 80)
  95. print('5. 维生素评估')
  96. print('=' * 80)
  97. all_vit = set()
  98. for label in all_labels:
  99. for r in results[label]['维生素评估']:
  100. all_vit.add(r['名称'])
  101. for v in sorted(all_vit):
  102. vals = []
  103. for label in all_labels:
  104. found = [r for r in results[label]['维生素评估'] if r['名称'] == v]
  105. vals.append(found[0]['数值'] if found else '—')
  106. print(f" {v:<10}" + "".join(f"{v:<8}" for v in vals))
  107. # =============================================
  108. # 6. 微量元素评估
  109. # =============================================
  110. print('\n' + '=' * 80)
  111. print('6. 微量元素评估')
  112. print('=' * 80)
  113. for t in ['铁', '锌']:
  114. vals = []
  115. for label in all_labels:
  116. found = [r for r in results[label]['微量元素评估'] if r['名称'] == t]
  117. vals.append(found[0]['数值'] if found else '—')
  118. print(f" {t:<8}" + "".join(f"{v:<8}" for v in vals))
  119. # =============================================
  120. # 7. 主要消化道致病菌
  121. # =============================================
  122. print('\n' + '=' * 80)
  123. print('7. 主要消化道致病菌')
  124. print('=' * 80)
  125. all_path = set()
  126. for label in all_labels:
  127. for r in results[label]['主要消化道致病菌']:
  128. all_path.add(r['致病菌'])
  129. for p in sorted(all_path):
  130. vals = []
  131. for label in all_labels:
  132. found = [r for r in results[label]['主要消化道致病菌'] if r['致病菌'] == p]
  133. vals.append(found[0]['丰度'] if found else '—')
  134. print(f" {p:<10}" + "".join(f"{v:<8}" for v in vals))
  135. # =============================================
  136. # 8. 肠道屏障及代谢物
  137. # =============================================
  138. print('\n' + '=' * 80)
  139. print('8. 肠道屏障及代谢物')
  140. print('=' * 80)
  141. all_bar = set()
  142. for label in all_labels:
  143. for r in results[label]['肠道屏障及代谢物']:
  144. all_bar.add(r['名称'])
  145. for b in sorted(all_bar):
  146. vals = []
  147. for label in all_labels:
  148. found = [r for r in results[label]['肠道屏障及代谢物'] if r['名称'] == b]
  149. v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
  150. vals.append(v)
  151. print(f" {b:<16}" + "".join(f"{v:<8}" for v in vals))
  152. # =============================================
  153. # 9. 短链脂肪酸
  154. # =============================================
  155. print('\n' + '=' * 80)
  156. print('9. 短链脂肪酸')
  157. print('=' * 80)
  158. all_scfa = set()
  159. for label in all_labels:
  160. for r in results[label]['短链脂肪酸']:
  161. all_scfa.add(r['名称'])
  162. for s in sorted(all_scfa):
  163. vals = []
  164. for label in all_labels:
  165. found = [r for r in results[label]['短链脂肪酸'] if r['名称'] == s]
  166. v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
  167. vals.append(v)
  168. print(f" {s:<20}" + "".join(f"{v:<8}" for v in vals))
  169. # =============================================
  170. # 10. 神经递质及激素
  171. # =============================================
  172. print('\n' + '=' * 80)
  173. print('10. 神经递质及激素')
  174. print('=' * 80)
  175. all_nt = set()
  176. for label in all_labels:
  177. for r in results[label]['神经递质及激素']:
  178. all_nt.add(r['名称'])
  179. for n in sorted(all_nt):
  180. vals = []
  181. for label in all_labels:
  182. found = [r for r in results[label]['神经递质及激素'] if r['名称'] == n]
  183. v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
  184. vals.append(v)
  185. print(f" {n:<20}" + "".join(f"{v:<8}" for v in vals))
  186. # =============================================
  187. # 11. 抗生素风险评估
  188. # =============================================
  189. print('\n' + '=' * 80)
  190. print('11. 抗生素风险评估')
  191. print('=' * 80)
  192. all_abx = set()
  193. for label in all_labels:
  194. for r in results[label]['抗生素风险评估']:
  195. all_abx.add(r['名称'])
  196. for a in sorted(all_abx):
  197. vals = []
  198. for label in all_labels:
  199. found = [r for r in results[label]['抗生素风险评估'] if r['名称'] == a]
  200. vals.append(found[0]['数值'] if found else '—')
  201. print(f" {a:<10}" + "".join(f"{v:<8}" for v in vals))
  202. # =============================================
  203. # 12. 个体化食物推荐表
  204. # =============================================
  205. print('\n' + '=' * 80)
  206. print('12. 个体化食物推荐表')
  207. print('=' * 80)
  208. for label in all_labels:
  209. food = results[label]['个体化食物推荐表']
  210. print(f" {label}: {food['条目数']} 条, 格式={food['格式']}")
  211. # =============================================
  212. # 总结
  213. # =============================================
  214. print('\n' + '=' * 80)
  215. print('交叉验证总结')
  216. print('=' * 80)
  217. print(f"共验证 {len(all_labels)} 份报告")
  218. for label in all_labels:
  219. r = results[label]
  220. total = 0
  221. for k in ['疾病风险评估', '主要营养评估', '氨基酸评估', '维生素评估', '微量元素评估',
  222. '抗生素风险评估', '主要消化道致病菌', '肠道屏障及代谢物', '短链脂肪酸', '神经递质及激素']:
  223. total += len(r.get(k, []))
  224. total += r['个体化食物推荐表']['条目数']
  225. print(f" {label}: {total} 总指标项")