Polars vs Pandas 2026๋…„ ๋น„๊ต: ์„ฑ๋Šฅ, ๋ฌธ๋ฒ•, ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘ ๋Œ€๋น„

2026๋…„ Polars์™€ Pandas์˜ ์ƒ์„ธ ๋น„๊ต ๋ถ„์„์ž…๋‹ˆ๋‹ค. ๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ, ๋ฌธ๋ฒ• ์ฐจ์ด, ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ๊ณผ ๋ชจ๋ฒ” ๋‹ต๋ณ€์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Polars vs Pandas 2026๋…„ ๋น„๊ต

Polars๋Š” Python ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ ๊ณ ์„ฑ๋Šฅ ๋Œ€์•ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋น ๋ฅด๊ฒŒ ์ž๋ฆฌ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—์„œ Pandas ๋Œ€๋น„ 10~15๋ฐฐ์˜ ์†๋„ ํ–ฅ์ƒ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ํฌ๊ฒŒ ์ค„์ž…๋‹ˆ๋‹ค. 2026๋…„ 1์›”์— ์ถœ์‹œ๋œ Pandas 3.0์—์„œ PyArrow๊ฐ€ ๊ธฐ๋ณธ ๋ฐฑ์—”๋“œ๊ฐ€ ๋˜๋ฉด์„œ ํŽธ์˜์„ฑ ๊ฒฉ์ฐจ๋Š” ์ค„์–ด๋“ค์—ˆ์ง€๋งŒ, ์ˆœ์ˆ˜ ์„ฑ๋Šฅ์—์„œ์˜ ์ฐจ์ด๋Š” ์—ฌ์ „ํžˆ ํฝ๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ ๊ฐ€์ด๋“œ

Polars๋Š” 100๋งŒ ํ–‰ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์…‹, ETL ํŒŒ์ดํ”„๋ผ์ธ, ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. Pandas๋Š” Jupyter์—์„œ์˜ ํƒ์ƒ‰์  ๋ถ„์„, ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค, ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋„๊ตฌ๊ฐ€ Pandas DataFrame์„ ์ง์ ‘ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ๊ฒฐ๊ณผ: 2026๋…„ ์‹ค์ธก ์„ฑ๋Šฅ

ํ”„๋กœ๋•์…˜ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ์—์„œ์˜ ๋ฒค์น˜๋งˆํฌ๋Š” ์ผ๊ด€๋œ ํŒจํ„ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. H2O.ai group-by ๋ฒค์น˜๋งˆํฌ์—์„œ 1000๋งŒ ํ–‰ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด Polars๋Š” 0.45์ดˆ์— ์™„๋ฃŒ๋˜๋Š” ๋ฐ˜๋ฉด, Pandas๋Š” 12.5์ดˆ๊ฐ€ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. 10์–ต ํ–‰์—์„œ๋Š” Polars๊ฐ€ 45์ดˆ์— ์ŠคํŠธ๋ฆฌ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์™„๋ฃŒํ•˜์ง€๋งŒ, Pandas๋Š” 64GB ๋จธ์‹ ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…PolarsPandas์†๋„ ํ–ฅ์ƒ
Group-by (1000๋งŒ ํ–‰)0.45์ดˆ12.5์ดˆ27๋ฐฐ
CSV ์ฝ๊ธฐ (1GB)2.1์ดˆ10.5์ดˆ5๋ฐฐ
Parquet ํ•„ํ„ฐ (14GB)1.2์ดˆ13.2์ดˆ11๋ฐฐ
Join (1000๋งŒ ร— 100๋งŒ ํ–‰)1.8์ดˆ19.4์ดˆ10๋ฐฐ
์ •๋ ฌ (1์–ต ํ–‰)4.2์ดˆ46.1์ดˆ11๋ฐฐ

์ด ์ˆ˜์น˜๋“ค์€ ํ•ฉ์„ฑ ๋งˆ์ดํฌ๋กœ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ํ…Œ์ŠคํŠธ์—์„œ ์–ป์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Polars PDS-H ๋ฒค์น˜๋งˆํฌ ์Šค์œ„ํŠธ์— ๋”ฐ๋ฅด๋ฉด, Polars๋Š” CSV๋ฅผ 5๋ฐฐ ๋น ๋ฅด๊ฒŒ ์ฝ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ 87% ์ค„์ž…๋‹ˆ๋‹ค.

python
# benchmark_comparison.py
import polars as pl
import pandas as pd
import time

# Polars: ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด์ด ํฌํ•จ๋œ ์ง€์—ฐ ํ‰๊ฐ€
start = time.perf_counter()
result_polars = (
    pl.scan_parquet("sales_data_14gb.parquet")  # ์ง€์—ฐ: ์•„์ง ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์•ˆ ๋จ
    .filter(pl.col("region") == "EMEA")         # ์กฐ๊ฑด๋ถ€๊ฐ€ ํŒŒ์ผ ๋ฆฌ๋”์— ํ‘ธ์‹œ๋‹ค์šด
    .group_by("product_category")
    .agg(pl.col("revenue").sum())
    .collect()                                   # ์—ฌ๊ธฐ์„œ ์‹คํ–‰
)
polars_time = time.perf_counter() - start

# Pandas: ์ฆ‰์‹œ ํ‰๊ฐ€๋กœ ์ „์ฒด ํŒŒ์ผ ๋กœ๋“œ
start = time.perf_counter()
df = pd.read_parquet("sales_data_14gb.parquet")  # 14GB ์ „์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ
result_pandas = (
    df[df["region"] == "EMEA"]                   # ๋กœ๋“œ ํ›„ ํ•„ํ„ฐ ์ ์šฉ
    .groupby("product_category")["revenue"]
    .sum()
)
pandas_time = time.perf_counter() - start

print(f"Polars: {polars_time:.2f}s | Pandas: {pandas_time:.2f}s")
# ์ผ๋ฐ˜์ ์ธ ์ถœ๋ ฅ: Polars: 1.2s | Pandas: 13.2s

์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. Polars๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  CPU ์ฝ”์–ด์—์„œ ์‹คํ–‰๋˜๊ณ , Apache Arrow์˜ ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜ ๋ฉ”๋ชจ๋ฆฌ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ฟผ๋ฆฌ๋ฅผ ์ง€์—ฐ ํ‰๊ฐ€ํ•˜์—ฌ ์กฐ๊ฑด๋ถ€๋ฅผ ํŒŒ์ผ ์ฝ๊ธฐ ์‹œ์ ์— ์ง์ ‘ ํ‘ธ์‹œ๋‹ค์šดํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ์ฐจ์ด์ 

Pandas๋Š” ๋‹จ์ผ ์ฐจ์„  ๋„๋กœ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 16์ฝ”์–ด ํ”„๋กœ์„ธ์„œ์—์„œ๋„ Pandas๋Š” ๋ชจ๋“  ํ–‰์„ ๋‹จ์ผ ๋ ˆ์ธ์—์„œ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด Polars๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ฝ”์–ด์— ์ž‘์—…์„ ์ž๋™์œผ๋กœ ๋ถ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ŠฅPolarsPandas 3.0
๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธApache Arrow ์ปฌ๋Ÿผ ๊ธฐ๋ฐ˜NumPy/PyArrow ํ•˜์ด๋ธŒ๋ฆฌ๋“œ
๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ
ํ‰๊ฐ€ ๋ฐฉ์‹์ฟผ๋ฆฌ ์ตœ์ ํ™” ํฌํ•จ ์ง€์—ฐ ํ‰๊ฐ€์ฆ‰์‹œ ํ‰๊ฐ€
๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ๋„ค์ดํ‹ฐ๋ธŒ Arrow ๋ฌธ์ž์—ดPyArrow ๋ฌธ์ž์—ด (3.0์—์„œ ์‹ ๊ทœ)
๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ œ๋กœ ์นดํ”ผCopy-on-Write (3.0์—์„œ ์‹ ๊ทœ)
GPU ์ง€์›์‹คํ—˜์  (NVIDIA cuDF)์—†์Œ

Pandas๋Š” ์ž‘์—… ์ค‘ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์ฃผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. 2GB ํŒŒ์ผ์ด ๊ธฐ๋ณธ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ 8~10GB์˜ RAM์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Polars๋Š” ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์ง€์—ฐ ํ‰๊ฐ€๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ง€์—ฐ ํ‰๊ฐ€: Polars์˜ ์ตœ๋Œ€ ๊ฐ•์ 

์ง€์—ฐ ํ‰๊ฐ€๋Š” Polars์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์•„ํ‚คํ…์ฒ˜ ์ด์ ์ž…๋‹ˆ๋‹ค. ์ž‘์—…์„ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹ , Polars๋Š” ์ฟผ๋ฆฌ ํ”Œ๋žœ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ ์ „์— ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

python
# lazy_evaluation_example.py
import polars as pl

# ์ง€์—ฐ ์ฟผ๋ฆฌ ์ •์˜ (์•„์ง ์‹คํ–‰ ์•ˆ ๋จ)
lazy_query = (
    pl.scan_csv("transactions_50gb.csv")   # LazyFrame: ์Šคํ‚ค๋งˆ๋งŒ, ๋ฐ์ดํ„ฐ ์—†์Œ
    .filter(pl.col("amount") > 1000)       # ์ฟผ๋ฆฌ ํ”Œ๋žœ์— ์ถ”๊ฐ€
    .filter(pl.col("status") == "completed")  # ์œ„ ํ•„ํ„ฐ์™€ ๊ฒฐํ•ฉ
    .select(["transaction_id", "amount", "customer_id"])  # ํ”„๋กœ์ ์…˜ ํ‘ธ์‹œ๋‹ค์šด
    .group_by("customer_id")
    .agg([
        pl.col("amount").sum().alias("total_spent"),
        pl.col("transaction_id").count().alias("transaction_count")
    ])
)

# ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ ํ”Œ๋žœ ๋ณด๊ธฐ
print(lazy_query.explain())
# ํ‘œ์‹œ: ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด, ํ”„๋กœ์ ์…˜ ํ‘ธ์‹œ๋‹ค์šด, ํ•„ํ„ฐ ๊ฒฐํ•ฉ

# ์ค€๋น„๋˜๋ฉด ์‹คํ–‰
result = lazy_query.collect()

์ฟผ๋ฆฌ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์—ฌ๋Ÿฌ ๋ณ€ํ™˜์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด์€ ํ•„ํ„ฐ๋ฅผ ํŒŒ์ผ ๋ฆฌ๋” ์ˆ˜์ค€์œผ๋กœ ์ด๋™์‹œ์ผœ ํ•„ํ„ฐ๋ง๋œ ํ–‰์ด ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ํ‘ธ์‹œ๋‹ค์šด์€ ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์ฝ๊ณ , ํ•„ํ„ฐ ๊ฒฐํ•ฉ์€ ์—ฌ๋Ÿฌ ํ•„ํ„ฐ ์ž‘์—…์„ ๋‹จ์ผ ํŒจ์Šค๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์ปฌ๋Ÿผ์„ ๊ฐ€์ง„ ๋„“์€ ํ…Œ์ด๋ธ”์—์„œ์˜ I/O ์ง‘์•ฝ์  ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋Š” Polars๊ฐ€ ํŒŒ์ผ ๋ฆฌ๋” ์ˆ˜์ค€์—์„œ ์ปฌ๋Ÿผ์„ ์™„์ „ํžˆ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋” ์ปค์ง‘๋‹ˆ๋‹ค.

GPU ๊ฐ€์†

Polars 1.x์—๋Š” NVIDIA cuDF ํ†ตํ•ฉ์„ ํ†ตํ•œ ์‹คํ—˜์  GPU ์ง€์›์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜๋˜๋Š” CUDA GPU๊ฐ€ ์žˆ๋Š” ๋จธ์‹ ์—์„œ .collect()์— engine="gpu"๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์˜ตํŠธ์ธ ๋ฐฉ์‹์ด๋ฉฐ ๋ชจ๋“  ์ž‘์—…์—์„œ ์•„์ง ์•ˆ์ •์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pandas 3.0: ํŽธ์˜์„ฑ ๊ฒฉ์ฐจ ์ค„์ด๊ธฐ

2026๋…„ 1์›”์— ์ถœ์‹œ๋œ Pandas 3.0์€ Polars์™€์˜ ์‚ฌ์šฉ์„ฑ ๊ฒฉ์ฐจ๋ฅผ ์ค„์ด๋Š” ์ค‘์š”ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์ˆœ์ˆ˜ ์„ฑ๋Šฅ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

python
# pandas_3_new_features.py
import pandas as pd

# PyArrow ๋ฌธ์ž์—ด ๋ฐฑ์—”๋“œ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’ (๋ฌธ์ž์—ด ์ž‘์—… 5~10๋ฐฐ ๋น ๋ฆ„)
df = pd.read_csv("users.csv")  # ๋ฌธ์ž์—ด์ด ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ string[pyarrow]

# ์ƒˆ๋กœ์šด ํ‘œํ˜„์‹ ๋นŒ๋” (Polars ๊ตฌ๋ฌธ๊ณผ ์œ ์‚ฌ)
result = df.select(
    pd.col("name").str.upper(),
    pd.col("age") * 2,
    (pd.col("salary") > 100000).alias("high_earner")
)

# Copy-on-Write๋กœ SettingWithCopyWarning ํ•ด๊ฒฐ
subset = df[df["age"] > 30]  # ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ๋ทฐ ๋ฐ˜ํ™˜
subset = subset.copy()        # ๋ณ€๊ฒฝ์—๋Š” ๋ช…์‹œ์  ๋ณต์‚ฌ ํ•„์š”

# ์ƒˆ๋กœ์šด Arrow ์ƒํ˜ธ ์šด์šฉ ๋ฉ”์„œ๋“œ
import pyarrow as pa
arrow_table = pa.table({"x": [1, 2, 3]})
df = pd.DataFrame.from_arrow(arrow_table)  # ์ œ๋กœ ์นดํ”ผ ์ž„ํฌํŠธ

Pandas 3.0์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • PyArrow ๋ฌธ์ž์—ด ๋ฐฑ์—”๋“œ: ๋ฌธ์ž์—ด ์ปฌ๋Ÿผ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ string[pyarrow]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์ŠคํŠธ ์ค‘์‹ฌ ๋ฐ์ดํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ 50% ์ ˆ๊ฐ
  • Copy-on-Write ๊ฐ•์ œ: df[col]์€ ๋ทฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋ณ€๊ฒฝ์—๋Š” ๋ช…์‹œ์ ์ธ .copy()๊ฐ€ ํ•„์š”
  • pd.col() ํ‘œํ˜„์‹ ๋นŒ๋”: ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ์œ„ํ•œ Polars์—์„œ ์˜๊ฐ๋ฐ›์€ ์ƒˆ ๊ตฌ๋ฌธ
  • ํ๊ธฐ๋œ ๋ฉ”์„œ๋“œ ์ œ๊ฑฐ: append(), ๋Œ€๋ถ€๋ถ„์˜ ๋ฉ”์„œ๋“œ์—์„œ inplace=True, []๋ฅผ ์‚ฌ์šฉํ•œ ์œ„์น˜ ์ธ๋ฑ์‹ฑ

Data Analytics ๋ฉด์ ‘ ์ค€๋น„๊ฐ€ ๋˜์…จ๋‚˜์š”?

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ, flashcards, ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”.

๊ตฌ๋ฌธ ๋น„๊ต: ์ผ๋ฐ˜์ ์ธ ์ž‘์—…

๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ตฌ๋ฌธ์€ ํฌ๊ฒŒ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Polars๋Š” ๋ช…์‹œ์ ์ธ ์ปฌ๋Ÿผ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹์„ ์‚ฌ์šฉํ•˜๊ณ , Pandas๋Š” ๋ธŒ๋ž˜ํ‚ท ํ‘œ๊ธฐ๋ฒ•์— ๋” ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

ํ•„ํ„ฐ๋ง๊ณผ ์„ ํƒ

python
# filtering_comparison.py
import polars as pl
import pandas as pd

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ
data = {
    "name": ["Alice", "Bob", "Charlie", "Diana"],
    "department": ["Engineering", "Sales", "Engineering", "HR"],
    "salary": [95000, 72000, 88000, 65000],
    "years": [5, 3, 7, 2]
}

# POLARS: pl.col()์„ ์‚ฌ์šฉํ•œ ๋ช…์‹œ์  ์ปฌ๋Ÿผ ์ฐธ์กฐ
df_pl = pl.DataFrame(data)
result_pl = (
    df_pl
    .filter(pl.col("department") == "Engineering")  # pl.col()๋กœ ํ•„ํ„ฐ
    .filter(pl.col("salary") > 80000)               # ํ•„ํ„ฐ ์ฒด์ด๋‹
    .select(["name", "salary"])                     # ์ปฌ๋Ÿผ ์„ ํƒ
)

# PANDAS: ๋ธŒ๋ž˜ํ‚ท ํ‘œ๊ธฐ๋ฒ•
df_pd = pd.DataFrame(data)
result_pd = (
    df_pd
    .loc[df_pd["department"] == "Engineering"]  # ํ•„ํ„ฐ์— loc
    .loc[lambda x: x["salary"] > 80000]         # ์ฒด์ด๋‹์— ๋žŒ๋‹ค
    [["name", "salary"]]                        # ์„ ํƒ์— ๋ธŒ๋ž˜ํ‚ท
)

์ง‘๊ณ„์™€ Group By

python
# aggregation_comparison.py

# POLARS: ํ‘œํ˜„๋ ฅ ์žˆ๋Š” ์ง‘๊ณ„ ๊ตฌ๋ฌธ
result_pl = (
    df_pl
    .group_by("department")
    .agg([
        pl.col("salary").mean().alias("avg_salary"),
        pl.col("salary").max().alias("max_salary"),
        pl.col("name").count().alias("headcount"),
        (pl.col("salary") * pl.col("years")).sum().alias("total_compensation_years")
    ])
)

# PANDAS: ๋ช…๋ช…๋œ ์ง‘๊ณ„ ๊ตฌ๋ฌธ
result_pd = (
    df_pd
    .groupby("department")
    .agg(
        avg_salary=("salary", "mean"),
        max_salary=("salary", "max"),
        headcount=("name", "count"),
        total_compensation_years=("salary", lambda x: (df_pd.loc[x.index, "salary"] * df_pd.loc[x.index, "years"]).sum())
    )
)

์กฐ์ธ (Join)

python
# joins_comparison.py

employees = pl.DataFrame({
    "emp_id": [1, 2, 3],
    "name": ["Alice", "Bob", "Charlie"],
    "dept_id": [10, 20, 10]
})

departments = pl.DataFrame({
    "dept_id": [10, 20, 30],
    "dept_name": ["Engineering", "Sales", "HR"]
})

# POLARS: ๋ช…์‹œ์  ์กฐ์ธ ๊ตฌ๋ฌธ
result_pl = employees.join(
    departments,
    on="dept_id",      # ์กฐ์ธ ์ปฌ๋Ÿผ
    how="left"         # ์กฐ์ธ ์œ ํ˜•: left, inner, outer, cross, semi, anti
)

# PANDAS: merge ํ•จ์ˆ˜
result_pd = pd.merge(
    employees.to_pandas(),
    departments.to_pandas(),
    on="dept_id",
    how="left"
)

2026๋…„ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ๊ธฐ

์„ ํƒ์€ ๋ฐ์ดํ„ฐ์…‹ ํฌ๊ธฐ, ๊ธฐ์กด ์ธํ”„๋ผ, ๋‹ค์šด์ŠคํŠธ๋ฆผ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Polars๋ฅผ ์„ ํƒํ•ด์•ผ ํ•  ๋•Œ:

  • 100๋งŒ ํ–‰ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ๋‹ค๋ฃฐ ๋•Œ
  • ETL ํŒŒ์ดํ”„๋ผ์ธ์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๊ตฌ์ถ•ํ•  ๋•Œ
  • ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ๋น„ํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ œํ•œ๋  ๋•Œ
  • ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•  ๋•Œ (์‹ค์‹œ๊ฐ„ ๋ถ„์„, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ)
  • ๋ ˆ๊ฑฐ์‹œ ์ข…์†์„ฑ์ด ์—†๋Š” ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ

Pandas๋ฅผ ์„ ํƒํ•ด์•ผ ํ•  ๋•Œ:

  • Jupyter ๋…ธํŠธ๋ถ์—์„œ ๋น ๋ฅธ ํƒ์ƒ‰
  • ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹ (100๋งŒ ํ–‰ ๋ฏธ๋งŒ)
  • ๋‹ค์šด์ŠคํŠธ๋ฆผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Pandas DataFrame์„ ํ•„์š”๋กœ ํ•  ๋•Œ (scikit-learn, statsmodels, matplotlib)
  • Pandas๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค ์œ ์ง€ ๋ณด์ˆ˜
  • ํŒ€ ์นœ์ˆ™๋„๊ฐ€ ์„ฑ๋Šฅ ์š”๊ตฌ ์‚ฌํ•ญ๋ณด๋‹ค ์ค‘์š”ํ•  ๋•Œ

2026๋…„์˜ ์‹ค์šฉ์ ์ธ ํŒจํ„ด์€ ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Polars๋กœ ๋ฌด๊ฑฐ์šด ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ML ๋ฐ ํ”Œ๋กœํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ๊ณ„์—์„œ Pandas๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

python
# hybrid_workflow.py
import polars as pl
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt

# Polars๋กœ ๋ฌด๊ฑฐ์šด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ (10๋ฐฐ ๋น ๋ฆ„)
df = (
    pl.scan_parquet("raw_data/*.parquet")
    .filter(pl.col("valid") == True)
    .with_columns([
        (pl.col("revenue") / pl.col("quantity")).alias("unit_price"),
        pl.col("timestamp").dt.month().alias("month")
    ])
    .group_by(["customer_id", "month"])
    .agg([
        pl.col("revenue").sum(),
        pl.col("quantity").mean()
    ])
    .collect()
)

# ML์šฉ Pandas๋กœ ๋ณ€ํ™˜ (์ˆซ์ž ์ปฌ๋Ÿผ์€ ์ œ๋กœ ์นดํ”ผ)
X = df.select(["revenue", "quantity"]).to_pandas()
y = df.select("churn").to_pandas().values.ravel()

# scikit-learn์€ Pandas/NumPy๋ฅผ ๊ธฐ๋Œ€
model = RandomForestClassifier()
model.fit(X, y)

# Pandas ํ†ตํ•ฉ์œผ๋กœ ํ”Œ๋กœํŒ…
df.to_pandas().plot(kind="bar", x="month", y="revenue")
plt.savefig("monthly_revenue.png")

๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘์—์„œ์˜ Polars vs Pandas ์งˆ๋ฌธ

์ด๋Ÿฌํ•œ ์งˆ๋ฌธ๋“ค์€ ํ›„๋ณด์ž๊ฐ€ Python ๋ฐ์ดํ„ฐ ๋ถ„์„ ์Šคํ‚ฌ์„ ์–ธ๊ธ‰ํ•  ๋•Œ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฐ ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ 1: Pandas๋ณด๋‹ค Polars๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์–ธ์ œ์ž…๋‹ˆ๊นŒ?

์ข‹์€ ๋‹ต๋ณ€: Polars๋Š” ์ง€์—ฐ ํ‰๊ฐ€, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์‹คํ–‰, Apache Arrow ๋ฉ”๋ชจ๋ฆฌ ํ˜•์‹์œผ๋กœ ์ธํ•ด 100๋งŒ ํ–‰ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์…‹์—์„œ Pandas๋ฅผ ํฌ๊ฒŒ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์€ ์„ธ ๊ฐ€์ง€ ์š”์†Œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ณผ๋ฅจ (๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์…‹์—๋Š” Polars), ํŒŒ์ดํ”„๋ผ์ธ ์š”๊ตฌ ์‚ฌํ•ญ (ETL์—๋Š” Polars), ์ƒํƒœ๊ณ„ ์ œ์•ฝ (scikit-learn์ด๋‚˜ matplotlib ํ†ตํ•ฉ์ด ๋งŽ์œผ๋ฉด Pandas). ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ ‘๊ทผ ๋ฐฉ์‹์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค: ๋ณ€ํ™˜์—๋Š” Polars, ML ๊ฒฝ๊ณ„์—์„œ๋Š” Pandas.

์งˆ๋ฌธ 2: Polars์˜ ์ง€์—ฐ ํ‰๊ฐ€๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”

์ข‹์€ ๋‹ต๋ณ€: ์ง€์—ฐ ํ‰๊ฐ€๋Š” .collect()๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ์—ฐ๊ธฐํ•ฉ๋‹ˆ๋‹ค. Polars๋Š” ์ฟผ๋ฆฌ ํ”Œ๋žœ์„ ๊ตฌ์ถ•ํ•œ ๋‹ค์Œ ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด (ํ•„ํ„ฐ๋ฅผ ํŒŒ์ผ ๋ฆฌ๋”๋กœ ์ด๋™), ํ”„๋กœ์ ์…˜ ํ‘ธ์‹œ๋‹ค์šด (ํ•„์š”ํ•œ ์ปฌ๋Ÿผ๋งŒ ์ฝ๊ธฐ), ์ž‘์—… ์œตํ•ฉ์„ ํ†ตํ•ด ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 50GB Parquet ํŒŒ์ผ์— ๋Œ€ํ•œ ํ•„ํ„ฐ๊ฐ€ ์ „์ฒด ํŒŒ์ผ์ด ์•„๋‹Œ ์ผ์น˜ํ•˜๋Š” ํ–‰๋งŒ ์ฝ๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. LazyFrame.explain() ๋ฉ”์„œ๋“œ๋กœ ์ตœ์ ํ™”๋œ ํ”Œ๋žœ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ 3: Pandas 3.0์—์„œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๊นŒ?

์ข‹์€ ๋‹ต๋ณ€: Pandas 3.0 (2026๋…„ 1์›”)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Copy-on-Write๋ฅผ ๊ฐ•์ œํ•˜๊ณ , ๋ฌธ์ž์—ด ์ž‘์—…์„ 5~10๋ฐฐ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” PyArrow๋ฅผ ๋ฌธ์ž์—ด ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, append() ๋ฐ inplace=True์™€ ๊ฐ™์€ ํ๊ธฐ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด pd.col() ํ‘œํ˜„์‹ ๋นŒ๋”๋Š” Polars์™€ ์œ ์‚ฌํ•œ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Python 3.11์ด ์ตœ์†Œ ์š”๊ตฌ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

์งˆ๋ฌธ 4: ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์ง€ ์•Š๋Š” 50GB CSV ํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

python
# interview_answer_large_file.py
import polars as pl

# ์˜ต์…˜ 1: ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•œ ์ง€์—ฐ ํ‰๊ฐ€ (Polars)
result = (
    pl.scan_csv("large_file.csv")  # ์Šคํ‚ค๋งˆ๋งŒ ์ฝ์Œ
    .filter(pl.col("status") == "active")
    .group_by("region")
    .agg(pl.col("revenue").sum())
    .collect(streaming=True)  # ๋ฐฐ์น˜๋กœ ์ฒ˜๋ฆฌ
)

# ์˜ต์…˜ 2: ์ฒญํฌ ์ฒ˜๋ฆฌ (Pandas ํด๋ฐฑ)
import pandas as pd

results = []
for chunk in pd.read_csv("large_file.csv", chunksize=1_000_000):
    filtered = chunk[chunk["status"] == "active"]
    agg = filtered.groupby("region")["revenue"].sum()
    results.append(agg)

final = pd.concat(results).groupby(level=0).sum()

์ข‹์€ ๋‹ต๋ณ€: Polars ์ ‘๊ทผ ๋ฐฉ์‹์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ŠคํŠธ๋ฆฌ๋ฐ์„ ์‚ฌ์šฉํ•œ ์ง€์—ฐ ํ‰๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐฐ์น˜ ์ฒ˜๋ฆฌํ•˜๊ณ , ํŒŒ์ผ ๋ฆฌ๋” ์ˆ˜์ค€์—์„œ ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด์„ ์ ์šฉํ•˜๋ฉฐ, ์ฝ”์–ด ๊ฐ„์— ๋ณ‘๋ ฌํ™”ํ•ฉ๋‹ˆ๋‹ค. Pandas์˜ ์ฒญํฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘๋™ํ•˜์ง€๋งŒ ์ˆ˜๋™ ๋ฐฐ์น˜ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ฒญํฌ ๊ฐ„ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์งˆ๋ฌธ 5: ์ด Pandas ์ฝ”๋“œ๋ฅผ Polars๋กœ ๋ณ€ํ™˜ํ•˜์„ธ์š”

python
# interview_conversion.py

# ์ฃผ์–ด์ง„ Pandas ์ฝ”๋“œ
df = pd.read_csv("sales.csv")
df["year"] = pd.to_datetime(df["date"]).dt.year
result = (
    df[df["amount"] > 1000]
    .groupby(["region", "year"])
    .agg({"amount": ["sum", "mean"], "customer_id": "nunique"})
)

# Polars ๋™๋“ฑ ์ฝ”๋“œ
result = (
    pl.scan_csv("sales.csv")  # ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์ง€์—ฐ
    .with_columns(
        pl.col("date").str.to_datetime().dt.year().alias("year")
    )
    .filter(pl.col("amount") > 1000)
    .group_by(["region", "year"])
    .agg([
        pl.col("amount").sum().alias("amount_sum"),
        pl.col("amount").mean().alias("amount_mean"),
        pl.col("customer_id").n_unique().alias("unique_customers")
    ])
    .collect()
)
๋ฉด์ ‘ ํŒ

๋ฉด์ ‘๊ด€์€ ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ ๋ณ€ํ™˜์ด ์•„๋‹ˆ๋ผ ์ง€์—ฐ ํ‰๊ฐ€๊ฐ€ ์–ธ์ œ ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. scan_csv๊ฐ€ ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ amount > 1000 ํ•„ํ„ฐ๊ฐ€ ํŒŒ์ผ ๋ฆฌ๋” ์ˆ˜์ค€์—์„œ ์ ์šฉ๋œ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•˜์„ธ์š”.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต: Pandas์—์„œ Polars๋กœ

๊ธฐ์กด Pandas ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๋ฉด ์™„์ „ํ•œ ์žฌ์ž‘์„ฑ์ด ์•„๋‹Œ ์ ์ง„์ ์ธ ๋„์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

python
# migration_strategy.py
import polars as pl
import pandas as pd

# ๋‹จ๊ณ„ 1: ๋น ๋ฅธ ํƒ์ƒ‰์—๋Š” Pandas ์œ ์ง€
def explore_data(path: str) -> pd.DataFrame:
    return pd.read_csv(path).head(1000)

# ๋‹จ๊ณ„ 2: ๋ฌด๊ฑฐ์šด ๋ณ€ํ™˜์— Polars ๋„์ž…
def process_data(path: str) -> pl.DataFrame:
    return (
        pl.scan_csv(path)
        .filter(pl.col("valid") == True)
        .with_columns([
            (pl.col("price") * pl.col("quantity")).alias("total")
        ])
        .collect()
    )

# ๋‹จ๊ณ„ 3: ํ•„์š”ํ•œ ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜
def train_model(df_polars: pl.DataFrame):
    df_pandas = df_polars.to_pandas()  # ์ˆซ์ž๋Š” ์ œ๋กœ ์นดํ”ผ
    # scikit-learn ์ฝ”๋“œ ์—ฌ๊ธฐ์—

# ๋‹จ๊ณ„ 4: ํ•ซ ํŒจ์Šค๋ฅผ ์ ์ง„์ ์œผ๋กœ ๊ต์ฒด
# ํ”„๋กœํŒŒ์ผ๋ง์œผ๋กœ ๋А๋ฆฐ Pandas ์ž‘์—… ์‹๋ณ„
# ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•จ์ˆ˜์”ฉ Polars ๋™๋“ฑ๋ฌผ๋กœ ๊ต์ฒด

H2O.ai๋Š” 2026๋…„ Driverless AI ๋ฆด๋ฆฌ์Šค์—์„œ Pandas์—์„œ Polars๋กœ ์ „ํ™˜ํ•œ ํ›„ ํ…Œ์ด๋ธ” ํ˜•์‹ AutoML ์‹คํ–‰์—์„œ 6๋ฐฐ์˜ ์—”๋“œํˆฌ์—”๋“œ ์›” ํด๋ก ๊ฐœ์„ ์„ ๋ฌธ์„œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฐ์Šต์„ ์‹œ์ž‘ํ•˜์„ธ์š”!

๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์™€ ๊ธฐ์ˆ  ํ…Œ์ŠคํŠธ๋กœ ์ง€์‹์„ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.

ํ”„๋กœ๋•์…˜๊ณผ ๋ฉด์ ‘์„ ์œ„ํ•œ ํ•ต์‹ฌ ํฌ์ธํŠธ

  • Polars๋Š” ์ง€์—ฐ ํ‰๊ฐ€, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์‹คํ–‰, Apache Arrow ๋ฉ”๋ชจ๋ฆฌ ํ˜•์‹์„ ํ†ตํ•ด 100๋งŒ ํ–‰ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์…‹์—์„œ Pandas๋ณด๋‹ค 10~15๋ฐฐ ๋น ๋ฅธ ์†๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
  • Pandas 3.0 (2026๋…„ 1์›”)์€ PyArrow ๋ฌธ์ž์—ด๊ณผ Copy-on-Write๋ฅผ ๋„์ž…ํ•˜์—ฌ ํŽธ์˜์„ฑ ๊ฒฉ์ฐจ๋ฅผ ์ค„์˜€์ง€๋งŒ ์„ฑ๋Šฅ ๊ฒฉ์ฐจ๋Š” ์ค„์ด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค
  • ์ง€์—ฐ ํ‰๊ฐ€๋Š” ์กฐ๊ฑด๋ถ€ ํ‘ธ์‹œ๋‹ค์šด๊ณผ ํ”„๋กœ์ ์…˜ ํ‘ธ์‹œ๋‹ค์šด์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ, ํ•„ํ„ฐ์™€ ์ปฌ๋Ÿผ ์„ ํƒ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „ ํŒŒ์ผ ๋ฆฌ๋” ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค
  • 2026๋…„์—๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํŒจํ„ด์ด ์ฃผ๋ฅ˜: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋Š” Polars, ML ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๊ณ„์—๋Š” Pandas
  • ๋ฉด์ ‘ ์งˆ๋ฌธ์€ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์–ธ์ œ ์‚ฌ์šฉํ• ์ง€, ์ง€์—ฐ ํ‰๊ฐ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜, ์‹ค์šฉ์ ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค
  • 100๋งŒ ํ–‰ ๋ฏธ๋งŒ์˜ ๋ฐ์ดํ„ฐ์…‹์—์„œ๋Š” ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ์ข…์ข… ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŒ€ ์นœ์ˆ™๋„๊ฐ€ ๊ฒฐ์ • ์š”์ธ์ด ๋ฉ๋‹ˆ๋‹ค
  • Polars 1.x๋Š” 5์–ต 7500๋งŒ ์ด์ƒ์˜ ๋‹ค์šด๋กœ๋“œ, 1800๋งŒ ์œ ๋กœ ์‹œ๋ฆฌ์ฆˆ A ํŽ€๋”ฉ์„ ๋ฐ›์•˜์œผ๋ฉฐ, ํŽ˜ํƒ€๋ฐ”์ดํŠธ ๊ทœ๋ชจ์˜ ๋ฐ์ดํ„ฐ์…‹์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์—…์—์„œ ์‚ฌ์šฉ๋˜์–ด ํ”„๋กœ๋•์…˜์— ์ค€๋น„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค
์˜ค๋Š˜์˜ ์ฑŒ๋ฆฐ์ง€

Data Analytics ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‚˜์š”

์‹ค์ œ ์ฝ”๋“œ ํ•œ ์กฐ๊ฐ, ์ˆจ์€ ๋ฒ„๊ทธ ํ•˜๋‚˜, ํ•˜๋ฃจ ํ•œ ๋ฒˆ. ๊ณ„์ • ์—†์ด ๋ฐ”๋กœ ๋„์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Anthony Fillion-Maillet

์ž‘์„ฑ์ž

Anthony Fillion-Maillet

SharpSkill ์ฐฝ์—…์ž

10๋…„ ์ด์ƒ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. SharpSkill์„ ์šด์˜ํ•˜๋ฉฐ ์ด๊ณณ์— ๊ฒŒ์‹œ๋˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์— ์ฑ…์ž„์„ ์ง‘๋‹ˆ๋‹ค.

2026๋…„ 8์›” 21์ผ ์—…๋ฐ์ดํŠธ

ํƒœ๊ทธ

#polars
#pandas
#python
#data-analytics
#performance

๊ณต์œ 

๊ด€๋ จ ๊ธฐ์‚ฌ

Pandas 3.0 new APIs and breaking changes guide

Pandas 3.0 ์™„๋ฒฝ ๊ฐ€์ด๋“œ(2026): ์ƒˆ๋กœ์šด API, ์ฃผ์š” ๋ณ€๊ฒฝ์‚ฌํ•ญ, ๋ฉด์ ‘ ์งˆ๋ฌธ ์ด์ •๋ฆฌ

Pandas 3.0์˜ Copy-on-Write, PyArrow ๋ฌธ์ž์—ด ๋ฐฑ์—”๋“œ, pd.col() ํ‘œํ˜„์‹ ๋นŒ๋” ๋“ฑ ํ•ต์‹ฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ƒ์„ธํžˆ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„ ์—”์ง€๋‹ˆ์–ด ๋ฉด์ ‘์—์„œ ์ถœ์ œ๋˜๋Š” ํ•ต์‹ฌ ์งˆ๋ฌธ๋„ ํ•จ๊ป˜ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Data Analyst Interview Questions Italy 2026

2026๋…„ ์ดํƒˆ๋ฆฌ์•„ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘ ์งˆ๋ฌธ: SQL, Python, ๋ถ„์„ ์Šคํ‚ฌ ์™„์ „ ๊ฐ€์ด๋“œ

2026๋…„ ์ดํƒˆ๋ฆฌ์•„์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€๋กœ ์ทจ์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉด์ ‘ ์ค€๋น„ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. SQL, Python, pandas, ๋น„์ฆˆ๋‹ˆ์Šค ๋ถ„์„์— ๊ด€ํ•œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” ์งˆ๋ฌธ๊ณผ ๋ชจ๋ฒ” ๋‹ต๋ณ€์„ ์ƒ์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘ ์งˆ๋ฌธ 2026๋…„ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘ ์งˆ๋ฌธ 2026๋…„ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: SQL, Python, ๋ถ„์„ ์Šคํ‚ฌ

2026๋…„ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€ ๋ฉด์ ‘์—์„œ ์ž์ฃผ ์ถœ์ œ๋˜๋Š” SQL, Python, ํ†ต๊ณ„ ๋ถ„์„ ์งˆ๋ฌธ๊ณผ ๋ชจ๋ฒ” ๋‹ต๋ณ€์„ ์ƒ์„ธํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์‹ค์ „ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•ต์‹ฌ ํฌ์ธํŠธ๋กœ ์ทจ์—… ์„ฑ๊ณต์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.