brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jul 29. 2024

Polars #11

#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 함수를 기억하면 좋겠다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari