ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬을 활용한 엑셀 데이터 정제 - KB 가격지수 데이터 기반
    Develope/Python 2019. 5. 24. 11:36
    import pandas as pd
    import xlwings as xw
    
    def KBpriceindex_preprocessing(path, data_type):
        # path : KB 데이터 엑셀 파일의 디렉토리 (문자열)
        # data_type : '매매종합', '매매APT', '매매연립', '매매단독', '전세종합', '전세APT', '전세연립', '전세단독' 중 하나
    
        # xlwings 모듈로 엑셀 읽기
        wb = xw.Book(path)
        # sheet 선택
        sheet = wb.sheets[data_type]
        # 시트 행의 개수 계산
        row_num = sheet.range(1,1).end('down').end('down').end('down').row
        # 읽어올 데이터 범위 설정(엑셀 열+행)
        data_range = 'A2:GE' + str(row_num)
        # options 함수로 pandas 데이터프레임에 쓰기
        raw_data = sheet[data_range].options(pd.DataFrame, index=False, header=True).value
    
        big_names = '서울 대구 부산 대전 광주 인천 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주도 6개광역시 5개광역시 수도권 기타지방 구분 전국'
        bigname_list = big_names.split(' ')
    
        # 컬럼 값을 리스트로 저장
        big_col = list(raw_data.columns)
        # 0번째 데이터를 컬럼 값으로 리스트 저장
        small_col = list(raw_data.iloc[0])
    
        # small_col 리스트의 값이 None 일 경우, big_col의 같은 열 값을 저장
        for num, gu_data in enumerate(small_col):
            if gu_data == None:
                small_col[num] = big_col[num]
    
            check = num
            # big_col 부분 저장 알고리즘
            while True:
                # bigname_list 를 확인 후, 해당 데이터를 기반으로 big_col을 이전의 컬럼 값으로 저장
                if big_col[check] in bigname_list:
                    big_col[num] = big_col[check]
                    break
                else:
                    check = check - 1
        # 경기도 광주와 광주시의 이름이 같아서 잘못 들어간 부분 하드 코딩
        big_col[129] = '경기'
        big_col[130] = '경기'
        # 원 데이터의 형식이 달라 직접 하드코딩
        small_col[185] = '서귀포'
    
        # 정제한 컬럼 값들을 raw_data의 컬럼으로 직접 저장
        raw_data.columns = [big_col, small_col]
        # drop 함수는 리스트로 지우고 싶은 행의 이름들을 넣어주면 해당 행들을 제거한 새로운 데이터프레임을 생성함
        # 0,1 행을 drop 함수를 이용해 제거하고 결과를 new_col_data 변수에 저장
        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])
    
        # set_index 함수를 이용해서 인덱스 설정
        new_col_data.set_index(pd.to_datetime(new_index), inplace=True)
        # 필요 없어진 구분컬럼 삭제
        cleaned_data = new_col_data.drop(('구분','구분'), axis=1)
        
        return cleaned_data
    
    # 엑셀 파일 경로
    path = r'C:\Users\scent2d\Desktop\data\201904.xls'
    # 매매종합 시트 분석
    data_type = '매매종합'
    new_data = KBpriceindex_preprocessing(path, data_type)
    
    print(new_data)

    댓글

Designed by Tistory.