오늘은 Python의 Pandas 개인과제와 SQL 코드카타를 동시에 진행하면서, 익숙하다고 생각했던 문법들 속에서 새로운 관점과 기능들을 많이 배우게 된 시간이었다.
Ⅰ. Pandas 개인 과제
1. Lambda 함수
파이썬의 lambda는 익명 함수를 만들 때 사용하는 문법이다. 과제에서는 특정 시간대를 기준으로 "아침/오후/저녁/밤"을 분류해야 했는데, 이럴 때 lambda로 코드를 깔끔하게 작성할 수 있었다.
lambda를 사용하는 이유
- 짧은 조건 분기를 한 줄에 표현할 수 있음
- 굳이 def 로 함수를 정의할 필요 없이 즉성에서 사용 가능
- Pandas의 apply( )와 조합하면 직관적인 데이터 전처리 가능
과제 lambda 활용 예시
df['Time_Category'] = df['Dep_time'].dt.hour.apply(
lambda h: '아침' if 5 <= h < 12
else '오후' if 12 <= h < 18
else '저녁' if 18 <= h < 24
else '밤'
)
2. dt.day_name( )
이번 과제에서 특정 요일에 해당하는 항공편의 평균 가격을 구해야 하는 문제가 있었다. 평소에는 날짜 데이터를 문자 그대로 두거나 to_datetime( ) 함수만 사용했었는데, 요일이라는 새로운 변수(?)가 주어짐에 따라 새로운 함수도 같이 배워볼 수 있었다. pandas의 dt.day_name( )을 사용하면 날짜의 요일 이름(Monday, Wednesday, ...)을 알아서 구해준다.
과제 dt.day_name( ) 활용 예시
df['Date_of_Journey'] = pd.to_datetime(df['Date_of_Journey'], infer_datetime_format=True)
df[df['Date_of_Journey'].dt.day_name() == 'Wednesday']['Price'].mean()
Ⅱ. SQL 코드카타
SQL 코드카타를 진행하면서 레벨이 올라가서 그런지 한 문제에 소비하는 시간이 점점 길어진다. 고민이 길어지는 만큼 앞으로는 고민 과정이나 오답노트를 작성해 놓으면 도움이 될 것 같다는 생각이 들었다.
코드카타 1)
우유, 요거트가 모두 담긴 장바구니(cart_id)를 조회하는 문제에서, 조건을 구현하는 방법에 대해 고민이 길어졌다. where이나 having 절만 생각을 하다 도저히 답이 안 나와 힌트를 찾아보게 되었다. 이중 쿼리를 활용해서 문제를 풀면 두 조건을 모두 만족시킬 수 있었다. 조건을 각각 적용한 테이블을 inner join할 생각을 전혀 못 하고 있었기에 너무 신기했다.
select a.cart_id
from ( select cart_id, name
from cart_products
where name = 'Milk' ) as a
inner join ( select cart_id, name
from cart_products
where name = 'Yogurt' ) as b
on a.cart_id = b.cart_id
order by cart_id
;
코드카타 2)
조회수가 가장 높은 게시물의 첨부파일 경로를 조회하는 문제였다. 조회수가 가장 높은 게시글을 뽑는 과정에서 바보 같은 실수를 했다.
# 나의 잘못된 쿼리 1
select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from ( select board_id, max(views)
from used_goods_board ) as a
inner join used_goods_file as b
on a.board_id = b.board_id
order by b.file_id desc
;
서브쿼리에 board_id와 max(views)를 함께 두면 max(views)의 board_id가 나올거라는 착각을 한 것이다. 이렇니 조회수가 가장 높은 게시글의 id가 제대로 추출되지 않아 제대로된 결과가 나오지 않았다.
다음 방법으로 group by 절과 having 절을 사용해 조건을 구현해보기로 했지만, 원하는 결과가 나오지 않았다.
# 나의 잘못된 쿼리 2
select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from used_goods_board as a
inner join used_goods_file as b
on a.board_id = b.board_id
group by a.board_id
having max(a.views)
order by b.file_id desc
;
그래서 또 힌트를 찾아보고 where절에 사용하는 중첩 쿼리를 사용해 조건을 구현했더니 정답처리가 되었다.
select concat('/home/grep/src/',b.board_id, '/', b.file_id, b.file_name, b.file_ext) as file_path
from used_goods_board as a
inner join used_goods_file as b
on a.board_id = b.board_id
where a.views = ( select max(views) from used_goods_board)
order by b.file_id desc
;
마무리
SQL 문제를 풀면서 오답노트를 할 생각을 못했는데 오늘 팀원들과 저녁 데일리 스크럼을 하면서 오답노트 했던 걸 AI에게 튜터의 페르소나를 부여해 자신에게 부족한 부분을 효율적으로 복습할 수 있도록 도움을 받고 있다는 말을 들었다. 그동안에 사소한 고민이나 어떤 개념에 대해 내가 이해한 느낌들을 잘 정리해뒀다면 나도 그런 방법으로 효율적으로 복습을 해볼 수 있었겠다는 생각이 들었다. 전 팀에서는 그날의 회고를 공유하 스크럼 시간이 없어 다른 사람들의 경험을 들을 기회가 없었는데, 이번에는 들을 수 있어 도움이 많이 되는 것 같다. 이런 부분에서 소통이 정말 중요하다는 것을 다시 한 번 더 느끼게 되었다.
'Data_10기' 카테고리의 다른 글
| 데이터 분포 파악 (0) | 2025.12.05 |
|---|---|
| Python Standard (shift, rolling, expanding) 및 SQL 코드카타 (0) | 2025.12.04 |
| Python Standard - melt, stack, unstack (0) | 2025.12.02 |
| 성취도 평가 및 분반 결정 생각 정리 (0) | 2025.12.01 |
| [기초 프로젝트] 8일차 - 마무리 (0) | 2025.11.28 |