티스토리 뷰

진료년월, 성분코드 입력 시 전국 데이터 가져오는 코드

 

     1. ${일반 인증키(Decoding)} 부분에 본인의 일반 인증키(Decoding) 입력.

service_key = "${일반 인증키(Decoding)}"

     2. 진료년월(digay_ym)은 2022년 1월, 

성분코드(gnl_nm_cd)는 488501ATB 

sido_sggu_lists에 있는 다섯개의 지역에 대해서만 for문을 돌며 데이터를 가져올 예정.

diag_ym = '202201'  # 진료년월
gnl_nm_cd = '488501ATB'  # 성분코드
# [시도코드, 시군구코드] 쌍으로 되어 있는 리스트.
sido_sggu_lists = [['220000','220003'], ['320000', '320100'], ['110000', '110016'], ['110000', '110023'], ['230000', '230006']]

     3. params라는 dict를 만들고 request param정의.

serviceKey, diagYm, gnlNmCd는 위에서 만든 변수의 값 사용하고

나머지는 변하지 않을 값이니 코드에 박아 놓음. 

import requests
import pandas as pd


serviceKey = service_key  # 일반 인증키 (Decoding)

# 성분별지역별사용량목록조회
url = 'http://apis.data.go.kr/B551182/msupUserInfoService/getCmpnAreaList'
params = {'serviceKey' : serviceKey,  # 공공데이터포털에서 받은 인증키
         'numOfRows' : '10',  # 한 페이지 결과 수
         'pageNo' : '1',  # 페이지 번호
         'diagYm' : diag_ym,  # 진료년월
         'gnlNmCd' : gnl_nm_cd,  # 성분코드
         'insupTp' : '0',  # 0 =전체, 4=건강보험, 5=의료급여, 7=보훈
         'cpmdPrscTp' : '02'}  # 01 = 조제기준, 02=처방기준

 

<처음 해보시는 분들을 위해 단계 별로 쪼개서 준비해보았습니다.>

     4. Lv1: API 호출. 

# level 1 (sido_sggu_lists의 길이만큼 request하고 결과 출력.)
for sido_sggu_list in sido_sggu_lists:
    # 위에서 만든 sido_sggu_lists를 for문을 돌면서 각각을 "sido", "sggu" 변수에 저장함.
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]
    
    # 위에서 만든 params라는 dict에 {'sidoCd':sido}, {'sgguCd':sggu} 와 같은 쌍을 추가함. 
    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)  # 만든 parameter를 넣어서 api를 호출함.
    print (response.text)  # 결과 출력

(위 코드가 이해 되셨다면 아래 level2로 넘어가주세요.)

 

     5. Lv2: xml -> df

# level 2 (결과 xml형태를 dataframe 형태로 바꾸기.)
for sido_sggu_list in sido_sggu_lists:
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]

    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)
    # 아래 부분 코드 추가 됨.
    df = pd.read_xml(response.content, xpath=".//item")
print(df)  # 다섯개 다 가져오긴 하는데 제일 마지막 df만 출력해볼게요!

 xml 파싱 방법은 다양한데 제일 간단한 pd.read_xml을 써보았어요. 

(위 코드가 이해 되셨다면 아래 level3로 넘어가주세요.)

 

     6. Lv3: df -> db

# level 3 (df to db)
import pymysql  # 추가
import numpy as np  # 추가

for sido_sggu_list in sido_sggu_lists:
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]

    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)
    df = pd.read_xml(response.content, xpath=".//item")
    
    # 아래 부분 코드 추가 됨. (df to db)
    db = pymysql.connect(host='localhost', port=3306, user='root', passwd='0000', db='new_schema', charset='utf8')  # db와 연결
    cursor = db.cursor()  # 커서 설정
    df = df.replace(np.nan, 0)  # dataframe 결측치 0으로 바꿈. 
    db_col_str = '(diagYm, gnlNmCd, gnlNmCdNm, insupTpCd, msupUseAmt, sgguCd, sgguCdNm, sidoCd, sidoCdNm, totUseQty)'  # db 컬럼명.
    for i in range(len(df)):  # 하나의 df에 보험자구분 별로 열이 생김.
        values = tuple(df.iloc[i].to_list())  # df한 줄을 가져와서 튜플로 바꿈. 
        sql = """INSERT INTO DRUG_GNL_AREA {} VALUES {}""".format(db_col_str, values)  # insert 하는 쿼리.
        cursor.execute(sql)  # 실행
        db.commit()  # 커밋
    cursor.close()

db연결 부분 설명은 생략~ 각자 본인 DB 정보를 넣어주시면 됩니다. 

INSERT 할 table의 컬럼에 db_col_str에 적혀있는 컬럼이 있어야 돼요. 

 

 

<전체 코드>

service_key = "${일반 인증키(Decoding)}"

diag_ym = '202201'  # 진료년월
gnl_nm_cd = '488501ATB'  # 성분코드
# [시도코드, 시군구코드] 쌍으로 되어 있는 리스트.
sido_sggu_lists = [['220000','220003'], ['320000', '320100'], ['110000', '110016'], ['110000', '110023'], ['230000', '230006']]

import requests
import pandas as pd


serviceKey = service_key  # 일반 인증키 (Decoding)

# 성분별지역별사용량목록조회
url = 'http://apis.data.go.kr/B551182/msupUserInfoService/getCmpnAreaList'
params = {'serviceKey' : serviceKey,  # 공공데이터포털에서 받은 인증키
         'numOfRows' : '10',  # 한 페이지 결과 수
         'pageNo' : '1',  # 페이지 번호
         'diagYm' : diag_ym,  # 진료년월
         'gnlNmCd' : gnl_nm_cd,  # 성분코드
         'insupTp' : '0',  # 0 =전체, 4=건강보험, 5=의료급여, 7=보훈
         'cpmdPrscTp' : '02'}  # 01 = 조제기준, 02=처방기준
         
# level 1 (다섯번 request하고 결과 출력.)
for sido_sggu_list in sido_sggu_lists:
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]

    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)
    print (response.text)

# level 2 (결과 xml형태를 dataframe 형태로 바꾸기.)
for sido_sggu_list in sido_sggu_lists:
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]

    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)
    # 아래 부분 코드 추가 됨.
    df = pd.read_xml(response.content, xpath=".//item")
print(df)  # 다섯개 다 가져오긴 하는데 제일 마지막 df만 출력해볼게요!


# level 3 (df to db)
import pymysql  # 추가
import numpy as np  # 추가

for sido_sggu_list in sido_sggu_lists:
    sido, sggu = sido_sggu_list[0], sido_sggu_list[1]

    params['sidoCd'] = sido
    params['sgguCd'] = sggu

    response = requests.get(url, params=params)
    df = pd.read_xml(response.content, xpath=".//item")
    
    # 아래 부분 코드 추가 됨. (df to db)
    db = pymysql.connect(host='localhost', port=3306, user='root', passwd='0000', db='new_schema', charset='utf8')  # db와 연결
    cursor = db.cursor()  # 커서 설정
    df = df.replace(np.nan, 0)  # dataframe 결측치 0으로 바꿈. 
    db_col_str = '(diagYm, gnlNmCd, gnlNmCdNm, insupTpCd, msupUseAmt, sgguCd, sgguCdNm, sidoCd, sidoCdNm, totUseQty)'  # db 컬럼명.
    for i in range(len(df)):  # 하나의 df에 보험자구분 별로 열이 생김.
        values = tuple(df.iloc[i].to_list())  # df한 줄을 가져와서 튜플로 바꿈. 
        sql = """INSERT INTO DRUG_GNL_AREA {} VALUES {}""".format(db_col_str, values)  # insert 하는 쿼리.
        cursor.execute(sql)  # 실행
        db.commit()  # 커밋
    cursor.close()

 

-----

번외로 시도, 시군구 코드를 db에서 가져오는 법

addrCd_1: 시도, addrCd: 시군구

위와 같은 db가 있다고 가정하고 진행할게요.

sido_sggu_lists = list()
sido_sggu_sql = "SELECT addrCd_1, addrCd  FROM new_schema.addr_tp_2;"  # addrCd_1: 시도, addrCd: 시군구
db = pymysql.connect(host='localhost', port=3306, user='root', passwd='0000', db='new_schema', charset='utf8')  # # db와 연결
cursor = db.cursor()
cursor.execute(sido_sggu_sql)  # 실행
sido_sggu_cd_tuple = cursor.fetchall()  # fetchall() : 전부 가져오기
cursor.close()

for sido, sggu in sido_sggu_cd_tuple:
    sido_sggu_lists.append([sido, sggu])

 

 

댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
글 보관함