1. 문제정의
- E-커머스에서 고객이 여러 건의 주문을 한다.
- 고객의 여러 주문 건 중 N일(예시) 내 주문 건은 하나의 주문으로 통합하고 싶다.
2. 해결방향 (한줄요약)
- 1차원 Array끼리 timestamp 차이를 구하고, np.where로 짧은 부분은 제외시킴
3. 고민한 것들
- 방법은 정말 여러가지가 있을 수 있지만, NumPy를 써서 속도를 향상시킴.
- df.query 보단 boolean mask를 써서 속도를 향상시킴.
4. 코드
# 이전 날짜와 비교하는 함수 정의
def make_real_order_date_r(tmp):
# 1) before date 만들기
before_date = tmp['order_date'].to_numpy() ### timestamp -> np.datetime64
before_date = np.insert(before_date, 0, before_date[0])
before_date = np.delete(before_date, -1)
# 2) order date 만들기
order_date = tmp['order_date'].to_numpy()
# 3) timedelta calculate
td = order_date - before_date
td = td.astype('timedelta64[D]')
td = td.astype('int')
# 4) 7일 이내 건만 filtering
id_filtered = np.where(td < 7)[0]
id_filtered = id_filtered.tolist()
del id_filtered[0] # 기준점은 제거
tmp_r = tmp.reset_index()
final_oid = tmp_r.loc[~tmp_r.index.isin(id_filtered)]['id'].tolist()
return final_oid
# uid를 돌면서 하나씩 탐색
bin_lst = []
for uid in uid_lst:
# 1) boolean mask
# tmp = dfh.query('members_uid == %d' %uid)
tmp = dfh[dfh['members_uid'] == uid]
# 2) filtering oid_lst
oid_lst = make_real_order_date_r(tmp)
bin_lst.append(oid_lst)
# untie secondary list
bin_lst = sum(bin_lst, []) # 2차원 -> 1차원