-
[Method] Pandas Excel 파일 불러오기, 데이터 확인 및 전처리AI부트캠프 2020. 12. 28. 18:43
[section1-sprint1]
1. Excel 파일 불러오기 (url 사용)
excel 파일을 열어본 적도 없어서 처음부터 애를 먹었다. Assignment는 excel 파일 형식의 dataset을 불러와서 sheet를 확인하는 것으로 시작되었다. 파일을 열어보니 sheet 이름을 알 수 있긴 했지만, pandas 자체에서 sheet 이름을 불러오는 방법은 없을까?
import pandas as pd
fileUrl = "엑셀 파일 url"
sheet1 = pd.read_excel(fileUrl, sheet_name='sheet_name1')
sheet2 = pd.read_excel(fileUrl, sheet_name='sheet_name2')처음에는 위처럼 파일을 직접 열어 sheet이름을 가져와 read_excel(fileurl, sheet_name="sheetName")으로 여는 방식으로 각 sheet를 dataframe으로 변환했다. 그리고 각 sheet의 이름을 불러오는 명령어를 발견했다.
xl = pd.ExcelFile(fileUrl)
xl.sheet_names # see all sheet names.sheet_names 를 사용하니 sheet이름을 list로 반환하는 것이 확인되었다. sheetNameList에 이것을 저장하여 사용하였다.
#방법1
sheetNameList = xl.sheet_names
sheet1 = pd.read_excel(fileUrl, sheet_name=sheetNameList[0])
sheet2 = pd.read_excel(fileUrl, sheet_name=sheetNameList[1])#방법2
sheetNameList = xl.sheet_names
i = 1
for sheetName in sheetNameList :
exec(f'df{i} = file.parse("{sheetName}")')
i = i+1이렇게 하면 확실히 sheet 별로 dataframe을 만들 수 있다. (sheet개수도 모를 경우 list의 length를 확인하여 그 개수에 맞는 dataframe을 생성하면 될 것 같다.)
사실 처음에 sheet_names 함수가 작동하지 않아 왜 문제인지 몰랐는데, 검색해보니 전체 sheet를 불러오는 명령어는 ExcelFile(), 특정 sheet를 불러오는 명령어는 readExcel() 또는 read_excel() 인 것 같다.
*참고
- exec() : 코드의 한줄을 문자열 또는 코드로 입력받음
- eval() : 변수가 포함된 표현식(함수)을 문자열 형태로 입력받음
- compile() : source(문자열, 바이트열 등)을 코드로 컴파일
2. 데이터 확인
1) dimension 확인
df.ndim
결과값으로 dimension 이 출력된다.
2) 데이터의 결측값 확인
결측값을 확인하는 방법은 여러가지가 있지만, 나는 여기에서 결측값을 모두 0으로 바꾸고, 잘 바뀌었는지 확인하기위해 전체 dataframe에서 결측값이 몇개인지 출력해보았다. (numpy library를 사용한다)
import numpy as np
df= df.replace(np.nan, 0) #또는 df.fillna(0) 사용 가능
df.isnull().sum().sum()df.repalce(np.nan, 바꿀 값) 와 df.isnull().sum().sum()을 사용하여 결측값을 바꾸고, 남은 결측값이 몇개인지 출력해보았다. 결과로 0가 나오니 아마 남은 결측값은 없는 것 같다.
3) 각 데이터의 ROA의 값을 barplot으로 시각화
이건 처음에는 contains를 사용하여 ROA라는 문자열을 포함한 행을 따로 빼내는 방식으로 해결했다.
roa1 = sheet1[sheet1['주요재무정보'].str.contains('ROA')]
이렇게 하면 '주요재무정보'라는 이름을 가진 열에서 ROA라는 문자열을 포함한 행만 빠져나와 roa1에 저장된다. 그런데 이렇게 하고나서 barplot을 그리니 index가 숫자로 되어있어 plot의 x 축이 제대로 설정되지 않았다.
index number인 22가 x축으로 갔다 여기에서 roa1의 index를 바꿔주어도 되지만, 나는 처음에 excel에서 데이터를 받아오는 단계에서 '주요재무정보' 열을 index로 설정하였다.
sheet1 = sheet1.set_index('주요재무정보')
roa1 = sheet1.loc[[('ROA(%)')]].transpose()근데 사실 이렇게 하고 나니 ROA라는 문자열을 포함한 index를 찾는 방법을 모르겠다. 이건 나중에 꼭 알아보자.
어쨌든 .loc[[(' ')]]를 이용하여 roa1에 ROA(%)가 index인 행을 저장하였다. 행과 열을 뒤집어서 barplot을 그렸는데, 그 이유는 가독성을 좀 더 높이기 위함이다.
transpose를 안했을 때 transpose를 했을 때 transpose를 안하면 index가 x 축에 들어가고 transpose를 하면 행 이름이 분기로 설정되기 때문에 index가 x 축에 들어가 훨씬 깔끔하다.
4) 한글 설정하기
지금까지 과정을 그냥 쭉 진행하면 한글이 깨진다. 사진은 한글이 안깨진 버전도 섞어사용하였지만, 폰트 지정 없이 쭉 진행하면 아래와 같은 plot이 나온다.
한글 폰트 설정을 안해주면 한글이 깨진다 이 때 폰트를 다운받고 지정해주는 작업이 필요하다. 우선 갖고있는 폰트부터 확인해보았다.
import matplotlib.font_manager as fm
font_list = [font.name for font in fm.fontManager.ttflist]
font_list한글 폰트가 아무것도 없었다.
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf한글폰트를 설치하고 나면, 꼭 런타임 다시시작을 눌러야한다. (다시시작 전에는 RAM에 저장이 안되고, 하드디스크 상에만 저장되어있기 때문이다. 다시시작을 하고 나면 RAM에 저장사항이 업데이트 되고, 폰트가 사용가능한 상태가 된다.)
import matplotlib.pyplot as plt
import matplotlib as mpl
plt.rc('font', family='NanumGothic')
mpl.rc('axes', unicode_minus=False)
%matplotlib inline #코드를 실행한 바로 아래에 plot을 보여주고 notebook에 저장됨
#여기서부턴 plot 화질을 높이는 부분
from IPython.display import set_matplotlib_formats
set_matplotlib_formats('retina')이렇게 하면 나눔고딕체로 한글이 인식된다. 한글에는 마이너스 부호(-)가 없기 때문에 'mpl.rc('axes', unicode_minus=False)' 이부분을 추가해주면 된다.
'AI부트캠프' 카테고리의 다른 글
[Method] Feature Engineering (2) 2021.01.04 [Method] Data Visualization (2) 2021.01.02 [Method] Data manipulation (1) 2020.12.31 [Concept] Feature Engineering (0) 2020.12.29 [Concept] EDA, Pandas, Types of Data, Markdown (0) 2020.12.28