|
|
@@ -0,0 +1,241 @@
|
|
|
+"""
|
|
|
+交叉验证:提取所有5份PDF的JSON数据,逐模块比较
|
|
|
+"""
|
|
|
+import sys, os
|
|
|
+sys.path.insert(0, r'D:\workspace\cfc\docs\参考资料')
|
|
|
+import extract_full_report_v5 as m
|
|
|
+
|
|
|
+BASE = r'D:\workspace\cfc\docs\参考资料'
|
|
|
+pdfs = sorted(f for f in os.listdir(BASE) if f.lower().endswith('.pdf'))
|
|
|
+print(f'找到 {len(pdfs)} 份PDF\n')
|
|
|
+
|
|
|
+# 提取所有报告
|
|
|
+results = {}
|
|
|
+for fname in pdfs:
|
|
|
+ label = fname.replace('.pdf', '')
|
|
|
+ print(f'提取 {label}...')
|
|
|
+ results[label] = m.extract_pdf_to_json(os.path.join(BASE, fname))
|
|
|
+
|
|
|
+all_labels = list(results.keys())
|
|
|
+print()
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 1. 报告概述
|
|
|
+# =============================================
|
|
|
+print('=' * 80)
|
|
|
+print('1. 报告概述')
|
|
|
+print('=' * 80)
|
|
|
+overview_fields = ['姓名', '编号', '年龄', '性别', '肠道预测年龄', '肠型',
|
|
|
+ '肠道菌群平衡', '菌群多样性', '有益菌', '有害菌', '核心菌属',
|
|
|
+ '健康总分', '菌群健康', '慢病控制', '营养均衡']
|
|
|
+header = f"{'字段':<14}" + "".join(f"{l[:8]:<10}" for l in all_labels)
|
|
|
+print(header)
|
|
|
+print('-' * len(header))
|
|
|
+for field in overview_fields:
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ v = results[label]['报告概述'].get(field, '—')
|
|
|
+ vals.append(str(v)[:8])
|
|
|
+ print(f"{field:<14}" + "".join(f"{v:<10}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 2. 疾病风险评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('2. 疾病风险评估')
|
|
|
+print('=' * 80)
|
|
|
+# 收集所有疾病名
|
|
|
+all_diseases = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['疾病风险评估']:
|
|
|
+ all_diseases.add(r['名称'])
|
|
|
+all_diseases = sorted(all_diseases)
|
|
|
+print(f'共 {len(all_diseases)} 个疾病指标')
|
|
|
+for d in all_diseases:
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['疾病风险评估'] if r['名称'] == d]
|
|
|
+ if found:
|
|
|
+ v = found[0].get('数值', found[0].get('状态', '?'))
|
|
|
+ else:
|
|
|
+ v = '—'
|
|
|
+ vals.append(str(v)[:8])
|
|
|
+ print(f" {d:<14}" + "".join(f"{v:<10}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 3. 主要营养评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('3. 主要营养评估')
|
|
|
+print('=' * 80)
|
|
|
+all_nutri = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['主要营养评估']:
|
|
|
+ all_nutri.add(r['名称'])
|
|
|
+for n in sorted(all_nutri):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['主要营养评估'] if r['名称'] == n]
|
|
|
+ vals.append(found[0]['数值'] if found else '—')
|
|
|
+ print(f" {n:<10}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 4. 氨基酸评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('4. 氨基酸评估')
|
|
|
+print('=' * 80)
|
|
|
+all_amino = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['氨基酸评估']:
|
|
|
+ all_amino.add(r['名称'])
|
|
|
+for a in sorted(all_amino):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['氨基酸评估'] if r['名称'] == a]
|
|
|
+ vals.append(found[0]['数值'] if found else '—')
|
|
|
+ print(f" {a:<8}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 5. 维生素评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('5. 维生素评估')
|
|
|
+print('=' * 80)
|
|
|
+all_vit = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['维生素评估']:
|
|
|
+ all_vit.add(r['名称'])
|
|
|
+for v in sorted(all_vit):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['维生素评估'] if r['名称'] == v]
|
|
|
+ vals.append(found[0]['数值'] if found else '—')
|
|
|
+ print(f" {v:<10}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 6. 微量元素评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('6. 微量元素评估')
|
|
|
+print('=' * 80)
|
|
|
+for t in ['铁', '锌']:
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['微量元素评估'] if r['名称'] == t]
|
|
|
+ vals.append(found[0]['数值'] if found else '—')
|
|
|
+ print(f" {t:<8}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 7. 主要消化道致病菌
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('7. 主要消化道致病菌')
|
|
|
+print('=' * 80)
|
|
|
+all_path = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['主要消化道致病菌']:
|
|
|
+ all_path.add(r['致病菌'])
|
|
|
+for p in sorted(all_path):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['主要消化道致病菌'] if r['致病菌'] == p]
|
|
|
+ vals.append(found[0]['丰度'] if found else '—')
|
|
|
+ print(f" {p:<10}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 8. 肠道屏障及代谢物
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('8. 肠道屏障及代谢物')
|
|
|
+print('=' * 80)
|
|
|
+all_bar = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['肠道屏障及代谢物']:
|
|
|
+ all_bar.add(r['名称'])
|
|
|
+for b in sorted(all_bar):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['肠道屏障及代谢物'] if r['名称'] == b]
|
|
|
+ v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
|
|
|
+ vals.append(v)
|
|
|
+ print(f" {b:<16}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 9. 短链脂肪酸
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('9. 短链脂肪酸')
|
|
|
+print('=' * 80)
|
|
|
+all_scfa = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['短链脂肪酸']:
|
|
|
+ all_scfa.add(r['名称'])
|
|
|
+for s in sorted(all_scfa):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['短链脂肪酸'] if r['名称'] == s]
|
|
|
+ v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
|
|
|
+ vals.append(v)
|
|
|
+ print(f" {s:<20}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 10. 神经递质及激素
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('10. 神经递质及激素')
|
|
|
+print('=' * 80)
|
|
|
+all_nt = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['神经递质及激素']:
|
|
|
+ all_nt.add(r['名称'])
|
|
|
+for n in sorted(all_nt):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['神经递质及激素'] if r['名称'] == n]
|
|
|
+ v = found[0].get('数值', found[0].get('评估值', '?')) if found else '—'
|
|
|
+ vals.append(v)
|
|
|
+ print(f" {n:<20}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 11. 抗生素风险评估
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('11. 抗生素风险评估')
|
|
|
+print('=' * 80)
|
|
|
+all_abx = set()
|
|
|
+for label in all_labels:
|
|
|
+ for r in results[label]['抗生素风险评估']:
|
|
|
+ all_abx.add(r['名称'])
|
|
|
+for a in sorted(all_abx):
|
|
|
+ vals = []
|
|
|
+ for label in all_labels:
|
|
|
+ found = [r for r in results[label]['抗生素风险评估'] if r['名称'] == a]
|
|
|
+ vals.append(found[0]['数值'] if found else '—')
|
|
|
+ print(f" {a:<10}" + "".join(f"{v:<8}" for v in vals))
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 12. 个体化食物推荐表
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('12. 个体化食物推荐表')
|
|
|
+print('=' * 80)
|
|
|
+for label in all_labels:
|
|
|
+ food = results[label]['个体化食物推荐表']
|
|
|
+ print(f" {label}: {food['条目数']} 条, 格式={food['格式']}")
|
|
|
+
|
|
|
+# =============================================
|
|
|
+# 总结
|
|
|
+# =============================================
|
|
|
+print('\n' + '=' * 80)
|
|
|
+print('交叉验证总结')
|
|
|
+print('=' * 80)
|
|
|
+print(f"共验证 {len(all_labels)} 份报告")
|
|
|
+for label in all_labels:
|
|
|
+ r = results[label]
|
|
|
+ total = 0
|
|
|
+ for k in ['疾病风险评估', '主要营养评估', '氨基酸评估', '维生素评估', '微量元素评估',
|
|
|
+ '抗生素风险评估', '主要消化道致病菌', '肠道屏障及代谢物', '短链脂肪酸', '神经递质及激素']:
|
|
|
+ total += len(r.get(k, []))
|
|
|
+ total += r['个体化食物推荐表']['条目数']
|
|
|
+ print(f" {label}: {total} 总指标项")
|