[실습] Pandas 데이터 실습 및 ETL Pipeline 체험하기

윤상혁·2025년 11월 21일

이번 게시글은 필요한 부분만 글을 쓰려고 합니다.

제 github 링크를 올려드리오니, 여기서 참고하시면 될 거 같습니다.


1. Pandas 데이터 실습

'sales_data.ipynb' Jupyter Notebook으로 진행하였습니다.

아무래도 일반 파이썬 파일보다는 셀 단위로 실행이 되어서, 데이터 분석하기에는 매우 편안했습니다.

https://github.com/pilmalion114/data_engineer_portfolio/tree/main/phase%201-3

위 링크를 참고해서, '.ipynb'를 참고하시면 될 거 같습니다.

주석 설명도 상세히 적혀있어서 이해하시기에 편하실 겁니다.

https://github.com/pilmalion114/data_engineer_portfolio/blob/main/phase%201-3/sales_data.ipynb
->.ipynb 파일 링크


2. ETL Pipeline 체험하기

https://github.com/pilmalion114/data_engineer_portfolio/tree/main/phase%201-3/ETL_Pipeline

총 5개의 파일이 있습니다.

1.config.py(설정 파일)
2.Extract.py(원본 데이터 추출 파일)
3.Trasnform.py(원본 데이터 특정 형식으로 변환하는 파일)
4.Load.py(저장을 담당하는 파일)
5.main.py(메인문 실행하는 파일)

ETL은 'Extract(추출)' -> 'Transform(가공)' -> 'Load(저장)' 하는 단계라고 합니다.
실무에서 많이 쓰인다고 합니다. 일종의 자동화 과정이라고 보면 될 듯합니다.

해당 링크에 각 파이썬 파일에도 주석이 상세히 적혀 있으니 이를 참고하시면 될 거 같습니다.


2-1. 각 파이썬 파일 결과 첨부

1. 'extract.py'

$ python extract.py
=== extract.py 테스트 시작 ===

[1. DB에 있는 날짜들 확인]
C:\Users\dc\Desktop\새로운 포트폴리오를 위한 폴더\데이터,AI\포트폴리오용\데이터 엔지니어링\실습\data_engineer_portfolio\phase 1-3\ETL_Pipeline\extract.py:79: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
df_dates = pd.read_sql("select distinct date from sales order by date asc", conn)
date
0 2025-11-10
1 2025-11-11
2 2025-11-12
3 2025-11-13
4 2025-11-14
5 2025-11-15
6 2025-11-16
7 2025-11-17

[2. 2025-11-10 날짜로 테스트]
C:\Users\dc\Desktop\새로운 포트폴리오를 위한 폴더\데이터,AI\포트폴리오용\데이터 엔지니어링\실습\data_engineer_portfolio\phase 1-3\ETL_Pipeline\extract.py:55: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
df = pd.read_sql(query,conn)

✅ 성공! 30건 추출됨
[처음 5줄][처음 5줄]
date category product quantity price
0 2025-11-10 의류 티셔츠 11 139249
1 2025-11-10 가구 서랍장 17 820154
2 2025-11-10 가구 의자 11 345421
3 2025-11-10 가구 책장 9 388113
4 2025-11-10 의류 운동화 5 198888


2. 'transform.py'

$ python transform.py
=== transform.py 테스트 ===
C:\Users\dc\Desktop\새로운 포트폴리오를 위한 폴더\데이터,AI\포트폴리오용\데이터 엔지니어링\실습\data_engineer_portfolio\phase 1-3\ETL_Pipeline\extract.py:55: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
df = pd.read_sql(query,conn)
<class 'pandas.core.frame.DataFrame'>

[추출된 원본 데이터: 16건]
date category product quantity price
0 2025-11-17 전자 모니터 9 125360
1 2025-11-17 식품 빵 4 22091
2 2025-11-17 식품 음료수 14 41214
3 2025-11-17 가구 의자 15 835209
4 2025-11-17 도서 자기계발서 16 21522

[변환된 리포트: 4개 카테고리]
category total_sales total_quantity avg_price product_count
0 가구 43013710 50 866540.500000 4
1 도서 1500082 54 31212.333333 6
2 식품 1330720 36 31652.500000 4
3 전자 2256480 18 125360.000000 2


3. 'load.py'

->'load.py'의 'daily_reports' 테이블 결과물.
->'def load_to_db(df,report_date)' 함수 부분

※.csv나 .log 이런 파일들은 github에 있으나, MySQL 테이블 생성한 것은 없으므로, 따로 사진을 첨부하였음을 알린다.


4. 'main.py'

$ python main.py
C:\Users\dc\Desktop\새로운 포트폴리오를 위한 폴더\데이터,AI\포트폴리오용\데이터 엔지니어링\실습\data_engineer_portfolio\phase 1-3\ETL_Pipeline\extract.py:55: UserWarning: pandas only supports SQLAlchemy connectable (engine/connection) or database string URI or sqlite3 DBAPI2 connection. Other DBAPI2 objects are not tested. Please consider using SQLAlchemy.
df = pd.read_sql(query,conn)


3.(개념 설명)Github 터미널 명령어 개념

cd data_engineer_portfolio

git init 
git add .
git commit -m "Initial commit: Phase 1-2 & Phase 1-3"
git branch -M main
git remote add origin https://github.com/pilmalion114/data_engineer_portfolio.git
git push -u origin main

※설명(처음 로컬 폴더 -> github 원격 저장소에 올릴 때)

1.git init: 현재 폴더(data_engineer_portfolio)를 git 저장소로 초기화. 즉, 로컬 폴더 -> git 저장소 형태로 변환됨. git init 해제하려면, 'rm -rf .git(강제로(-rf) .git 폴더(저장소)를 제거한다. 그러면 다시 로컬 폴더로 돌아옴.) 하면 된다. 혹여나 Vscode의 'Source Control'에서 git init한 상태로 discard 하지 말아라. 그러면 강제 휴지통 행임.(휴지통에서 다시 복원하면 원래 폴더 자리로 돌아옴.)

2.git branch -M main: 현재 브랜치 이름을 'main'으로 바꿔줘. git은 기본 브랜치를 master로 만들지만, github는 요즘 main을 기본으로 씀. 이름 맞춰주는 작업임. '-M'은 'Move+force'로 강제로 이름 변경한다는 의미이다.

3.git remote add origin [URL]: 내 로컬 저장소를 Github 원격 저장소랑 연결해라. origin은 원격 저장소의 별명으로 관습적으로 origin을 많이 쓴다.

4.git push -u origin main: 내 로컬의 main 브랜치를 origin(Github)에 올려줘. push는 밀어넣기(업로드), -u는 'set-upstream'으로 기본 연결 설정이고, origin은 github 저장소를, main은 브랜치 이름이다. 이렇게 하고 다음부터는 git push만 해도 자동으로 origin/main으로 간다.

※브랜치란?

※origin을 다른 이름으로?


※설명_2(기존에 올린 파일에서 수정하고 다시 원격 저장소(github)에 올릴 때는?)

1. git add

// 전체 변경사항
git add .

// 또는 특정 파일만
git add config.py
git add README.md

2. git commit

git commit -m "메시지 내용"

// 예시:
git commit -m "README 추가"
git commit -m "config.py 수정"
git commit -m "버그 수정"

3. git push

git push

// 또는 명확하게
git push origin main


<전체 흐름>

// 1. 파일 수정 (VS Code 등에서)

// 2. 변경사항 확인
git status

// 3. 추가
git add .

// 4. 커밋
git commit -m "수정 내용 설명"

// 5. 푸시
git push


※cf.) Q. 으흠 git init을 했으니, 그럼 해제하지 않으면 계속 git init인 상태네?
A. 정확함. git init을 한번하면 계속 유지된다.

->'git init'이 해제된 상태.
->내가 일부러 'rm -rf .git'으로 해제시킬 수도 있으나, Vscode에서 다른 폴더를 열면 자동적으로 .git이 해제되어 로컬 폴더로 돌아가기도 한다.

※주의할 점
->하지만, git init을 명령어로 다시 치면 안된다.

이렇게 .git 폴더가 있는데 또 git init을 하면 오류가 생길 수 있다.

※해결 방안
1. 좀만 기다려본다. -> 기다리다보면, 자동으로 다시 연결이 된다.

-> 이렇게 .git 폴더가 있으면 git init을 다시 명령어로 치지 말자!

2. 'git status(git 상태)', 'git remote -v(원격 저장소(github)와 연결되어 있는지 확인)' 명령어를 통해 git 연결이 되어있는지 확인한다.

이렇게 나오면 연결이 되어있다는 뜻이다.

※Q2. 내가 .git을 삭제하고 다시 연결했을 시에는?


※cf.) 이렇게 '아이보리색'으로 변경된 파일이 수정된 파일이다.


※본인이 전에 정리한 github 관련 문서

https://velog.io/@pilmalion114/%EC%B4%88%EB%B3%B4%EC%8B%AC%ED%99%94-git%EC%97%90-%EB%8C%80%ED%95%9C-%EB%AA%A8%EB%93%A0-%EA%B2%83-%EC%B5%9C%EC%A2%85-%EC%A0%95%EB%A6%AC%EB%B3%B8

※혹은 claude,gpt5 같은 ai에게 현 상황에 대해서 github 질문을 하면 상세하게 알려줌.(내가 이 글에서 쓰지 않은 경우들에 대해 얘기를 하는 것임.)
->ex.) 'git push -u origin main'을 할 때, 권한 설정을 위해 token을 발급 받아야한다는 등...


4. 마무리

이렇게 해서, 데이터 엔지니어링의 2번째 실습인
'Pandas 실습' 및 'ETL 파이프라인 체험'을 해보았습니다.

오늘도 제 글을 봐주셔서 감사합니다 :) bb

다음에 새로운 걸로 찾아뵙도록 하겠습니다!

profile
통합형 개발자. 기획부터 개발, 자동화까지. 문제를 구조적으로 이해하고, AI를 능동적으로 활용해 본질적인 해결책을 제시하는 사람입니다.

0개의 댓글