반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- recommendation system
- RecSys
- Ai
- Machine Learning
- Python
- Transformer
- YouTube
- regex
- 정규표현식
- ML
- time series
- crossformer
Archives
- Today
- Total
mayreel 님의 블로그
pandas vs Polars 본문
반응형
pandas가 느린 이유
pandas는 numpy와 Mathplotlib 기반으로 이루어진 데이터프레임 라이브러리이다. 하지만 numpy와 연산 속도를 비교했을 때 numpy 기반으로 이루어졌다고 생각하지 못할 정도로 속도 측면에서 차이가 심하게 난다. 그 이유는 다음과 같다.
- Numpy array에 추가적으로 Label, row, columns, index와 그 외의 Metadata가 필요
- Python 작성하여 GIL 발생
- 기본적으로 Single 코어에서 동작
- 태생적으로 느린 코드 한계 (인터프리터 언어)
Polars
Polars
DataFrames for the new era
pola.rs
Polars는 pandas의 느린 연산 속도 문제를 해결하기 위해 만든 데이터프레임 라이브러리로 Apache Arrow 형식을 메모리 모델로 사용하여 Rust로 구현한 OLAP 쿼리 엔진 위에서 작동하는 데이터프레임 인터페이스로 대용량 데이터에 대한 처리 성능이 좋고 메모리 사용 효율성이 좋고 데이터를 불러오는 속도가 빠르다는 장점을 가지고 있다.
Polars의 특징
- 다중 스레드 처리로 인한 빠른 성능
- Polars는 Rust의 멀티스레딩 기능을 활용하여 데이터 처리를 병렬로 수행한다. 이를 통해 대용량의 데이터셋을 빠르게 처리할 수 있다.
- 벡터화 및 칼럼 기반 처리를 통해 캐시 일관성 알고리즘과 현대 프로세서에서의 높은 성능을 보여준다.
- 메모리 효율성
- Polars는 메모리를 효율적으로 사용하도록 설계되어 대용량 데이터셋을 처리할 때 메모리 사용량을 최소화하여 성능을 극대화한다.
- 열 기반 데이터프레임
- Polars는 열 기반 데이터 구조를 사용하여 데이터 접근 및 조작을 최적화하여 특정 열을 대상으로 한 연산이 많은 데이터 분석 작업에 유리하다.
- 쿼리 언어 제공
- Polars는 SQL 스타일의 쿼리 언어를 제공하여 사용자가 쿼리를 통해 데이터를 조작할 수 있다.
- Rust와 Python 지원
- Polars는 Rust를 기반으로 개발되었지만 Python 바인딩을 통해 Python 환경에서도 사용할 수 있다.
- 다양한 데이터 소스 지원
- CSV, Excel, Parquet, JSON, Database, Cloud(AWS S3, Azure Blob, Google Cloud), GCP 등 다양한 형식의 데이터를 읽고 쓸 수 있다.
Polars 성능 비교
polars의 성능을 비교하는 벤치마크는 https://h2oai.github.io/db-benchmark/에서 확인할 수 있다. 벤치마크에 사용된 데이터는 0.5GB, 5GB, 50GB이고 연산을 진행하는 함수는 각각 groupby, join, groupby2014를 사용했다.
해당 사이트에서 주로 사용하는 데이터프레임 라이브러리 pandas, spark에서 실행한 groupby 연산의 결과를 확인해 보면 Polars는 0.5GB에서 Pandas보다 7배, Spark보다 13배 빨랐고, 5GB에서는 pandas보다 6배, Spark보다 3배 이상 빨랐으며, 50GB에서는 spark보다 약 4배 정도 빠르다는 것을 확인할 수 있다.
0.5GB | 5GB | 50GB | |
Polars | 1s | 11s | 143s |
pandas | 7s | 70s | 568s |
spark | 13s | 34s | OOM |
예시 코드
- Polars install
pip install polars
- 데이터 프레임 생성
import polars as pl
# 데이터 프레임 생성
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["New York", "Los Angeles", "Chicago"]})
print(df)
- 데이터 불러오기
# csv
csv_df = pl.read_csv("docs/data/path.csv")
# parquet
pq_df = pl.read_parquet("docs/data/path.parquet")
# json
josn_df = pl.read_json("docs/data/path.json")
# 데이터 파일 여러개 불러오기
mult_df = pl.read_csv("docs/data/my_many_files_*.csv")
- 열 선택 및 필터링
import polars as pl
# 데이터 생성
df = pl.DataFrame({
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"city": ["New York", "Los Angeles", "Chicago"]
})
# 특정 열 선택
selected_columns = df.select(["name", "city"])
print(selected_columns)
# 조건에 따라 데이터 필터링
filtered_df = df.filter(pl.col("age") > 28)
print(filtered_df)
- 열 추가 및 계산
# 새로운 열 추가
df = df.with_columns([
(pl.col("age") + 5).alias("age_in_5_years")
])
print(df)
# 기존 열을 기반으로 계산
df = df.with_columns([
(pl.col("age") * 2).alias("double_age")
])
print(df)
- 그룹화 및 집계
# 그룹화 및 집계
df_grouped = df.groupby("city").agg([
pl.col("age").mean().alias("average_age"),
pl.col("age").max().alias("max_age")
])
- 데이터 저장
# 데이터 프레임을 CSV 파일로 저장
df.write_csv("path_to_output_file.csv")