Pandas와 SQL: 알맞은 도구 선택
Pandas의 그룹화/병합과 SQL의 GROUP BY/JOIN을 비교하고, 각 변환을 어느 계층에서 처리할지 결정합니다.
Pandas와 SQL: 알맞은 도구 선택은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
두 도구의 상호 보완적인 강점
Pandas와 SQL은 모두 데이터 조작을 위한 도구이며, 전문 데이터 분석가들이 모두 사용합니다. 핵심은 두 도구가 경쟁 관계가 아니라 상호 보완 관계라는 점입니다. SQL은 관계형 데이터베이스에 저장된 대규모 테이블에 대한 선언적 집합 기반 연산에 강하고, Pandas는 메모리에 이미 로드된 데이터에 대해 명령형 행 단위 연산과 복잡한 알고리즘 변환을 수행하는 데 강합니다. 가장 좋은 파이프라인은 각 도구가 가장 잘하는 작업에 각각 사용합니다.
SQL의 강점: SQL이 더 잘하는 작업
일반적으로 다음과 같은 경우에는 SQL이 더 뛰어납니다. 데이터가 크고(기가바이트에서 테라바이트 규모) 로드하기 전에 필터링해야 하는 경우, 여러 대규모 테이블을 조인해야 하고 데이터베이스 인덱스로 인해 속도가 크게 향상되는 경우, 집계가 단순한 경우(SUM, COUNT, GROUP BY), 입력에 비해 결과 집합이 작은 경우, 또는 동시 읽기/쓰기가 필요한 경우(데이터베이스가 트랜잭션과 잠금을 처리함)입니다. 또한 SQL의 선언적 구문을 사용하면 쿼리 최적화 프로그램이 최적의 물리적 실행 계획을 자동으로 선택할 수 있습니다.
-- SQL excels at:
-- 1. Filtering billions of rows using an index
SELECT * FROM orders WHERE customer_id = 12345;
-- 2. Joining large tables efficiently
SELECT o.order_id, c.name, SUM(o.amount)
FROM orders o
JOIN customers c ON o.customer_id = c.id
GROUP BY o.order_id, c.name;
-- 3. Window functions on ordered data
SELECT order_id, amount,
SUM(amount) OVER (PARTITION BY customer_id ORDER BY order_date)
FROM orders;Pandas의 강점: Pandas가 더 잘하는 작업
일반적으로 다음과 같은 경우에는 Pandas가 더 뛰어납니다. SQL로 표현할 수 없는 사용자 지정 Python 로직(머신 러닝 전처리, 사용자 지정 문자열 파싱, 복잡한 알고리즘)이 필요한 경우, 데이터 변환 단계가 많은 경우, 분석 직후 시각화가 필요한 경우, 데이터가 이미 메모리에 있고 SQL을 다시 왕복하는 데 지연 시간이 추가되는 경우, 또는 대화형으로 반복 작업을 수행하려는 탐색적 분석을 하는 경우입니다. Pandas는 행렬 계산과 시계열 평활화처럼 표 형식이 아닌 작업도 처리할 수 있습니다.
import pandas as pd
# Pandas excels at:
# 1. Custom Python logic that SQL cannot express
df['clean_name'] = df['name'].str.strip().str.title().str.replace(r'[^a-zA-Z ]', '', regex=True)
# 2. Vectorised string parsing
df[['first', 'last']] = df['full_name'].str.split(' ', n=1, expand=True)
# 3. Rolling statistics and time series
df['7day_avg'] = df['daily_sales'].rolling(7).mean()
# 4. Direct visualisation
# df.groupby('category')['sales'].sum().plot(kind='bar')SQL 연산을 Pandas에 대응시키기
대부분의 SQL 연산에는 Pandas에서 직접 대응되는 기능이 있습니다. 두 구문을 모두 알면 활용도가 높아지고 도구를 바꿀 때 서로 변환하기도 쉬워집니다. WHERE는 불리언 인덱싱 또는 .query()가 되고, GROUP BY + SUM은 .groupby().sum()이 되며, JOIN은 pd.merge()가 됩니다. 또한 ORDER BY는 .sort_values()가 되고, DISTINCT는 .drop_duplicates()가 됩니다. 의미는 동일하고 구문만 다릅니다.
import pandas as pd
df = pd.DataFrame({'region': ['N','S','N','E'], 'amount': [100,200,150,300]})
# SQL: SELECT region, SUM(amount) FROM df WHERE amount>100 GROUP BY region ORDER BY region
# Pandas:
result = (
df[df['amount'] > 100]
.groupby('region')['amount']
.sum()
.reset_index()
.sort_values('region')
)
print(result)데이터 크기에 따른 선택
데이터 크기를 기준으로 실용적으로 선택하는 방법은 다음과 같습니다. 100 MB 미만 — SQL 오버헤드를 감수할 가치가 없으므로 Pandas만 사용합니다. 100 MB~10 GB — SQL에서 필터링과 집계를 수행하고 요약 DataFrame을 Pandas로 로드합니다. 10 GB~1 TB — 처리에는 SQL 또는 Dask를 사용하고, 최종 요약에만 Pandas를 사용합니다. 1 TB 초과 — 분산 SQL(BigQuery, Spark SQL, Redshift)을 사용합니다. 16 GB 노트북에서 100 GB 테이블을 Pandas로 로드하려고 하지 마십시오. 프로그램이 중단되거나 디스크를 과도하게 사용하게 됩니다.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///large.db')
# Right approach: SQL handles the heavy lifting
summary_df = pd.read_sql_query(
'''
SELECT region, product_category,
SUM(revenue) AS total_revenue,
COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY region, product_category
''',
con=engine
)
# summary_df is small — now do Pandas things on it
print(summary_df.sort_values('total_revenue', ascending=False))SQL 윈도 함수와 Pandas Rolling
SQL의 윈도 함수(OVER (PARTITION BY ... ORDER BY ...))는 강력하지만 한계가 있습니다. 누적 순위, 시차 및 선행 값, 간단한 이동 집계는 잘 계산하지만, 복잡한 이동 통계(예: 이동 Pearson 상관)는 SQL로 표현할 수 없습니다. Pandas의 rolling()과 expanding()은 .apply()를 통한 사용자 지정 함수까지 포함하여 훨씬 다양한 윈도 계산을 지원합니다. 대규모 데이터의 표준 윈도 함수에는 SQL을 우선 사용하고, 복잡한 윈도 로직에는 Pandas를 우선 사용하십시오.
import pandas as pd
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=30),
'sales': [100 + i*10 + (i%7)*20 for i in range(30)]
})
# Pandas rolling — easy with arbitrary window functions
df['7d_mean'] = df['sales'].rolling(7).mean()
df['7d_std'] = df['sales'].rolling(7).std()
df['7d_corr'] = df['sales'].rolling(7).corr(df['sales'].shift(1))
print(df.tail())복잡한 조인: Pandas의 유연성
SQL 조인은 키의 동일성에 기반합니다(일부 예외가 있습니다). Pandas의 pd.merge_asof()는 시간 기반 퍼지 조인(키가 정확히 같은지 대신 가장 가까운 키를 일치)을 지원하므로, 시계열 정렬에 매우 유용합니다(예: 가장 최근의 이전 주가에 거래 이벤트를 조인). 또한 Pandas는 merge를 사용한 후 필터링하는 방식으로 조건부 조인을 지원합니다. SQL에서는 이를 표현하려면 하위 쿼리나 LATERAL 조인이 필요합니다. 이러한 고급 조인 패턴은 Pandas가 분명히 우위에 있는 분야 중 하나입니다.
import pandas as pd
trades = pd.DataFrame({
'time': pd.to_datetime(['2024-01-01 10:00', '2024-01-01 10:05', '2024-01-01 10:12']),
'symbol': ['AAPL', 'AAPL', 'AAPL'],
'shares': [100, 200, 50]
})
prices = pd.DataFrame({
'time': pd.to_datetime(['2024-01-01 10:00', '2024-01-01 10:10']),
'price': [185.0, 186.5]
})
# Fuzzy join: match each trade to the nearest preceding price
result = pd.merge_asof(trades.sort_values('time'),
prices.sort_values('time'),
on='time', direction='backward')
print(result)데이터 프로파일링에는 Pandas, 운영 환경에는 SQL
일반적인 작업 흐름은 다음과 같습니다. 대표 표본(예: 처음 100만 행)에 대해 EDA와 데이터 프로파일링에는 Pandas를 사용하고, 변환 로직을 반복적으로 개발한 다음, 핵심 단계를 운영 환경의 규모에 맞는 SQL로 변환합니다. Pandas를 사용하면 즉각적인 시각적 피드백을 바탕으로 빠르게 반복할 수 있고, SQL은 최소한의 인프라로 대규모 환경에서 안정적으로 실행됩니다. 두 환경을 동기화하십시오. Pandas에 새 기능을 추가할 때마다 운영 환경에서 사용할 동등한 SQL 저장 프로시저나 뷰를 작성하십시오.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///data.db')
# Development: sample in Pandas for fast iteration
df_sample = pd.read_sql_query(
'SELECT * FROM orders ORDER BY RANDOM() LIMIT 10000',
con=engine
)
# Explore and prototype:
df_sample['revenue_tier'] = pd.cut(
df_sample['amount'],
bins=[0, 100, 500, float('inf')],
labels=['low', 'mid', 'high']
)
print(df_sample['revenue_tier'].value_counts())
# Production: translate cut logic to SQL CASE WHENpandasql: DataFrames에 SQL 작성하기
pandasql 라이브러리를 사용하면 내부적으로 SQLite를 이용하여 Pandas DataFrames를 대상으로 SQL 쿼리를 직접 작성할 수 있습니다. sqldf('SELECT * FROM df WHERE amount > 100', locals())은 df DataFrame에서 쿼리를 실행합니다. SQL 방식으로 사고하지만 데이터가 이미 Pandas에 있거나, 메모리에 저장된 데이터로 SQL 개념을 가르칠 때 유용합니다. 그러나 대부분의 작업에서는 기본 Pandas보다 느리므로 성능이 아니라 익숙함을 위해 사용하십시오.
# pip install pandasql
import pandas as pd
# from pandasql import sqldf
df = pd.DataFrame({
'product': ['A', 'B', 'A', 'C', 'B'],
'sales': [100, 200, 150, 80, 220]
})
# With pandasql (commented out as it requires install):
# result = sqldf('SELECT product, SUM(sales) AS total FROM df GROUP BY product', locals())
# Equivalent native Pandas:
result = df.groupby('product')['sales'].sum().reset_index()
print(result)결정 프레임워크: 빠른 참조
SQL과 Pandas 중 선택할 때 다음 결정 가이드를 사용하십시오.
- 데이터가 데이터베이스에 있고 규모도 큰가요? 먼저 SQL에서 필터링하고 집계하십시오.
- 사용자 지정 Python 로직이 필요한가요? SQL에서 사전 필터링한 후 Pandas를 사용하십시오.
- 표본으로 탐색적 분석을 수행하나요? Pandas를 사용하면 더 빠르게 반복할 수 있습니다.
- 복잡한 이동 통계가 있는 시계열인가요? Pandas의 rolling/ewm을 사용하십시오.
- 수백만 행에 대한 단순한 GROUP BY인가요? 인덱스가 있는 SQL을 사용하십시오.
- 작은 DataFrames 여러 개가 이미 메모리에 있나요? pd.merge()를 사용해도 됩니다.
- ACID 트랜잭션이 필요한가요? Pandas가 아니라 SQL 데이터베이스를 사용하십시오.
둘을 결합하기: 하이브리드 작업 흐름
가장 실용적인 접근 방식은 각 도구의 강점을 활용하는 하이브리드 작업 흐름입니다. SQL은 대규모 원시 테이블에서 데이터 수집, 대략적인 필터링, 표준 집계를 처리합니다. 그 결과인 관리 가능한 DataFrame을 Pandas에 전달하여 특성 공학, 사용자 지정 지표, 이동 통계, 시각화를 수행합니다. 결과를 제공을 위해 데이터베이스에 다시 기록할 수도 있습니다. 이 작업 흐름은 읽기 쉽고 확장 가능하며, SQL과 Python을 모두 아는 분석가라면 유지 관리할 수 있습니다.
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine('sqlite:///pipeline.db')
# Step 1: SQL coarse aggregation
df = pd.read_sql_query('''
SELECT DATE(order_date) AS date, region, SUM(amount) AS daily_revenue
FROM orders WHERE status = 'completed'
GROUP BY DATE(order_date), region
ORDER BY date
''', con=engine, parse_dates=['date'])
# Step 2: Pandas rolling and pivoting (hard in SQL)
df['7d_avg'] = df.groupby('region')['daily_revenue'].transform(
lambda x: x.rolling(7, min_periods=1).mean()
)
pivot = df.pivot(index='date', columns='region', values='7d_avg')
print(pivot.tail())빠른 확인
이 수업에서 배운 데이터 분석 개념을 제대로 이해했는지 확인해 보십시오.
수업 요약
이 수업에서는 다음을 배웠습니다. SQL은 인덱스가 있는 데이터의 대규모 필터링, 조인, 단순 집계에 뛰어나고, Pandas는 사용자 지정 Python 로직, 복잡한 이동 통계, 탐색적 분석에 뛰어납니다. 가장 좋은 전략은 SQL로 대략적인 축소를 수행하고 Pandas로 관리 가능한 결과에 복잡한 변환을 적용하는 하이브리드 작업 흐름입니다. 다음으로 SciPy를 사용하여 추론 통계를 시작하고 정규성 검정과 기술 통계를 살펴보겠습니다.
AI 튜터와 함께 Python을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“Pandas와 SQL: 알맞은 도구 선택” 강의는 무료인가요?
네 — “Pandas와 SQL: 알맞은 도구 선택” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Pandas와 SQL: 알맞은 도구 선택”에서 뭘 배우나요?
Pandas의 그룹화/병합과 SQL의 GROUP BY/JOIN을 비교하고, 각 변환을 어느 계층에서 처리할지 결정합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“Pandas와 SQL: 알맞은 도구 선택” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- SQLAlchemy로 데이터베이스 연결하기
- Pandas에서 SQL 쿼리 실행하기
- DataFrame을 데이터베이스 테이블에 쓰기
- Pandas와 SQL: 알맞은 도구 선택