Today's Study Plans
- [x] 대용량 데이터 다운로드 실습 (시스템환경)
What I've done
- [x] gdown 라이브러리를 활용한 구글 드라이브 폴더 다운로드 시도 및 한계 파악
- [x] Google Drive API + OAuth 2.0 + pydrive2 방식으로 전환하여 안정적 다운로드 구현
- [x] CSV → Parquet 변환 자동화 코드 작성 및 디스크 용량 최적화
- [x] 인코딩 이슈(utf-8-sig / cp949), 데이터 타입 충돌, 구분자 이슈 등 실전 트러블슈팅 경험
핵심 학습 내용 요약
1. gdown의 한계
- download() vs download_folder() 구분 필수
- 익명 요청 기반이라 Rate Limit에 취약 → FileURLRetrievalError 발생
- 폴더 단위 '모 아니면 도' 방식이라 파일 하나만 실패해도 전체 중단
2. Google Drive API + OAuth 2.0 (pydrive2)
- 서비스 계정 키 생성 차단 → OAuth 2.0으로 우회 (사람의 권한을 빌려오는 방식)
- LocalWebserverAuth() → 브라우저 인증 → Access Token 발급 (휘발성, 안전)
- drive.ListFile({'q': query}).GetList()로 폴더/파일 목록 조회 후 개별 다운로드
- 파일 단위 제어 → 실패 지점 정밀 관리 + 이어받기(Resume) 가능
3. CSV → Parquet 변환 (디스크 용량 절감)
- Parquet = 열(Column) 기반 저장, CSV 대비 용량 80~90% 절감
- smart_convert() 함수: 인코딩 시도 → 변환 → 원본 CSV 즉시 삭제로 실시간 용량 확보
- engine='pyarrow', compression='snappy' 조합이 속도/압축률 균형 최적
4. 트러블슈팅 정리
문제 원인 해결
| 한글 깨짐 (카드 폴더) | utf-8-sig로 먼저 읽혀서 에러 없이 통과 | cp949로 인코딩 직접 지정 |
| 한 컬럼으로 묶임 (카드 폴더) | 구분자가 콤마가 아닌 파이프(`\ | `) |
| 데이터 타입 충돌 (통신 폴더) | 숫자 컬럼에 빈칸/특수문자 혼재 | pd.to_numeric(errors='coerce').astype('float32') |
| astype(str) 문제 | Parquet 고유 타입 보존 실패 | astype(str) 제거 • 타입 사전 지정 |
| on_bad_lines='skip' | 데이터 손실 위험 (몇 행 빠졌는지 확인 불가) | 옵션 제거 후 실패 파일 별도 처리 |
5. 타입 사전 지정의 효과
- 메모리 절감 (float64 → float32, str → category)
- 데이터 무결성 (코드성 데이터 문자열 처리, 결측치 대응)
- 로딩 속도 향상 (판다스 타입 스캔 과정 생략)
- Parquet 압축 최적화 (타입 명확 → 더 강력한 압축)
What I've not done yet
- [ ] '카드' 폴더 on_bad_lines='skip' 제거 후 재실행 확인
- [ ] '통신' 폴더 수치 컬럼 사후 처리 후 에러 해결 여부 최종 확인
'[데이터분석] 부트캠프 TIL' 카테고리의 다른 글
| 20260410 TIL (0) | 2026.04.10 |
|---|---|
| 20260409 TIL (0) | 2026.04.09 |
| 20260407 TIL (0) | 2026.04.07 |
| 20260406 TIL (1) | 2026.04.06 |
| 20260403 TIL (0) | 2026.04.03 |