KB 부동산 월간 시계열의 매매 종합 시트에는 각 시군구별 매매 지수 데이터가 포함되어 있습니다. 데이터를 분석하려면 먼저 파이썬 판다스로 불러와야 합니다. 오늘은 데이터를 불러와서 분석하기 좋게 칼럼 및 인덱스 정리하는 내용을 기록하겠습니다.
코드
아래 코드에서 path는 본인이 저장한 엑셀 파일 경로를 지정해줍니다.
#---------xlwings모듈 활용하여 엑셀 데이터 가져와서 데이터프레임으로 저장--------#
import pandas as pd
import xlwings as xw
path = '엑셀 파일 경로 지정'
wb = xw.Book(path)
sheet = wb.sheets['1.매매종합']
row_num = sheet.range(1,1).end('down').end('down').end('down').row
data_range = 'A2:GE' + str(row_num)
raw_data = sheet[data_range].options(pd.DataFrame, index=False, header=True).value
#---------small_col, big_col 리스트 완성하기--------#
bignames = '서울 대구 부산 대전 광주 인천 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주도 6개광역시 5개광역시 수도권 기타지방 구분 전국'
bigname_list = bignames.split(' ')
big_col = list(raw_data.columns)
small_col = list(raw_data.iloc[0])
for num, gu_data in enumerate(small_col):
if gu_data == None:
small_col[num] = big_col[num]
check = num
while True:
if big_col[check] in bigname_list:
big_col[num] = big_col[check]
break
else:
check = check - 1
#---------small_col, big_col 예외 부분 수정하기--------#
big_col[129] = '경기'
big_col[130] = '경기'
small_col[185] = '서귀포'
#---------새로운 컬럼 입력하기--------#
raw_data.columns = [big_col, small_col]
new_col_data = raw_data.drop([0,1])
#---------인덱스를 위한 날짜 리스트 만들기--------#
index_list = list(new_col_data['구분']['구분'])
new_index = []
for num, raw_index in enumerate(index_list):
temp = str(raw_index).split('.')
if int(temp[0]) > 12 :
if len(temp[0]) == 2:
new_index.append('19' + temp[0] + '.' + temp[1])
else:
new_index.append(temp[0] + '.' + temp[1])
else:
new_index.append(new_index[num-1].split('.')[0] + '.' + temp[0])
#---------만들어진 날짜 리스트를 인덱스로 설정--------#
new_col_data.set_index(pd.to_datetime(new_index), inplace=True)
cleaned_data = new_col_data.drop(('구분', '구분'), axis=1)
cleaned_data
결과
코드 해설
판다스 모듈을 불러와서 pd라고 별명을 붙여주었습니다. 엑셀 파일의 시트들이 잠금으로 보호되어 있는 경우를 대비하기 위해서 xlwings라는 모듈도 불러와서 xw라고 별명을 붙여주었습니다. xlwings는 접근하고 싶은 엑셀 파일의 경로와 파일명을 Book 함수에 넣어주어야 합니다. 엑셀 파일 연결 후 시트를 골라 sheet라는 변수에 넣어주어야 합니다. 다음은 데이터의 범위를 설정해줍니다. 원하는 범위의 엑셀 데이터를 판다스 데이터 프레임으로 저장해 줍니다. 인덱스를 따로 정하지 않고 0,1,2,3과 같이 번호로 설정하고 맨 위의 행을 칼럼으로 설정하기 위해서 index=False, header=True라는 옵션을 설정합니다. 데이터 프레임으로 불러오긴 했지만 칼럼 및 인덱스 정리가 필요합니다.
import pandas as pd
import xlwings as xw
path = '본인의 저장 경로 입력'
wb = xw.Book(path)
sheet = wb.sheets['1.매매종합']
row_num = sheet.range(1,1).end('down').end('down').end('down').row
data_range = 'A2:GE' + str(row_num)
raw_data = sheet[data_range].options(pd.DataFrame, index=False, header=True).value
big_col에는 시도 리스트가 들어 있고, small_col에는 시군구 리스트가 들어 있습니다. 하지만 중간 중간에 비어있는 값들이 들어가 있습니다. 먼저 small_col은 None이 있는 자리에 대응하는 big_col의 값을 가져와서 넣어 줍니다. enumerate라는 명령어는 for 문을 실행할 때 리스트의 순번을 함께 제공해 주는 명령어입니다. 시군구에 저장된 데이터가 small_col의 몇 번째 데이터인지 순번을 num에 반환합니다. 다음으로 시도 데이터 리스트인 big_col 리스트를 정리하는 방법입니다. bigname_list를 만들고 big_col을 반복하면서 각 원소가 이 리스트에 포함돼 있는지 검사 후 포함돼 있으면 넘어가고 포함돼 있지 않으면 이전으로 가서 포함된 이름을 찾아오게 합니다.
bignames = '서울 대구 부산 대전 광주 인천 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주도 6개광역시 5개광역시 수도권 기타지방 구분 전국'
bigname_list = bignames.split(' ')
big_col = list(raw_data.columns)
small_col = list(raw_data.iloc[0])
for num, gu_data in enumerate(small_col):
if gu_data == None:
small_col[num] = big_col[num]
check = num
while True:
if big_col[check] in bigname_list:
big_col[num] = big_col[check]
break
else:
check = check - 1
경기도 광주와 광주시의 이름이 같아서 잘못 들어간 부분과 제주도는 직접 수정이 필요합니다. 이렇게 만들어진 리스트를 rowdata의 칼럼으로 입력합니다. 2개의 계층으로 칼럼을 만들어야 하므로 리스트 안에 두 개의 리스트를 입력해줍니다. 그리고 필요 없어진 처음 0, 1번째 행을 drop 함수를 이용해서 제거하고 new_col_data 변수에 저장합니다.
big_col[129] = '경기'
big_col[130] = '경기'
small_col[185] = '서귀포'
raw_data.columns = [big_col, small_col]
new_col_data = raw_data.drop([0,1])
구분이라는 이름으로 정의된 날짜 열의 값을 datetime 형태로 바꿔주고 인덱스로 설정 하겠습니다. for문을 반복하면서 각 원소를 문자열로 바꾸고 '.'을 기준으로 나누고 ['86', '1'] 또는 ['2']와 같은 형태로 temp 변수에 저장합니다. temp [0]이 12보다 작으면 월만 있는 데이터이므로 temp [0] 앞에 그 앞에서 저장된 데이터 연도를 가져다 붙여줍니다. 결과적으로 new_index 리스트에는 ['1986.1', '1986.2',... '2019.1']과 같은 형식의 데이터가 저장됩니다.
index_list = list(new_col_data['구분']['구분'])
new_index = []
for num, raw_index in enumerate(index_list):
temp = str(raw_index).split('.')
if int(temp[0]) > 12 :
if len(temp[0]) == 2:
new_index.append('19' + temp[0] + '.' + temp[1])
else:
new_index.append(temp[0] + '.' + temp[1])
else:
new_index.append(new_index[num-1].split('.')[0] + '.' + temp[0])
새로 만든 new_index를 인덱스로 설정하고, 필요 없어진 '구분' 칼럼을 삭제합니다.
new_col_data.set_index(pd.to_datetime(new_index), inplace=True)
cleaned_data = new_col_data.drop(('구분', '구분'), axis=1)
정리 소감
데이터 분석을 효율적으로 하기 위해서는 데이터가 잘 정제되어 있어야 합니다. 현업에서 주어지는 데이터들은 잘 정리되어 있지 않아서 정리를 해주어야 하는 경우가 많습니다. 이번 경우에도 KB부동산 월간 시계열의 매매 종합 데이터를 파이썬 판다스로 불러와서 열 제목과 인덱스를 정리해주었는데 쉽지는 않았습니다. 하지만 KB 월간 시계열의 여러 데이터는 같은 지역에 날짜만 추가되기 때문에 본 코드를 함수화 하여 다른 시트의 데이터들에도 적용하면 효율적일 것 같습니다. 이렇게 정리된 데이터를 추가적으로 분석하고 시각화하는 내용도 추후 포스팅하도록 하겠습니다.
'데이터 분석 및 업무 자동화' 카테고리의 다른 글
Power BI DAX VALUES 함수 정리 (0) | 2022.03.24 |
---|---|
Power BI 필터 컨텍스트와 행 컨텍스트 살펴보기 (0) | 2022.03.22 |
KB부동산 매수우위지수와 매매증감률 파워비아이 상관관계 분석 (0) | 2022.03.19 |
Power BI 시간 인텔리전스 사용을 위한 날짜 테이블 만들기 (CALENDAR, CALENDARAUTO) (0) | 2022.03.18 |
MySQL 테이블 합치는 방법 살펴보기 (JOIN) (0) | 2022.03.17 |
댓글