#NATIVE #PYTHON #POLARS
지난번 포스팅에 이어서,
어떻게 Native API 로 변경할 수 있는지?
또한 그렇게 되었을 때 성능변화는 어떠한지?
에 대해서 알아보려고 한다.
group_by 이후에 map_gorups 로 각각 처리하던 방식을
Native API 로 변경해보면,
# 우선 간단하게 10개의 데이터만 사용해서,
import polars as pl
pre = 1
df = pl.DataFrame({
'user_id': [1, 1, 1, 1, 1, 2, 2, 2, 3, 3]*pre,
'item_id': [101, 101, 102, 101, 103, 201, 201, 202, 203, 203]*pre,
'timestamp': range(0, 10*pre),
'action': ['like', 'search', 'buy', 'like', 'like', 'search', 'buy', 'like', 'buy', 'search']*pre
})
# timestamp 를 추가했다.
result = (
df.sort(['user_id', 'timestamp'])
.with_columns([
pl.col('item_id').shift(1).over('user_id').alias('prev_item'),
pl.col('item_id').shift(2).over('user_id').alias('prev_prev_item'),
pl.col('item_id').n_unique().over('user_id').alias('unique_items')
])
.fill_null(0)
.filter(
~
((pl.col('item_id') == pl.col('prev_item')) &
(pl.col('item_id') == pl.col('prev_prev_item')))
)
.filter(pl.col('unique_items') >= 1)
.drop(['prev_item', 'prev_prev_item'])
)
print(result)
이러면 결과는 이전과 같은 로직이 적용된 결과물을 얻을 수 있다.
성능부분에서 큰 차이를 느끼지는 못했지만
분명 좀 더 깔끔해진 것 같다.
shift, over, n_unique 함수를 기억하면 좋겠다.