본문 바로가기

직접짠꿀코드/numpy

코호트 분석을 위한 주문 간격이 짧은 중복 데이터 전처리

 

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차원