Data Preprocessing(2)
이전 포스팅에서는 여러개의 엑셀 파일 중 하나의 파일만 전처리하는 과정을 거쳤습니다.
하지만 수집 데이터가 많은 경우 많은 엑셀을 하나하나 진행하기는 시간이 많이 소요될 것입니다.
그럴경우엔,
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파일로 저장됩니다.