6장. 데이터 조회 도구 구현
주문 데이터와 pandas 조회 — 세 줄로 주문 하나를 찾는다
한 줄 요약
도구가 조회할 수 있는 정보는 모두 data/orders.csv 안에 있습니다. 이 파일을 pandas로 읽어 메모리에 올려 두고, 조건으로 고르기 → 비었는지 확인 → 첫 줄 꺼내기 세 줄로 주문 하나를 찾습니다.
1. orders.csv에 무엇이 있는가
data/orders.csv에는 주문 80건이 들어 있습니다. 한 줄이 주문 하나입니다.
| 열 | 뜻 | 비고 |
|---|---|---|
order_id |
주문번호 | HR + 날짜 + 일련번호 |
customer_id |
주문한 고객 | customers.csv와 이어집니다 |
product_name, option, quantity |
상품명, 옵션, 수량 | |
order_amount |
결제 금액 | |
ordered_at |
주문 일시 | |
order_status |
주문 상태 | 결제완료 / 배송준비 / 배송중 / 배송완료 / 취소 / 반품접수 |
courier, tracking_no |
택배사, 송장번호 | 출고 전에는 비어 있습니다 |
shipped_at, delivered_at |
출고일, 배송완료일 | 그 단계 전에는 비어 있습니다 |
recipient, address |
수령인, 배송지 | 개인정보 |
여기서 두 가지를 미리 봅니다.
- 비어 있는 칸이 있습니다. 배송준비 상태인 주문에는 송장번호가 없습니다. 도구는 이 빈칸을 어떻게 돌려줄지 정해야 합니다.
- 도착 예정일은 어디에도 없습니다. 데이터에 없는 것은 도구가 돌려줄 수 없고, 모델도 답해서는 안 됩니다.
2. 파일을 읽어 둔다
pandas는 표 모양의 데이터를 다루는 파이썬 라이브러리입니다. 2장에서 문의 로그 40건을 셀 때 이미 썼습니다.
ORDERS = pd.read_csv(DATA_DIR / "orders.csv", dtype=str)
| 부분 | 뜻 |
|---|---|
DATA_DIR / "orders.csv" |
config.py가 알려 주는 data 폴더 안의 파일. 어디서 실행해도 같은 파일을 가리킵니다 |
dtype=str |
모든 열을 문자열로 읽습니다 |
ORDERS |
읽은 표를 담아 둔 변수. 파일 맨 위에서 한 번만 읽고, 도구가 불릴 때마다 다시 읽지 않습니다 |
dtype=str은 꼭 필요합니다. 이것을 빼고 읽으면 pandas가 송장번호를 숫자로 받아들여, 83455521031이 83455521031.0이 됩니다. 송장번호와 주문 금액은 계산할 숫자가 아니라 그대로 전해야 할 글자입니다.
3. 주문 하나를 찾는 세 줄
두 도구가 똑같이 쓰는 조회입니다.
row = ORDERS[ORDERS["order_id"] == order_id]
if row.empty:
return {"found": False, "message": f"주문번호 {order_id} 를 찾을 수 없습니다."}
r = row.iloc[0]
| 줄 | 하는 일 |
|---|---|
ORDERS[ORDERS["order_id"] == order_id] |
주문번호가 같은 줄만 골라 냅니다. 안쪽 비교가 줄마다 참/거짓을 만들고, 바깥 ORDERS[...]가 참인 줄만 남깁니다 |
row.empty |
골라 낸 결과가 0건이면 참입니다 |
row.iloc[0] |
골라 낸 것 중 첫 줄을 꺼냅니다. 그 뒤로는 r["product_name"]처럼 열 이름으로 값을 읽습니다 |
가운데 줄이 없는 주문번호를 처리하는 자리입니다. 이 확인 없이 row.iloc[0]을 부르면 0건일 때 오류로 멈춥니다.
4. 빈칸은 어떻게 읽히는가
CSV의 빈칸을 pandas로 읽으면 NaN이라는 특별한 값이 됩니다. "값이 없음"을 뜻하는 표시이고, 문자열이 아닙니다. dtype=str로 읽어도 빈칸은 NaN으로 남습니다.
그래서 "송장번호가 있는가"는 이렇게 확인합니다.
if not isinstance(r["tracking_no"], str) or r["tracking_no"] == "":
"문자열이 아니거나, 빈 문자열이면"이라는 뜻입니다. 문자열이어야 할 칸이 문자열이 아니면 비어 있는 것입니다.
NaN을 확인하지 않고 그대로 돌려주면 모델은 "tracking_no": NaN 같은 낯선 값을 받습니다. 그것을 어떻게 읽을지는 모델의 짐작에 맡겨집니다. 빈칸의 뜻은 코드가 해석해서 넘겨야 합니다. 그 방법이 다음 절의 내용입니다.
핵심 정리
- 도구가 돌려줄 수 있는 정보는
orders.csv의 열이 전부입니다. 도착 예정일은 없습니다. dtype=str로 읽어야 송장번호가 숫자로 바뀌지 않습니다.- 주문 하나는 조건으로 고르기 →
.empty확인 →.iloc[0]세 줄로 찾습니다. - CSV의 빈칸은 NaN으로 읽힙니다. 문자열인지 확인해 가려냅니다.
- 파일은 한 번만 읽어
ORDERS에 담아 둡니다.