티스토리 뷰
진료년월, 성분코드 입력 시 전국 데이터 가져오는 코드
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에서 가져오는 법
위와 같은 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])
'pandas' 카테고리의 다른 글
pd.read_xml을 사용해 xml파일을 dataframe으로 바꾸기 (0) | 2023.04.02 |
---|---|
split과 join을 이용해 문자열 자른 뒤 합치기(apply, lambda, axis) (0) | 2022.11.26 |
영업일(bdate_range, is_busday, weekmask) (0) | 2022.07.15 |
pd.to_datetime, strptime, strftime, (0) | 2022.07.15 |
group by 후 custom된 집계함수 사용 (0) | 2022.06.16 |
댓글
- Total
- Today
- Yesterday
공지사항
최근에 올라온 글
글 보관함