pharmacy-pos-qr-system/backend/analyze_statin_myopathy.py
시골약사 97cf89a9c2 feat: PubMed 기반 GraphRAG 연구 스크립트 추가
근거 기반 약물 추천을 위한 PubMed 논문 검색 및 분석 스크립트:

1. pubmed_search.py
   - PubMed 논문 검색 기본 템플릿
   - Biopython Entrez API 활용
   - 3가지 주제 검색 예시 포함

2. fetch_paper_abstract.py
   - PMID로 논문 초록 가져오기
   - 특정 논문 상세 정보 조회

3. analyze_statin_myopathy.py
   - Statin 근육병증과 CoQ10 보충 연구 분석
   - CK(Creatine Kinase) 측정의 의미 설명

4. ashwagandha_sleep_research.py
   - Ashwagandha의 수면 개선 효과 연구
   - 작용 메커니즘 분석 (코르티솔, GABA)
   - 다른 수면 보조제와 비교

5. naproxen_advantages_research.py
   - Naproxen의 심혈관 안전성 연구
   - NSAID 간 비교 분석
   - 약동학 및 업셀링 시나리오

6. pycnogenol_multi_indication_research.py
   - 피크노제놀의 7가지 적응증 연구
   - 발기부전, 당뇨망막병증, 정맥기능부전 등
   - 우선순위 점수화

7. pycnogenol_womens_health_research.py
   - 피크노제놀의 여성 건강 효능
   - 갱년기, 생리통, 피부 미용

8. sqlite_graph_example.py
   - SQLite 그래프 쿼리 예제
   - Cypher 스타일 추론 시연
   - GraphRAG 개념 실습

각 스크립트는 Windows 한글 인코딩 처리 포함.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-24 21:04:33 +09:00

213 lines
6.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Statin 근육병증의 스펙트럼 분석
왜 CK 측정이 중요한가?
"""
import sys
import os
if sys.platform == 'win32':
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
from Bio import Entrez
from dotenv import load_dotenv
load_dotenv()
Entrez.email = os.getenv('PUBMED_EMAIL', 'test@example.com')
def search_statin_myopathy_spectrum():
"""Statin 근육병증의 심각도 스펙트럼 관련 논문 검색"""
print("=" * 80)
print("Statin 근육병증의 종류와 CK의 관계")
print("=" * 80)
# 검색: Statin myopathy classification
query = "statin myopathy classification creatine kinase"
try:
handle = Entrez.esearch(
db="pubmed",
term=query,
retmax=3,
sort="relevance"
)
record = Entrez.read(handle)
handle.close()
pmids = record["IdList"]
if pmids:
handle = Entrez.efetch(
db="pubmed",
id=pmids,
rettype="medline",
retmode="xml"
)
papers = Entrez.read(handle)
handle.close()
print(f"\n관련 논문 {len(pmids)}건 발견:\n")
for idx, paper in enumerate(papers['PubmedArticle'], 1):
article = paper['MedlineCitation']['Article']
pmid = str(paper['MedlineCitation']['PMID'])
title = article.get('ArticleTitle', '')
# 초록
abstract_parts = article.get('Abstract', {}).get('AbstractText', [])
if abstract_parts:
if isinstance(abstract_parts, list):
abstract = ' '.join([str(part) for part in abstract_parts])[:300]
else:
abstract = str(abstract_parts)[:300]
else:
abstract = "(초록 없음)"
print(f"[{idx}] PMID: {pmid}")
print(f"제목: {title}")
print(f"초록: {abstract}...")
print(f"링크: https://pubmed.ncbi.nlm.nih.gov/{pmid}/")
print("-" * 80)
except Exception as e:
print(f"[ERROR] 검색 실패: {e}")
def print_myopathy_spectrum():
"""Statin 근육병증 스펙트럼 설명"""
print("\n\n" + "=" * 80)
print("Statin 근육병증의 스펙트럼 (경증 → 중증)")
print("=" * 80)
spectrum = [
{
"type": "1. Myalgia (근육통)",
"prevalence": "5-10%",
"ck_level": "정상 (Normal)",
"symptoms": "근육 통증, 뻐근함",
"severity": "경증",
"management": "CoQ10, 용량 조절"
},
{
"type": "2. Myopathy (근육병증)",
"prevalence": "0.1-0.5%",
"ck_level": "경도 상승 (<10배)",
"symptoms": "근육 약화, 통증",
"severity": "중등도",
"management": "Statin 변경/중단"
},
{
"type": "3. Rhabdomyolysis (횡문근융해증)",
"prevalence": "0.01%",
"ck_level": "심각한 상승 (>10배, 수천~수만)",
"symptoms": "심한 근육 통증, 갈색 소변, 급성 신부전",
"severity": "중증 (응급)",
"management": "즉시 중단, 입원 치료"
}
]
for item in spectrum:
print(f"\n{item['type']}")
print(f" 발생률: {item['prevalence']}")
print(f" CK 수치: {item['ck_level']}")
print(f" 증상: {item['symptoms']}")
print(f" 심각도: {item['severity']}")
print(f" 관리: {item['management']}")
print("-" * 80)
print("\n\n" + "=" * 80)
print("왜 논문에서 CK를 측정했는가?")
print("=" * 80)
reasons = [
{
"이유": "1. 안전성 확인",
"설명": """
CoQ10 보충이 단순히 '증상을 가리는 것'인지, 아니면 '실제로 근육을
보호하는 것'인지 확인하기 위함.
만약 CK가 계속 상승한다면?
→ 근육 손상이 진행 중이므로 위험
→ 증상만 완화되면 환자가 모르고 계속 복용 → 횡문근융해증 위험
CK가 정상이면?
→ 실제 근육 손상은 없음
→ CoQ10으로 증상만 관리하면 안전
"""
},
{
"이유": "2. 메커니즘 이해",
"설명": """
결과: 증상 개선 (O), CK 변화 없음 (-)
→ 이것이 의미하는 것:
CoQ10은 "근육 재생" 효과가 아님
대신 "미토콘드리아 기능 회복" 효과
Statin 근육통 = 구조적 손상(X), 기능적 문제(O)
"""
},
{
"이유": "3. 객관적 평가",
"설명": """
문제: 근육 통증은 주관적 증상 (placebo 효과 가능)
해결: CK는 객관적 바이오마커
- 환자가 "덜 아프다"고 느낌 (주관적)
- CK 정상 유지 (객관적) → 실제로 안전함을 증명
"""
},
{
"이유": "4. 임상 지침 반영",
"설명": """
미국심장학회(ACC/AHA) Statin 안전성 가이드라인:
【CK 측정 시점】
- 치료 전 베이스라인
- 근육 증상 발생 시
- CK > 정상의 10배 → 즉시 중단
논문에서 CK를 측정한 것은 이 가이드라인을 따른 것
"""
}
]
for item in reasons:
print(f"\n{item['이유']}")
print(item['설명'])
print("-" * 80)
def main():
# 1. Statin 근육병증 스펙트럼 설명
print_myopathy_spectrum()
# 2. 관련 논문 검색
print("\n\n" + "=" * 80)
print("관련 논문 검색 중...")
print("=" * 80)
search_statin_myopathy_spectrum()
# 3. 결론
print("\n\n" + "=" * 80)
print("결론: 논문에서 CK를 측정한 이유")
print("=" * 80)
print("""
1⃣ 안전성: CoQ10이 증상만 가리는 게 아니라 실제로 안전한지 확인
2⃣ 메커니즘: 근육 손상(X), 미토콘드리아 기능 저하(O)임을 증명
3⃣ 객관성: 주관적 증상뿐 아니라 객관적 지표로도 안전함을 입증
4⃣ 임상 적용: 실제 진료 시 CK 검사 없이 CoQ10 권장 가능
→ CK 정상 = "CoQ10 + Statin 병용이 안전하다"는 강력한 근거
""")
if __name__ == '__main__':
main()