여러분은 파이썬의 pandas를 사용하면서 느끼는 가장 아쉬운 점은 무엇인가요?
물론, Anaconda / Jupyter Notebook 환경을 포함하는 부분입니다.
import pandas as pd
제 경우는 가장 불편한 점은, DataFrame이 커지면 커질 수록 데이터를 가시적으로 파악하기 어렵다는 것 입니다.
df.head()
head() 명령를 이용해서 첫 몇개의 행(rows)를 확인할 수 있지만, 경우에 따라서는 전체를 파악해야 하는 경우가 있습니다. 대표적인 경우가 value_counts() , unique() 등의 결과를 확인해야 하는데, 그 결과같이 너무 큰 경우들 입니다.
df['a'].value_counts()
value_counts() 결과는 각각 value별 갯수를 보기 위함인데, 데이터가 너무 크기 때문에 value 값들의 종류 수 자체가 많은 경우도 존재하기 때문입니다. 특이점 이나 이상치 등을 확인 할 때, 가시적으로 데이터를 확인할 필요가 있습니다.
파이참(Pycharm) 또는 Visual Studio Code (vscode) 등 IDE에서는 변수값 탐색 (Variables Explorer) 기능을 제공합니다. 그러나, 변수 탐색 속도가 느리거나, 다수의 배열로 이루어진 변수의 경우에는 값을 확인할 수 없습니다. (array of Series / DataFrame) vscode Extention 기능의 버그로 인한여, 이러한 값들을 확인 조차 되지 않습니다.
Python 데이터 분석의 최대 장정은 REPL 형태로, 단계 단계의 변수값들을 확인 할 수 있어서, 데이터 분석의 흐름을 이어 갈 수 있는 점이라고 생각 합니다. 따라서 매우 빠른 속도로 데이터를 이해하고 분석 할 수 있는 장점이 있지요. 그런데, 이와 같은 장점이 Data Size가 커지고, 데이터 중첩된 차원 (Dimesion)이 커지면 커질 수록 그 효과를 상실합니다. 그 이유중에 하나는 데이터가 커지면 REPL의 효과가 감소하고, 바로바로 변수값 확인이 되지 않기 때문입니다. 이 때문에 데이터를 직접 보지는 못하고, 이 것을 대표하는 통계적 대표값들도 대신하게 됩니다.
그러나, Bigdata 시대에 이러한 대표값들 조차 커지게 되는 경우가 있습니다. 그러면 어떻게 하나요? 대표값의 대표값을 확인하고, 데이터의 형태를 머리로 그리게 됩니다. 이러한 과정에서 미처 생각하지 못하는 특이점/이상치가 발생하면, 그 때문데 데이터 분석가의 고생 시작입니다.
따라서, 필자는 대표값 값은 1차 파생된 데이터들은 크기가 크더라도 왠만하면 직접 확인을 하고 넘어 갑니다. 이 때 변수값들을 직접 출력해서 봐야하는 경우가 발생합니다. 데이터가 크기 때문에 Variable Explorer 또는 variable Viewer 등으로는 해결이 되지 않습니다. 데이터 분석하는데에도 메모리가 부족한데, 변수 확인으로 메모리를 낭비하면 더이상 손댈 수 없을 만큼 느려지기도 합니다. Python Kernel을 다시 시작해야하는 경우가 발생합니다.
Pandas DataFrame을 생성할 때, Excel 또는 csv (Comma Seperated Values)로 부터 데이터를 읽어 들이는 모듈은 Pandas에 기본 탑재되어 자주 사용되는 기능입니다. 사실 대부분의 현실 데이터는 csv로 저장해서 읽어 들이는 경우가 많습니다. 빅데이터를 처리할 때 조차, 종종 Bigdata Framework에서 csv 파일로 만들어 연동하는 경우도 있습니다.
df = pd.read_csv('a.csv')
그러나, Python / Pandas로 한번 로딩을 하게 되면, in-memory 로만 처리하려는 경향이 있습니다. 저 또한 왠만하면 Python IDE / Jupyter Notebook 환경에서 처리하려는 경향이 있습니다. 그러나, iPython / Jupyter Notebook 그리고 시각화 모듈인 seaborn, bokeh 등의 모듈이 잘 되어 있을 지라도, excel data sheet로 만들어서 직접적으로 눈으로 확인하는 것보다 정확하지는 않습니다.
따라서, 필자는 Python에서 처리하다가 발생하는 변수값들을 종종 Excel로 만들어서 데이터값을 Unit 단위로 확인한곤 합니다. 데이터가 크기 때문에 필요한 단위 단위를 세그먼트로 나누어서 확인은 합니다. 따라서, 이 때 사용하는 variable Viewer 기능을 Excel로 대체합니다. 여기서 세그먼트라고 하는 것은 구체적으로 Groupby 입니다. 이 때문에 Groupby의 결과는 CSV파일로 표현이 안됩니다. (필드값 중복 쓰기를 하면 표현이 가능하긴 합니다..) 또한, 세그먼트 단위로 나누어서 반복적으로 여러개의 파일을 생성해야 하기 때문에, CSV는 적합하지 않습니다.
따라서, 세그먼트 단위로 나눈 변수 값들의 결과를 엑셀(Excel)의 시트 (Sheet) 단위로 만들어서 사용합니다. 이게 은근 Unit Test 및 정합성 들을 중간중간에 확인하는데 매우 도움이 됩니다. DataFrame의 현재 변수 상태를 확인하는데 편리합니다. 또한, Varables Exploer / Variables Viewer 기능보다 오히려 빠릅니다.
즉, 필자가 데이터 분석을 진행 할 때는, Python (Pandas x Jupyter) 와 Excel을 동시에 열어두고 사용합니다. Excel을 마치 변수값 탐색용으로 사용하는 것이죠. 이렇게 하면, 변수 내용을 바로바로 시각적으로 확인 할 수 있기 때문에, 오류 검증 및 인사이트 확보에 매우 편리함을 느낄 수 있다.
기본 구문은 다음과 같습니다.
import pandas as pd
df = pd.DataFrame([ ..... ])
... 중략 ...
excelWriter = pd.ExcelWriter('a.xlsx')
df.to_excel(excelWriter, sheet_name='sheet_01')
to_excel() 함수는 pandas에 포함되어 있지만, to_excel의 첫번째 인자인 excel engine이 필요합니다. 최근에는 excel엔진이 탑재되어 있는 환경이 많이 있지만, 설치되지 않는 환경도 다수 존재합니다. excel engine (ExcelWriter)는 파일처리의 한 종류라고 볼 수 있는 io 입니다. ( Descripter)
따라서, 우선 ExcelWriter는 아래와 같이 설치해 줍니다.
$ pip install xlsxwriter
xlsxwriter 엔진은 파일과 유사하게 동작한다고 앞서 이야기 했습니다. 따라서, 파일을 오픈해 주었으면 닫아 주어야 합니다. 따라서 대부분 유저들이 close()를 사용하는데 있어서, with 문장을 사용합니다. with를 사용한 ExcelWriter의 예 입니다.
with ExcelWriter('a.xlsx') as writer:
df.to_excel(writer, sheet_name='sheet_001')
with 문장을 사용하지 않은 경우 입니다. 아래는 excel engine 자체를 명시하는 경우를 포함하였습니다.
writer = pd.ExcelWriter('grouped_002.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='sheet1')
writer.save()
writer.close()
실제 사용하는 사례를 한 번 보겠습니다. 입력데이터가 빅데이터 인 경우입니다. 필자의 경우는 입력 처리 데이터가 테라바이트 단위에서, groupby로 세그먼트를 나누었으며, 각 세그먼트별 특성을 탐색/분석해야 하는 경우 였습니다. 별개의 세그먼트가 존재하는지, 어떤 Value들로 구성이 되어 있는지, 데이터 타입이 무엇인지..? 예외는 있는지 없는지도 모르는 상태였죠.
이런 경우, 단순 Groupby의 count() 연산만 하여도 세그먼트의 수가 만개단위를 초과 합니다. 이 경우, 세그먼트의 결과값을 다시 축약하여 대표값으로 분석해야 하는데, 이런데서 오류가 많이 발생합니다. 누락되는 예외처리도 발생합니다. 따라서, 세그먼트 별로 나누어서 직접적으로 쓱~ 한번 데이터를 살펴봐야 할 경우 입니다.
필자의 경우는, 이러한 경우가 자주 있기 때문에 모듈로 만들어서, 바로바로 사용합니다. DataFrame To Excel 모듈에 대해서는 이 후 연재를 진행하겠습니다.
2020/05/09 - [개발 이야기] - 파이썬 문법 5분만에 읽히기 - 파이썬 기본 문법 요약/정리 8 가지
2020/05/09 - [개발 이야기] - 온라인 IDE - 개발 환경 구축 없어 어디서나 웹브라우저로 개발하기
2020/04/30 - [개발 이야기] - 코딩시험 대비 - 웹 IDE(구름IDE)로 개발(Coding)환경을 구축해 보자.
2020/04/22 - [IT 이야기/IT 상식] - Python 환경 1분만에 구성하기 - 크롬 브라우저 플러그인
2020/03/10 - [개발 이야기/Python] - [Python] 파일 해쉬 (hash) 및 Strings 기능
2020/03/10 - [개발 이야기/Python] - [Python] 딕셔너리를 데이터 프레임으로 (Dict to DataFrame)
2020/03/10 - [개발 이야기] - RESTful API with Flask
2020/03/10 - [IT 이야기] - Python/Anaconda x Jupyter x VSCode 개발환경
2020/03/10 - [IT 이야기] - Python x Jupyter Notebook 사용하기
2020/03/10 - [개발 이야기] - Elasticsearch x Python - 엘리스틱 서치 연동
2020/03/09 - [개발 이야기/Python] - Python Numpy 추천 문서 및 유의점
2018/03/03 - [개발 이야기/Python] - 피보나치(Fibonacci) 수열을 구현하는 7가지 방법 - 파이썬(Python) 피보나치 구현 7선
2018/03/03 - [개발 이야기/Python] - [Python] Py2Exe - Python 스크립트를 Exe로 배포하자 !!
Play Store 업데이트 후 signing (SHA-1) (1) | 2020.03.11 |
---|---|
엘라스틱서치(ES) 인덱스 리스팅 / 타입 리스팅 (0) | 2020.03.10 |
curl 사용법 (0) | 2020.03.10 |
맥북(MacBook), 엘라스틱서치(elasticsearch) 설치 하기 (0) | 2020.03.10 |
Win 10 USB 복구용 부팅 디스크를 만들어 보자 - Win 10 PE 만들기 (4) | 2020.03.10 |
댓글 영역