머신러닝/파이썬 기본 문법

Data Preprocessing(2)

동동하게 2023. 8. 21. 15:37

이전 포스팅에서는 여러개의 엑셀 파일 중 하나의 파일만 전처리하는 과정을 거쳤습니다.

 

하지만 수집 데이터가 많은 경우 많은 엑셀을 하나하나 진행하기는 시간이 많이 소요될 것입니다.

그럴경우엔, 


1. 1개 파일을 이용해서 샘플링 합니다.
    => 샘플링 시 추출/필요컬럼 추가 등 수행
2. 샘플링이 완료되면, 나머지 파일들을 동일한 방법으로
    수행하면서 통합(행단위 통합)하면 됩니다.

 

 

이런식의 파일명으로 저장되어 있습니다.

 

파일은 201001부터 201908까지입니다.

 

파일명이 20101, 20102가 아닌 201001, 201002 이런식이라서 zfill()옵션을 이용해 줘야 합니다.

for y in range(2010, 2020, 1) :
    for m in range(1, 13, 1) :
        print(y, str(m).zfill(2))

zfill() : 원본데이터의 갯수와 자릿수를 맞춤, 오른쪽부터 맞추는데 없는 자리는 0으로 채워라

-> zfill(2) : 2010 01, 2010 02

-> zfill(3) : 2010 001, 2010 003

 

 

 

 

'create_kto_date' 이름으로 함수를 만들겠습니다.
- 116개(파일수) 함수 통합시키기
### 위 for문과 zfill()함수를 적절하게 사용
### 최종 결과 값을 담을 데이터프레임 변수명 : df
### 데이터프레임 생성 : df = pd.DataFrame()
### - for문 수행시 2019년 9월 파일부터는 파일없음 오류 발생
###   --> 예외처리 적용 try ~~ except : pass

### 프로그래밍 순서
# - for문과 위에서 수행한 코드를 하나의 프로그램으로 처리
# - 하나의 프로그램으로 처리가 완료된 후 공통된 부분은 함수로 분리
# - for문에서 함수 호출 방식으로 프로그램 정리

 

 

● for문과 위에서 수행한 코드를 하나의 프로그램으로 처리

df = pd.DataFrame()

for y in range(2010, 2020, 1) :
    for m in range(1, 13, 1) :
        try :
            
            #파일명 생성하기
            file_nm = str(y) + str(m).zfill(2)
            
            file_nm = "./files/kto_{}.xlsx". format(file_nm)
            kto_201901 = pd.read_excel(file_nm,
                                         header = 1, 
                                         skipfooter = 4,
                                         usecols = "A:G")
            
            ### "기준년월" 칼럼 추가하기
            kto_201901["기준년월"] = str(y) + "-" + str(m).zfill(2)
            
            ### 대륙목록 리스트 만들기
            continents_list = ['아시아주', '미주', '구주', '대양주',
                               '아프리카주', '기타대륙', '교포소계']
           
            ### 대륙이름이 속해 있는 인덱스 위치 찾기
            condition = kto_201901["국적"].isin(continents_list)

            ### 국가 이름만 조회
            kto_201901_country = kto_201901[condition == False]
            
            ### 인덱스 번호 0부터 재설정하기
            kto_201901_country.reset_index()
            # drop : 기존 인덱스 번호를 사용할지 여부
            #      : 디폴트 False -> 기존 인덱스번호를 컬럼으로 사용
            #      : True -> 기존 인덱스번호는 사용안함
            kto_201901_country_newindex = \
                        kto_201901_country.reset_index(drop = True)
            
            ## 리스트 곱하기 연산

            continents = ["아시아"]*25 + ["아메리카"]*5 + ["유럽"]*23 + ["오세아니아"]*3 + ["아프리카"]*2 \
            + ["기타대륙"] + ["교포"]

            ### 대륙 칼럼 추가하기
            kto_201901_country_newindex["대륙"] = continents
            
            
            ### 국가 내에서 관광을 위해 입국하는 비율을 계산하여 컬럼 추가
            # 컬럼명 : "관광객비율(%)"

            kto_201901_country_newindex["관광객비율(%)"] = \
                round(kto_201901_country_newindex["관광"] / \
                    kto_201901_country_newindex["계"] * 100, 1)

            tourist_sum = sum(kto_201901_country_newindex["관광"])

            ### 전체관광객에 대한 국가별 관광 비율
            # 컬럼명 : "전체비율(%)"

            kto_201901_country_newindex["전체비율(%)"] = \
                round(kto_201901_country_newindex["관광"] / tourist_sum * 100, 1)
            
            df = pd.concat([df, kto_201901_country_newindex],  # df 밑으로 계속 누적시키기
                           ignore_index = True)  
        except :
            ### 2019년 9월 파일부터는 없기에 예외 발생
            ### - 패스시키기
            pass
df

 

● 하나의 프로그램으로 처리가 완료된 후 공통된 부분은 함수로 분리

def create_kto_date(yy, mm) :
        file_nm = "./files/kto_{}{}.xlsx". format(yy, mm)
        kto_201901 = pd.read_excel(file_nm,
                                     header = 1, 
                                     skipfooter = 4,
                                     usecols = "A:G")

        ### "기준년월" 칼럼 추가하기
        kto_201901["기준년월"] = "{}-{}".format(yy, mm)

        ### 대륙목록 리스트 만들기
        continents_list = ['아시아주', '미주', '구주', '대양주',
                           '아프리카주', '기타대륙', '교포소계']

        ### 대륙이름이 속해 있는 인덱스 위치 찾기
        condition = kto_201901["국적"].isin(continents_list)

        ### 국가 이름만 조회
        kto_201901_country = kto_201901[condition == False]

        ### 인덱스 번호 0부터 재설정하기
        kto_201901_country.reset_index()
        # drop : 기존 인덱스 번호를 사용할지 여부
        #      : 디폴트 False -> 기존 인덱스번호를 컬럼으로 사용
        #      : True -> 기존 인덱스번호는 사용안함
        kto_201901_country_newindex = \
                    kto_201901_country.reset_index(drop = True)

        ## 리스트 곱하기 연산

        continents = ["아시아"]*25 + ["아메리카"]*5 + ["유럽"]*23 + ["오세아니아"]*3 + ["아프리카"]*2 \
        + ["기타대륙"] + ["교포"]

        ### 대륙 칼럼 추가하기
        kto_201901_country_newindex["대륙"] = continents


        ### 국가 내에서 관광을 위해 입국하는 비율을 계산하여 컬럼 추가
        # 컬럼명 : "관광객비율(%)"

        kto_201901_country_newindex["관광객비율(%)"] = \
            round(kto_201901_country_newindex["관광"] / \
                kto_201901_country_newindex["계"] * 100, 1)

        tourist_sum = sum(kto_201901_country_newindex["관광"])

        ### 전체관광객에 대한 국가별 관광 비율
        # 컬럼명 : "전체비율(%)"

        kto_201901_country_newindex["전체비율(%)"] = \
            round(kto_201901_country_newindex["관광"] / tourist_sum * 100, 1)
        
        return kto_201901_country_newindex

 

● for문에서 함수 호출 방식으로 프로그램 정리

df = pd.DataFrame()

for y in range(2010, 2020, 1) :
    for m in range(1, 13, 1) :
        try :
            temp = create_kto_date(str(y), str(m).zfill(2))
            df = pd.concat([df, temp], ignore_index=True)
        except :
            pass
df

파일 저장하기

df.to_excel("./files/kto_total.xlsx", index = False)

이렇게 저장하면 2010년 01월부터 2019년  08월까지의 데이터가 kto_total.xlsx파일로 저장됩니다.