0Pricing
Pandas & NumPy Academy · 강의

Dask DataFrame 소개

pd.read_csv와 pd.DataFrame을 Dask에 해당하는 기능으로 바꾸고 compute()를 호출해 실행을 시작하며 작업 그래프를 프로파일링합니다.

Dask DataFrame 소개은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

Dask란 무엇인가요

Dask는 Python용 병렬 컴퓨팅 라이브러리로, NumPy와 Pandas를 RAM보다 큰 데이터셋에서도 사용할 수 있도록 확장합니다. dask.dataframe 모듈은 Pandas와 거의 동일한 DataFrame API를 제공하지만, 연산을 즉시 실행하는 대신 작업 그래프를 구축하고 .compute()를 호출할 때 지연 실행합니다. 따라서 코드를 거의 변경하지 않고도 여러 코어 또는 여러 컴퓨터에 작업을 병렬화할 수 있습니다.

Dask 설치 및 가져오기

Dask는 pip install dask[dataframe]으로 설치합니다. 가져올 때는 import dask.dataframe as dd 규칙을 사용합니다. 내부적으로 Dask DataFrame은 여러 개의 더 작은 Pandas DataFrame으로 분할되며, 각각 독립적으로 처리됩니다. Dask DataFrame에 대한 연산은 지연 작업 그래프를 생성하므로 .compute()를 호출하기 전까지는 아무 작업도 실행되지 않습니다. 계산을 설명하는 것과 실행하는 것을 분리하는 점이 Dask의 핵심 개념입니다.

import dask.dataframe as dd

# Read a large CSV — returns a Dask DataFrame immediately (no data loaded yet)
ddf = dd.read_csv('large_sales.csv')
print(type(ddf))     # dask.dataframe.core.DataFrame
print(ddf.columns.tolist())
print(ddf.dtypes)

Dask와 Pandas의 차이점

Pandas에서는 모든 연산이 즉시 적극적으로 실행됩니다. 반면 Dask에서는 연산이 지연된 계산을 나타내는 또 다른 Dask 객체를 반환합니다. .compute()를 호출해야 Dask가 실제로 데이터를 읽고 작업 그래프를 실행합니다. 이러한 지연 실행 덕분에 Dask는 실행 전에 실행 계획을 최적화할 수 있습니다. 예를 들어 연속된 필터를 하나로 결합하여 데이터를 여러 번 불러오는 일을 피할 수 있습니다. 요리법에 비유하면 Dask가 요리법을 작성하고, .compute()가 음식을 요리하는 셈입니다.

import dask.dataframe as dd

ddf = dd.read_csv('sales.csv')

# This does NOT run yet — just builds the task graph
filtered = ddf[ddf['amount'] > 1000]
agg = filtered.groupby('region')['amount'].sum()

print(type(agg))  # dask.dataframe.core.Series

# NOW execute everything
result = agg.compute()
print(result)

파티션: 핵심 개념

Dask DataFrame은 파티션으로 나뉘며, 각 파티션은 일반적인 Pandas DataFrame입니다. 기본적으로 dd.read_csv는 파일당 하나의 파티션을 만들고, 대용량 파일의 경우 128 MB당 하나를 만듭니다. 이 설정은 blocksize로 제어할 수 있습니다. ddf.npartitions를 확인하면 파티션 수를 알 수 있습니다. 파티션이 많으면 병렬성이 높아지지만 오버헤드가 증가하고, 적으면 오버헤드가 줄어들지만 병렬성이 제한됩니다. 일반적으로 수백 개의 파티션이 적절한 균형점입니다.

import dask.dataframe as dd

ddf = dd.read_csv('data/*.csv')  # Read multiple CSV files at once
print('Number of partitions:', ddf.npartitions)

# Access a single partition as a Pandas DataFrame
first_partition = ddf.get_partition(0).compute()
print('Partition 0 shape:', first_partition.shape)

Dask에서 사용하는 익숙한 Pandas 연산

대부분의 일반적인 Pandas 연산은 Dask에서도 동일하게 작동합니다. .head(), .tail(), .describe(), 불리언 인덱싱, .groupby(), .merge(), .assign()에는 모두 Dask에 해당하는 기능이 있습니다. 가장 큰 차이점은 결과를 실제로 생성하려면 .compute()를 호출해야 한다는 것입니다. Pandas에서 밀리초 만에 처리되는 연산도 작업 그래프 오버헤드 때문에 Dask에서는 몇 초가 걸릴 수 있으므로, 데이터가 작을 때는 Pandas를 사용하고 데이터가 RAM에 들어가지 않을 때는 Dask를 사용하십시오.

import dask.dataframe as dd

ddf = dd.read_csv('transactions.csv')

# Filtering — same syntax as Pandas
high_value = ddf[ddf['amount'] > 500]

# GroupBy aggregation
by_region = high_value.groupby('region')['amount'].mean()

# Execute
result = by_region.compute()
print(result.sort_values(ascending=False))

글로브 패턴으로 여러 파일 읽기

Dask의 가장 유용한 기능 중 하나는 글로브 패턴을 사용하여 여러 파일을 한 번에 읽는 것입니다. dd.read_csv('data/2024-*.csv')는 패턴과 일치하는 모든 파일을 읽고 파일당 하나의 파티션을 만듭니다. 이는 월별 또는 일별로 파티션된 파일에 저장된 데이터를 처리할 때 특히 유용하며, 데이터 레이크에서 흔히 사용하는 방식입니다. Dask는 스키마를 자동으로 맞춰 주므로 Pandas로 직접 반복하며 연결하는 것과 같은 작업을 훨씬 간단하게 처리할 수 있습니다.

import dask.dataframe as dd

# Read all monthly files at once
ddf = dd.read_csv('sales/2024-*.csv',
                  dtype={'order_id': 'int32',
                         'amount': 'float32'})
print(f'Partitions: {ddf.npartitions}')  # One per file
print(f'Total rows (lazy): {len(ddf)}')  # This triggers a compute!

작업 그래프를 위한 visualize() 메서드

복잡한 Dask 파이프라인을 실행하기 전에 result.visualize()를 호출하여 작업 그래프를 살펴볼 수 있습니다. 이 호출은 모든 계산 단계를 보여 주는 PNG 다이어그램을 생성합니다. 이를 통해 Dask가 실행할 작업을 이해하고 예상치 못한 속도 저하를 디버깅할 수 있습니다. 그래프에는 파티션이 필터, groupby, 집계 단계를 거치는 흐름이 표시되므로 중복 계산을 쉽게 찾아낼 수 있습니다. graphviz 패키지가 필요합니다.

import dask.dataframe as dd

ddf = dd.read_csv('orders.csv')
pipeline = (
    ddf[ddf['status'] == 'completed']
    .groupby('product_id')['revenue']
    .sum()
)

# Visualise the task graph (saves to PNG)
# pipeline.visualize('task_graph.png')

# Check number of tasks in the graph
print('Number of tasks:', len(pipeline.__dask_graph__()))

map_partitions로 사용자 지정 함수 적용

Dask DataFrame에 사용자 지정 Pandas 함수를 적용해야 할 때는 ddf.map_partitions(func)를 사용하십시오. 이 함수는 각 파티션에 func를 독립적으로 적용하고 새로운 Dask DataFrame을 반환합니다. 함수는 일반적인 Pandas DataFrame을 전달받으며 반드시 하나를 반환해야 합니다. 이는 df.apply()에 해당하는 Dask 기능이며, Pandas만 이해하는 코드와 Dask를 통합하는 방법입니다.

import dask.dataframe as dd
import pandas as pd

def normalise_chunk(df):
    df = df.copy()
    df['amount_norm'] = (df['amount'] - df['amount'].mean()) / df['amount'].std()
    return df

ddf = dd.read_csv('data.csv')
normalised = ddf.map_partitions(normalise_chunk)
result = normalised[['order_id', 'amount_norm']].compute()
print(result.head())

Dask 스케줄러 옵션

Dask에는 작업 실행 방식을 제어하는 여러 스케줄러가 있습니다. 'synchronous' 스케줄러는 현재 스레드에서 작업을 순차적으로 실행하므로 디버깅에 유용합니다. 'threads' 스케줄러는 스레드 풀을 사용하므로 입출력 중심 작업에 적합합니다. 'processes' 스케줄러는 CPU 중심 작업을 위해 여러 프로세스를 생성하며 Python의 GIL을 우회합니다. Dask 분산 클러스터를 사용하면 여러 컴퓨터에서 작업을 실행할 수 있습니다. 스케줄러는 compute(scheduler='threads')를 통해 지정하십시오.

import dask.dataframe as dd

ddf = dd.read_csv('data.csv')
agg = ddf.groupby('category')['sales'].sum()

# Choose scheduler based on workload
result_sync = agg.compute(scheduler='synchronous')  # sequential, easy to debug
result_threads = agg.compute(scheduler='threads')   # parallel I/O
result_processes = agg.compute(scheduler='processes')  # parallel CPU

Dask와 Pandas 간 변환

대규모 데이터셋을 Dask로 처리한 후 집계된 결과를 최종 분석이나 시각화를 위해 Pandas로 가져오는 경우가 많습니다. .compute()를 사용하면 Dask DataFrame을 Pandas로 변환할 수 있습니다. 반대로 dd.from_pandas(df, npartitions=4)를 사용하면 Pandas DataFrame을 Dask DataFrame으로 변환할 수 있습니다. 이는 전체 데이터셋으로 확장하기 전에 작은 데이터로 Dask 코드를 테스트할 때 유용합니다.

import pandas as pd
import dask.dataframe as dd

# Start with a small Pandas DF for testing
df_small = pd.DataFrame({'a': range(100), 'b': range(100, 200)})

# Convert to Dask for development/testing
ddf = dd.from_pandas(df_small, npartitions=4)
result = ddf.groupby('a')['b'].sum().compute()
print(type(result))  # pandas.Series
print(result.head())

Dask, Pandas, SQL 중 무엇을 사용할까요

Dask가 항상 적합한 도구는 아닙니다. 데이터가 RAM에 들어갈 때(수 GB 미만)는 Pandas를 사용하십시오. 오버헤드가 적어 더 간단하고 빠릅니다. 데이터가 RAM보다 크지만 Pandas와 유사한 문법과 단일 컴퓨터의 병렬 처리를 원한다면 Dask를 사용하십시오. 데이터가 관계형 데이터베이스에 있고 집계를 데이터베이스 엔진으로 넘길 수 있다면 SQL/데이터베이스를 사용하십시오. 페타바이트 규모의 여러 컴퓨터 분산 처리가 필요하다면 Spark 또는 BigQuery를 사용하십시오.

빠른 확인

이 강의에서 다룬 데이터 분석 개념을 얼마나 이해했는지 확인해 보십시오.

강의 요약

이 강의에서는 다음을 배웠습니다. Dask DataFrames는 익숙한 API를 제공하며 지연 평가되는 Pandas 파티션의 모음이고, .compute()는 작업 그래프의 실제 실행을 시작하며, map_partitions를 사용하면 모든 파티션에 사용자 지정 Pandas 함수를 적용할 수 있습니다. 다음 강의에서는 대규모 데이터셋 저장을 위한 빠른 열 기반 CSV 대안인 Parquet 형식을 살펴보겠습니다.

자주 묻는 질문

“Dask DataFrame 소개” 강의는 무료인가요?

네 — “Dask DataFrame 소개” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Dask DataFrame 소개”에서 뭘 배우나요?

pd.read_csv와 pd.DataFrame을 Dask에 해당하는 기능으로 바꾸고 compute()를 호출해 실행을 시작하며 작업 그래프를 프로파일링합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“Dask DataFrame 소개” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. chunksize를 사용한 CSV 스트리밍
  2. 청크 간 점진적 집계
  3. Dask DataFrame 소개
  4. Parquet: 빠른 열 기반 저장소
← Pandas & NumPy Academy(으)로 돌아가기