요약 표
| Aspect | pandas | DataStore |
|---|---|---|
| 실행 | Eager (즉시 실행) | Lazy (지연 실행) |
| 반환 타입 | DataFrame/Series | DataStore/ColumnExpr |
| 행 순서 | 유지됨 | 유지됨(자동); 성능 모드에서는 보장되지 않음 |
| inplace | 지원됨 | 지원되지 않음 |
| 인덱스 | 완전 지원 | 단순화됨 |
| 메모리 | 모든 데이터가 메모리에 있음 | 데이터가 소스에 유지됨 |
1. 지연 실행 vs 즉시 실행
pandas (즉시 실행)
DataStore (지연 실행)
왜 중요한가
- 쿼리 최적화: 여러 작업이 하나의 SQL 쿼리로 컴파일됩니다
- 컬럼 프루닝(Column pruning): 필요한 컬럼만 읽습니다
- 필터 푸시다운(Filter pushdown): 필터를 소스에 적용합니다
- 메모리 효율성: 필요하지 않은 데이터는 로드하지 않습니다
2. 반환 타입
pandas
DataStore
pandas 타입으로 변환하기
3. 실행 트리거
| 트리거 | 예시 | 참고 |
|---|---|---|
print() / repr() | print(ds) | 출력하려면 데이터가 필요합니다 |
len() | len(ds) | 행 수가 필요합니다 |
.columns | ds.columns | 컬럼 이름이 필요합니다 |
.dtypes | ds.dtypes | 타입 정보가 필요합니다 |
.shape | ds.shape | 차원 정보가 필요합니다 |
.values | ds.values | 실제 데이터가 필요합니다 |
.index | ds.index | 인덱스가 필요합니다 |
to_df() | ds.to_df() | 명시적으로 변환합니다 |
| 반복 | for row in ds | 순회가 필요합니다 |
equals() | ds.equals(other) | 비교가 필요합니다 |
지연 실행로 유지되는 작업
| 작업 | 반환값 |
|---|---|
filter() | DataStore |
select() | DataStore |
sort() | DataStore |
groupby() | LazyGroupBy |
join() | DataStore |
ds['col'] | ColumnExpr |
ds[['a', 'b']] | DataStore |
ds[condition] | DataStore |
4. 행 순서
pandas
DataStore
rowNumberInAllBlocks()를 사용해 자동으로 추적합니다.
순서가 유지되는 경우
- 파일 소스(CSV, Parquet, JSON 등)
- pandas DataFrame 소스
- 필터링 작업
- 컬럼 선택
- 명시적으로
sort()또는sort_values()를 수행한 후 - 순서를 결정하는 작업(
nlargest(),nsmallest(),head(),tail())
순서가 달라질 수 있는 경우
groupby()집계 후(sort_values()를 사용하면 일관된 순서를 유지할 수 있습니다)- 특정 join 유형으로
merge()/join()을 수행한 후 - 성능 모드(
config.use_performance_mode())에서는 어떤 작업에서도 행 순서가 보장되지 않습니다. 성능 모드를 참조하십시오.
5. inplace 매개변수 미지원
pandas
DataStore
inplace=True는 지원되지 않습니다. 결과는 항상 다시 할당하세요:
왜 inplace를 지원하지 않나요?
- 쿼리 작성(lazy evaluation)
- 스레드 안전성
- 디버깅 용이성
- 더 깔끔한 코드
6. 인덱스 지원
pandas
DataStore
DataStore에서는 소스가 중요합니다
- DataFrame 소스: pandas 인덱스가 유지됩니다
- File 소스: 단순한 정수 인덱스를 사용합니다
7. 비교 방식
pandas와의 비교
equals() 사용하기
8. 타입 추론
pandas
DataStore
명시적 형 변환
9. 메모리 모델
pandas
DataStore
10. 오류 메시지
다양한 오류 발생 원인
- pandas 오류: pandas 라이브러리에서 발생
- DataStore 오류: chDB 또는 ClickHouse에서 발생
디버깅 팁
마이그레이션 체크리스트
- import 문 변경
-
inplace=True매개변수 제거 - pandas DataFrame이 필요한 경우
to_df()를 명시적으로 추가 - 행 순서가 중요하면 정렬 추가
- 비교 테스트에는
to_pandas()사용 - 실제와 유사한 데이터 크기로 테스트
빠른 참고
| pandas | DataStore |
|---|---|
df[condition] | 동일(DataStore 반환) |
df.groupby() | 동일(LazyGroupBy 반환) |
df.drop(inplace=True) | ds = ds.drop() |
df.equals(other) | ds.to_pandas().equals(other) |
df.loc['label'] | ds.to_df().loc['label'] |
print(df) | 동일(실행 트리거) |
len(df) | 동일(실행 트리거) |