Table: Prices
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| product_id | int |
| start_date | date |
| end_date | date |
| price | int |
+---------------+---------+
(product_id, start_date, end_date)는 이 테이블의 기본 키입니다.
각 행은 start_date부터 end_date까지의 기간 동안 product_id의 가격을 나타냅니다.
각 product_id에 대해 겹치는 기간은 없습니다. 즉, 동일한 product_id에 대해 두 개의 겹치는 기간은 존재하지 않습니다.
Table: UnitsSold
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| product_id | int |
| purchase_date | date |
| units | int |
+---------------+---------+
이 테이블은 중복된 행을 포함할 수 있습니다.
각 행은 판매된 각 제품의 날짜, 수량, 및 product_id를 나타냅니다.
문제
각 제품에 대한 평균 판매 가격을 찾는 솔루션을 작성하세요.
average_price는 소수점 둘째 자리까지 반올림해야 합니다.
만약 제품이 판매된 수량이 없다면, 그 제품의 평균 판매 가격은 0으로 간주합니다.
결과 테이블은 순서에 상관없이 반환해주세요.
결과 형식은 아래 예시와 같습니다.
Example 1:
Input:
Prices table:
+------------+------------+------------+--------+
| product_id | start_date | end_date | price |
+------------+------------+------------+--------+
| 1 | 2019-02-17 | 2019-02-28 | 5 |
| 1 | 2019-03-01 | 2019-03-22 | 20 |
| 2 | 2019-02-01 | 2019-02-20 | 15 |
| 2 | 2019-02-21 | 2019-03-31 | 30 |
+------------+------------+------------+--------+
UnitsSold table:
+------------+---------------+-------+
| product_id | purchase_date | units |
+------------+---------------+-------+
| 1 | 2019-02-25 | 100 |
| 1 | 2019-03-01 | 15 |
| 2 | 2019-02-10 | 200 |
| 2 | 2019-03-22 | 30 |
+------------+---------------+-------+
Output:
+------------+---------------+
| product_id | average_price |
+------------+---------------+
| 1 | 6.96 |
| 2 | 16.96 |
+------------+---------------+
설명 :
평균 판매 가격 = 제품의 총 가격 / 판매된 제품 수.
제품 1의 평균 판매 가격 = ((100 * 5) + (15 * 20)) / 115 = 6.96
제품 2의 평균 판매 가격 = ((200 * 15) + (30 * 30)) / 230 = 16.96
✏️ 풀이
import pandas as pd
def average_selling_price(prices: pd.DataFrame, units_sold: pd.DataFrame) -> pd.DataFrame:
# 구매 기간에 맞는 price join하기
df = pd.merge(prices, units_sold, how='left', on='product_id')
df = df[(df['start_date'] <= df['purchase_date']) & (df['end_date'] >= df['purchase_date'])]
# 제품별 평균 가격 구하기
result = df.groupby('product_id').apply(lambda x : round((x['price'] * x['units']).sum() / (x['units'].sum()), 2)).fillna(0).reset_index(name='average_price')
return result
1. product_id 로 join
2. 1번에서 구매 일자가 start ~ end 사이에 있는 데이터만 남김
3. 제품별로 평균 판매 가격 구하기
풀이 방식 자체는 금방 생각해냈는데 apply() 는 많이 써보지 않아서 코드로 쓰는데 조금 어려움이 있었던 것 같다
📚 개념정리
apply() ? 데이터프레임의 각 행이나 열에 복잡한 연산을 적용하여 새로운 파생 컬럼을 생성할 수 있도록 하는 함수
apply() 함수는 lambda() 함수를 적용하거나 사용자 정의 함수를 적용할 수 있다.
# lambda 적용 예시
DataFrame명.apply(lambda x : x['칼럼명']들의 조건식
if x['칼럼명']들의 조건식
else (x['칼럼명']들의 조건식 또는 값), axis = 1)
# 사용자 함수 적용 예시
DataFrame명.apply(사용자함수명)
문제 풀때 참고한 함수 개념 정리 링크 : http://wikidocs.net/46758