- 개발/테스트 스크립트를 dev_scripts/ 폴더로 이동 - 스크린샷을 screenshots/ 폴더로 이동 - 백업 파일 보존 (.backup) - 처방 관련 추가 스크립트 포함 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
84 lines
4.0 KiB
Python
84 lines
4.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
한약재 제품 코드 심층 분석
|
|
"""
|
|
|
|
import pandas as pd
|
|
|
|
def deep_analyze():
|
|
file_path = 'sample/(게시)한약재제품코드_2510.xlsx'
|
|
sheet_name = '한약재 제품코드_20250930기준(유효코드만 공지)'
|
|
|
|
# 데이터 읽기 - 제품코드를 문자열로 읽어서 0 유지
|
|
df = pd.read_excel(file_path, sheet_name=sheet_name, dtype={'제품코드': str})
|
|
|
|
print("=== 한약재 제품 코드 데이터 심층 분석 ===")
|
|
print(f"전체 데이터: {len(df):,}개 제품")
|
|
print(f"유일한 주성분코드: {df['주성분코드'].nunique()}개")
|
|
print(f"유일한 약재 품목명: {df['한약재 품목명'].nunique()}개")
|
|
print(f"유일한 업체: {df['업체명'].nunique()}개")
|
|
|
|
# 주성분코드별 통계
|
|
print("\n=== 주성분코드별 제품 수 (상위 20개) ===")
|
|
ingredient_stats = df.groupby(['주성분코드', '한약재 품목명']).size().reset_index(name='제품수')
|
|
ingredient_stats = ingredient_stats.sort_values('제품수', ascending=False).head(20)
|
|
|
|
for _, row in ingredient_stats.iterrows():
|
|
print(f" {row['주성분코드']} ({row['한약재 품목명']}): {row['제품수']}개 제품")
|
|
|
|
# 업체별 통계
|
|
print("\n=== 업체별 제품 수 (상위 10개) ===")
|
|
company_stats = df['업체명'].value_counts().head(10)
|
|
for company, count in company_stats.items():
|
|
print(f" {company}: {count}개 제품")
|
|
|
|
# 규격별 분석
|
|
print("\n=== 약품 규격 분석 ===")
|
|
spec_stats = df['약품규격(단위)'].value_counts()
|
|
print("규격 단위별 제품 수:")
|
|
for spec, count in spec_stats.items():
|
|
print(f" {spec}: {count}개")
|
|
|
|
# 특정 약재들 확인
|
|
print("\n=== 주요 약재 확인 ===")
|
|
target_herbs = ['건강', '감초', '당귀', '황기', '숙지황', '백출', '천궁', '육계', '백작약', '인삼', '생강', '대추']
|
|
|
|
for herb in target_herbs:
|
|
herb_data = df[df['한약재 품목명'] == herb]
|
|
if not herb_data.empty:
|
|
unique_code = herb_data['주성분코드'].iloc[0] if len(herb_data) > 0 else 'N/A'
|
|
product_count = len(herb_data)
|
|
company_count = herb_data['업체명'].nunique()
|
|
print(f" {herb}: 주성분코드={unique_code}, {product_count}개 제품, {company_count}개 업체")
|
|
else:
|
|
print(f" {herb}: 데이터 없음")
|
|
|
|
# 한 약재에 여러 제품이 있는 예시 - 건강
|
|
print("\n=== '건강' 약재의 제품 예시 (처음 10개) ===")
|
|
gangang_data = df[df['한약재 품목명'] == '건강'].head(10)
|
|
if not gangang_data.empty:
|
|
for _, row in gangang_data.iterrows():
|
|
# 제품코드를 9자리로 표시 (0 패딩)
|
|
product_code = str(row['제품코드']).zfill(9)
|
|
print(f" 업체: {row['업체명']}, 제품명: {row['제품명']}, 제품코드: {product_code}, 규격: {row['약품규격(숫자)']} {row['약품규격(단위)']}")
|
|
|
|
# 현재 시스템과의 비교
|
|
print("\n=== 현재 DB 설계와의 차이점 ===")
|
|
print("1. 현재 시스템:")
|
|
print(" - herb_items: 약재 기본 정보 (예: 건강)")
|
|
print(" - inventory_lots: 로트별 재고 (원산지, 가격 등)")
|
|
print("\nㅇ2. 제품코드 시스템:")
|
|
print(" - 주성분코드: 약재별 고유 코드 (예: 3050H1AHM = 건강)")
|
|
print(" - 제품코드: 업체별 제품 고유코드")
|
|
print(" - 표준코드/대표코드: 바코드 시스템")
|
|
print(" - 규격: 포장 단위 (500g, 1000g 등)")
|
|
|
|
print("\n=== 시사점 ===")
|
|
print("- 54,000개 이상의 유통 제품이 454개 주성분코드로 분류됨")
|
|
print("- 같은 약재(주성분)라도 업체별로 다른 제품명과 코드를 가짐")
|
|
print("- 제품별로 다양한 포장 규격 존재 (-, 500g, 600g, 1000g 등)")
|
|
print("- 표준코드(바코드)를 통한 제품 식별 가능")
|
|
|
|
if __name__ == "__main__":
|
|
deep_analyze() |