빠르고유연한데이터처리를위한파이썬라이브러리 Pandas 공개 SW 개발자 Lab 오픈소스프론티어 3 기김영근
pandas 는데이터를쉽고빠르게다양한형식으로가공할수있는풍부한자료구조와함수를제공 하는파이썬라이브러리로, 파이썬을활용한데이터분석에서빠질수없는필수스택중하나다. 최근불고있는코딩열풍과함께데이터로부터인사이트를얻으려는니즈가결합되면서파이썬은 주목받고있으며덩달아 pandas 의인기도치솟고있다. PyData, SciPy 같은과학계산커뮤니티는 물론이고일반인들까지도파이썬과 pandas 를접해보려는시도가크게늘어났다. 이글에서는 pandas 소개및프로젝트의현재상황과앞으로의계획을다룬다. 프로젝트명 Pandas 개요 Flexible and powerful data analysis / manipulation library for Python 특징 직관적인자료구조, BSD License 목표 빠르고유연한데이터처리 기대효과 - 리퍼지토리 https://github.com/pandas-dev/pandas [ 목차 ] 1 pandas 소개 2 pandas 현재 3 pandas 미래
1 pandas 소개 [ 그림 1] http://pandas.pydata.org pandas는헤지펀드에서퀀트로근무하고있던 Wes McKinney가업무에바로사용할수있는적합한도구가없음에답답함을느끼고직접파이썬을배우면서만들기시작한라이브러리다. 본인의전공은수학이었고프로그래밍에익숙하지않았기때문에초창기에는 CS를전공한같은학교친구인 Chang She와함께파이썬을공부하면서코드의많은부분을작성하기시작했으며 2008년부터본격적으로개발이진행되었다. pandas는직관적인자료구조를제공하여실제데이터분석업무과정에서 80% 의시간을차지하는데이터정제를손쉽게할수있도록도와주며간단한통계및시각화를위한기능도내장하고있다. 필요한경우외부라이브러리를이용해서복잡한분석이나좀더디테일한시각화작업을하는것도용이하다. 성능을위해많은부분을 C 또는 Cython으로작성하였으며내부적으로 NumPy를사용하고있는데, NumPy에서제공하는단일데이터타입의 N-차원배열 (ndarray) 에추가로여러가지데이터타입을사용할수있는기능이라던가, 인덱스뿐만아니라이름으로데이터에접근할수있는기능을제공하여데이터를보다쉽게담고확인할수있도록구현되어있다.
이런기능은모두 pandas의기본자료구조인 Series와 DataFrame을통해제공되며빠른처리를위한벡터연산을지원하고 Group-by 연산과 merge, join, concat 같은데이터재성형 (Re-shaping) 편의기능역시제공하고있다. 다양한외부파일포맷 (csv, json, excel, SQL, msgpack, Google Big Query 등 ) 의읽기 / 쓰기를제공하여현실에서만나게되는보편적인파일에담긴데이터를쉽게불러오고또반대로결과를해당포맷으로저장하는것도가능하다. pandas에대해서알아보려면 Series 와 DataFrame, 이두가지자료구조에익숙해질필요가있다. Series는일련의객체를담을수있는 1차원배열같은자료구조다 ( 어떤 NumPy 자료형이라도담을수있다 ). 그리고인덱스에는배열의데이터에연관된이름을가지고있다. 가장간단한 Series 객체는배열로부터생성할수있다. DataFrame은표같은스프레드시트형식의자료구조로여러개의칼럼이있는데, 각칼럼은서로다른종류의값 ( 숫자, 문자열, 불리언등 ) 을담을수있다. DataFrame은로우와칼럼에대한인덱스가있는데, 이 DataFrame은같은인덱스를가지는 Series 객체를담고있는파이썬사전으로생각하면편하다. R의 data.frame 같은다른 DataFrame과비슷한자료구조와비교했을때, DataFrame 에서의로우연산과칼럼연산은거의대칭적으로취급된다. [ 그림 2] pandas 의자료구조
[ 그림 3] pandas 와관련없음 프로젝트의이름인 pandas는 PANel DAta System에서따온것이며팬더와는전혀아무런관련이없다. BSD 라이선스를채택하고있으며 2016년 11월현재, Github에서 7,449개의스타를얻었고포크횟수가 3000을넘겼다. 100개이상의커밋을보낸코어개발자는 11명이지만전체기여자는 640명을넘어섰고, API 문서와튜토리얼을제공하는공식홈페이지 (http://pandas.pydata.org) 는월간순수방문자수가 5만에서 7만에이를정도로인기있는프로젝트다. 버그리포팅및이슈관리는 Github 에서관리하고있으며최근에는프로젝트가커짐에따라기존에 pydata 그룹아래에있던리퍼지토리를 pandas-dev 그룹으로옮겼다. 개발에대한논의는메일링과 Gitter 채널을주로이용하며파이썬개발커뮤니티의특징인스프린트를주기적으로진행하고있다. 스프린트는파이썬컨퍼런스인파이콘의숨은메인행사로, 파이썬프로젝트메인테이너와사용자가함께모여밀린이슈를처리하거나밀도높은협업을통해큰기능을개발하는자리이다. 또한, 스프린트는해당프로젝트에기여하고싶은사용자들에게기여경험을제공해주기위한목적도있는데, 이를통해새로운기여자를발굴하고프로젝트가건강하게유지될수있도록하는연료역할을하고있다. pandas 이슈페이지에서는모든이슈에대해서카테고리와주제뿐만아니라해당이슈의난이도와
소요시간에따라상세한라벨로나눠서관리하고있으며해결하기쉬운이슈는새로운기여자를 위해남겨두고기여경험을할수있도록배려하고있다. [ 그림 4] pandas 프로젝트이슈페이지 2 pandas 현재 pandas는버저닝을보수적으로해왔는데상황에따라조금씩연기되기도하지만기본적으로는 2 개월마다메이저릴리즈를원칙으로하고있으며현재최신버전은 0.19.1이다. 다음릴리즈는 0.20.0이될예정이지만, 1.0 릴리즈에대한논의 (https://github.com/pandas-dev/pandas/issues/10000) 가이미시작되었으며 1.0을기점으로 1.x/2.x 브랜치를나누어유지보수와새버전개발을독립적으로관리하게된다. 현재개발팀은그동안쌓인기술부채를청산하지않으면안될상황이라판단하고있으며 1.x 개발 진행과병행하여기본이자핵심자료구조인 Series 와 DataFrame 내부구조에대한대대적인재설 계를진행하고있다. 현재까지의버전은코드가제멋대로늘어나서 20 만라인을넘어섰다. 함수개수만도 6,000 개에육
박하며새로운데이터타입을추가하기어려운상황이며, 특수한상황을제외하고는여전히단일스레드로동작하며일부코드는 Cython 수준에서 GIL을해제하기도하지만여전히많은부분이 GIL로부터자유롭지도않다. 메모리사용량을예측하기쉽지않은문제와다른시스템과연동이효율적이지않게구성되어있는등, 누적된기술부채로인해칼을들지않으면안되는상황이다. 사실이런상황은많은오픈소스프로젝트에서도발생하는일인데, 어떤프로젝트가좋은아이디어와어느정도쓸만한퀄리티로공개되면서입소문을탄다. 사용자가늘고컨트리뷰터도늘면서프로젝트는호황을누리게되고건강한문화가자리잡으면서원저자가프로젝트에서빠지게되더라도 ( 실제로 Wes를비롯한초기개발자가창업을이유로프로젝트를한동안떠나있었다.) 다른컨트리뷰터들이프로젝트를계속이끌어간다. 프로젝트가점점더인기를얻고더많은개발자와사용자층이생기게되고, 컨티넘애널리틱스같은오픈소스를지원하는회사에서프로젝트전담개발자를투입하여프로젝트를체계적으로돕기시작한다. 여기까지는인기오픈소스프로젝트의성공적인성장스토리처럼들리지만사실그이면에는기술부채가쌓일수밖에없는이유가있다. 기업이오픈소스에개발자를지원하는이유는여러가지가있겠으나자사또는고객이해당프로젝트를사용하고있으면버그수정이나사용자들의요구사항이제때반영되지않아서곤란한상황을방지하기위한이유도있다. 컨티넘애널리틱스의경우자체개발하여오픈소스로공개한훌륭한프로젝트도많이가지고있고 PyData 커뮤니티에우호적인기업으로, 위에서얘기한초기개발자가개인적인이유로프로젝트에시간을거의쓰지못하던시기에 pandas 프로젝트를거의먹여살렸다고할수있을정도로많은이바지를했다. 하지만기술트렌드변화에따라적절한기술적인의사결정을해야하는시기에초기개발자의부재로인해설계의도에대한커뮤니케이션을충분히할수없어서코드가계속낡아가고또, 주로고객들의요구사항에맞춰급하게수정을해야하는기업의오픈소스개발자입장에서는충분한고민을하지못하고코드를추가하다보면알게모르게작은기술부채들이계속쌓이게된다.
[ 그림 5] pandas 와 matplotlib 을이용해서그린 pandas 함수길이분포 실제로 pandas 프로젝트초기시절에 Wes 가강하게지키고자했던철학중하나는함수를작게나 눈다는원칙이었는데현재는덩치가큰함수들이상당수출현하고있다. ( 그래도여전히 6,000 여함 수중에서 50 줄을넘어가는함수는 1% 가되지않는다.) 3 pandas 미래 pandas의코드베이스는작성된지 8년이넘었다. 0.1 버전에서겨우 1만라인에불과했던소스코드는현재 20만라인을넘어섰고기술부채가발목을잡는횟수가눈에띄게늘었다. 이에따라현재브랜치는기능개선보다는버그수정과안정성에만주력하여향후 1.x 버전릴리즈로사용하기로했고새로운 2.0버전을위한설계가진행중이다. pandas를처음개발했을때가장많이어필했던부분은속도이다. Wes 스스로도많은 pandas 관련발표에서기존도구에비해서빠르다는점을강조했으나 2.0에서는더빠르게동작하도록성능개선에많은노력을기울일예정이다. 또한, 멀티코어같은하드웨어자원을효율적으로활용할수있도록하는개선작업과꾸준히문제로제기되었던메모리사용량을예측할수없는문제도개선될예정이다. 이를위해순수파이썬으로구현된 pandas.core 모듈에기능별로 Cython 혹은 C 구현을안고있는 현재상태에서 pandas 2.0 부터는코어기능을 C++ 로작성할 libpandas.so 라이브러리로분리하고
이를파이썬 wrapper 라이브러리로감싸게된다. libpandas는다른파이썬라이브러리개발자들을위한 C/C++ API로제공할계획이며이를통해 pandas의 Series나 DataFrame의내부구조를직접활용할수있게된다. 이렇게되면현재 C 혹은 Cython 레벨의인터페이스를요구하는 scikit-learn 같은다른프로젝트에서도 pandas 객체데이터에쉽게접근할수있게된다. [ 그림 6] pandas 0.x/1.x
[ 그림 7] pandas 2.0 또한, 파이썬커뮤니티의움직임에맞춰파이썬 2 지원을종료하고파이썬 3.5 이상만을지원하려 는논의도진행중이다. 이렇게함으로써 asyncio 와같은파이썬 3 에서만사용가능한기능의이점 을취할수도있을것이다.