Pandas 2.0을 맞이합시다!

Pandas 2.0을 맞이합시다!

Pandas 2.0이 개발 마무리에 있습니다.

지난 2023년 2월 21일 화요일에 조용히 Pandas (이하 판다스) 2.0.0 rc0가 공개되었습니다. MS Windows (윈도우즈)의 경우도 RC (release candidated) 버전은 거의 수정이 없고, 안정화를 단단히 한 후에 정식버전을 출시하니 곧 판다스도 멋진 2.0..0 정식버전이 공개되겠지요?

데이터 분석을 공부해 보신 분이라면 당연히 판다스를 들어보셨거나 학습을 해보셨을 것입니다. 1.5.3에서 2.0.0으로 변경된다는 것은 주 (major) 버전이 바뀐다는 뜻이며, 기존 버전과 호환되지 않게 API가 바뀌니 내부적으로 큰 차이가 있을 것으로 예상됩니다 (유의적 버전 참조). 앞으로 공개될 판다스의 핵심 기능은 무엇이고 이것이 의미하는 것이 무엇인지 한번 알아보겠습니다.


왜 판다스인가?


판다스는 파이썬 프로그래밍 언어를 기반으로 구축된 빠르고 강력하며 유연하고 사용하기 쉬운 오픈 소스 데이터 분석 및 조작 도구입니다 (판다스 공식 홈페이지). 실제로 파이썬으로 데이터 분석을 공부하기 위해 우선 파이썬을 배우고, 자연스레 n 차원 배열 및 행렬 작업에 유용한 기능을 제공하는 NumPy (Numerical Python)을 접하면서 과학적 컴퓨팅을 배웁니다. NumPy로 수학 연산의 벡터화를 통해 성능 및 실행 속도 향상을 통해 최적화 방법을 사용할 수는 있지만, 좀더 편한 방식으로 데이터를 다루기 위한 요구 사항이 있어 왔습니다. 또한, R 분야에서 유명한 해들리 위컴 (Hadley Wickham)은 Tidy Data라는 논문을 통해서 “분석하기 좋은 형태의 데이터”에 대한 이론을 설명하였습니다. 24페이지의 논문을 통해서 이야기하고자 하는 내용을 1줄로 표현하자면 “데이터를 행과 열로 이루어진 표 (테이블) 형태로 준비하는 것”입니다. 이런 형태로 데이터를 다룰 수 있도록 우리가 오랫동안 사용해 온 애플리케이션이 MS Excel (엑셀)입니다.

그러나, 현실은 만만치 않습니다. 강의 및 서적의 데이터들은 정말 잘 실행되도록 준비가 되어 있지만, 현실에서 접하는 데이터는 연구 목적에 맞는 데이터가 부족하거나 지저분 하기도 합니다. 엑셀로도 데이터 정제 작업 (Data Clean)을 할 수는 있지만 마우스 클릭 및 메뉴로 해결하기에는 다소 부족합니다. 파이썬으로 쉽게 데이터 전처리 작업을 하기 위해 데이터를 테이블 형태로 다루는 판다스 데이터 정제 및 처리에 많은 역할을 해왔으며 인기 있는 파이썬 라이브러리 중에 하나입니다. 코드 방식으로 사용하는 것이 다소 어려워서 dtale이나 PyGWalker와 같은 GUI 방식으로 판다스를 다루는 방법도 개발되고 있습니다.


판다스가 가진 한계

이런 판다스도 현재 버전 (1.5.3)에서는 여전히 풀리지 않는 문제를 가지고 있습니다. 알고리즘 및 로컬 메모리 제약으로 인해 빅데이터와 관련하여 고유한 한계가 있습니다. 일반적으로 100MB에서 최대 1GB정도인 데이터는 매우 효율적이며 성능에 거의 문제가 되지 않지만, 그 이상의 데이터의 경우 성능이 낮고 실행 시간이 길어 궁극적으로 메모리 사용량이 충분하지 않습니다. 다중 처리 (multi processing)를 지원하지 않기에 큰 데이터셋을 처리하기에는 제한이 있습니다.

그래서 그동안 dask, ray, modin, vaex, polars 등의 다양한 시도들이 있어왔습니다. 하지만, 이런 시도들은 판다스의 기본 자료구조인 데이터프레임이 가진 기본 한계를 극복하고자 하는 임시 방편적인 해결 방안이었을 뿐 판다스 엔진에서 개선이 필요했습니다.

💡
AI 프로젝트를 위한 슈퍼브 플랫폼 데모 체험하기

판다스 2.0의 개선점


-pyarrow 지원
그래서 판다스 2.0에서는 내부 엔진에 pyarrow를 지원하기로 했습니다. Pyarrow는 in-memory 분석을 위해 만들어진 Apache Arrow 를 파이썬으로 사용할 수 있도록 만들어진 파이썬 라이브러리입니다. pyarrow를 사용해서 병렬로 읽고 처리하기 쉽게 데이터를 구성하는 방법인 열 형식 메모리 형식을 다룰 수 있습니다.

그럼 Apache Arrow는 무엇일까요? Apache Arrow는 CPU 및 GPU와 같은 최신 하드웨어에서 효율적인 분석 작업을 위해 구성된 플랫 (flat) 및 계층적 데이터에 대한 언어 독립적 열 형식 메모리 형식을 정의합니다. Arrow 메모리 형식은 또한 직렬화 오버헤드 없이 초고속 데이터 접근을 위해 무복사 읽기를 지원합니다.

Arrow 이전에는 애플리케이션이나 라이브러리 간에 데이터를 교환하는 표준 방법은 어떤 방식으로든 데이터를 디스크에 저장하는 것이었습니다. 따라서 .NET Core 라이브러리가 데이터 분석을 위해 데이터를 파이썬으로 전달하려는 경우 누군가가 파일(예: csv, json, Parquet 등)을 작성한 다음 파이썬으로 다시 불러들여야 합니다. 쓰기(직렬화) 및 읽기(역직렬화) 두 단계 모두 비용이 많이 들고 느리며 데이터셋이 클수록 각 단계를 완료하는 데 더 오래 걸립니다.

전통적으로 데이터는 행 단위 방식으로 디스크에 저장됩니다. 열 기반 저장은 대규모 데이터셋을 분석하고 효율적으로 집계해야 하는 필요성이 대두되면서 탄생했습니다. 데이터 분석의 경우 고객의 각각의 데이터, 관찰한 데이터를 이루는 각 행보다는 고객이 지출한 총 금액, 관찰 데이터에서의 특이점 등의 데이터 집계에 관심을 가집니다.

이 때, Arrow는 Parquet이라는 데이터 형식을 사용합니다. Apache Parquet는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스 열 기반 데이터 파일 형식입니다. 복잡한 데이터를 대량으로 처리하기 위해 향상된 성능과 함께 효율적인 데이터 압축 및 인코딩 체계를 제공합니다.

Parquet는 두 가지 큰 장점이 있습니다.

  • 높은 압축성: .json 또는 .csv 파일은 기본적으로 압축되지 않은 반면 Parquet은 데이터를 압축하므로 디스크 공간을 많이 절약합니다.
    테이블에는 일반적으로 고유 값이 많은 열(높은 카디널리티, 고유한 사용자 ID)과 고유 값이 적은 열(낮은 카디널리티, 국가)이
    혼합되어 있습니다. 카디널리티가 낮을수록 더 나은 압축이 작동합니다.
  • 파일 쿼리/필터 pushdown: 불필요한 데이터를 읽기 전에 제거합니다. 이렇게 하면 로딩 시간이 단축되고 리소스 소비가
    최적화됩니다. 1000개의 열이 있는 테이블에서 두 개의 열만 필요한 경우 두 속성을 얻기 위해 모든 행을 스캔할 필요가 없습니다.
    열 전체를 직접 가져옵니다.
열 형식 저장 개념 (출처: https://arrow.apache.org/overview/)



정리하자면, 판다스 2.0은 내부엔진에서 pyarrow를 사용하여 대규모 데이터셋으로 작업을 할 때, 더 빠르고 메모리 효율적인 데이터 작업을 수행할 수 있습니다.

Copy-on-Write 최적화


대규모 데이터셋으로 작업할 때 성능을 개선하고 메모리 사용량을 줄이기 위해 판다스에서 사용하는 메모리 최적화 기법입니다. 데이터프레임이나 시리즈와 같은 판다스 객체의 복사본을 만들 때 데이터의 새 복사본을 즉시 만드는 대신 원본 데이터에 대한 참조를 생성하고 데이터를 수정할 때까지 새 복사본 생성을 연기한다는 개념입니다. 동일한 데이터의 복사본이 여러개 있는 경우 하나를 변경할 때까지 모두 동일한 메모리를 참조합니다. 이렇게 하면 불필요한 데이터 복사본을 만들 필요가 없기 때문에 메모리 사용량을 크게 줄이고 성능을 개선할 수 있습니다.

마무리하며…

앞으로 공식으로 공개될 판다스 2.0에서 개선될 기능 2개를 알아보았습니다. 대규모 데이터셋을 다루는데 있어서 판다스의 효율성이 굉장히 기대가 됩니다. 개선된 내부엔진으로 앞으로 더 쉽고 빠르게 데이터 분석을 할 수 있기를 기대합니다. 앞으로 저도 계속 주시하며 좋은 예제를 제공해 드릴 예정입니다.






기술을 좋아하고 기술을 배우고 기술을 알리고 싶습니다



* 슈퍼브 블로그의 외부 기고 콘텐츠는 외부 전문가가 작성한 글로 운영 가이드라인에 따라 작성됩니다. 슈퍼브 블로그에서는 독자분들이 AI에 대한 소식을 더 쉽고 간편하게 이해하실 수 있도록 유용한 팁과 정보를 제공하고 있습니다.