brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Dec 18. 2023

Polars #04

#Decimal #decimal.Decimal

Polars 에서 Decimal 기능을 사용할 수 있는데,

이걸 언제 사용하느냐?!


우리는 이미 Python 에 Float 데이터 타입이 

완벽하게 모든 소수점 자리의 정확성을 보장하지 못함을 인지하고 있음.


예를 들어,

Python 에서 

이런 현상이 발생하곤 한다.


소수점을 완벽하게 맞추려면 보통 Decimal 타입의 데이터를 활용한다.


정확하다.

근데 문제는... 이게 엄청... 느리다.

하지만 정확한 소수점 계산을 할 수 있는 방법이 이 외에 존재하지 않는다.


그래서!

Polars 에서도 Decimal 을 사용할 수 있는데,

간단하게 Float 을 Decimal 로 변경할 수 있는 것 부터 확인한다.



import polars as pl


df = pl.DataFrame(

    {

        "numbers": [

            "40.12",

            "3420.13",

            "120134.19",

            "3212.98",

            "12.90",

            "143.09",

            "143.9",

        ],

        "float_numbers": [

            40.12,

            3420.13,

            120134.19,

            3212.98,

            12.90,

            143.09,

            143.9,

        ]

    }

)


먼저 데이터를 만들고, 확인하면!

numbers 데이터는 문자열, float_numbers 데이터는 float64 타입을 가지고 있다.

우리는 해당 데이터를 Decimal 로 형변환 하려고 한다.

str >> to_decimal 기능을 활용함.



뭐 사실 반올리? 이런 기능도 사용할 수 있는데 이 또한 완벽하게 소수점의 정확성을 담보할 수 없다.


이제 직접 연산을 통해서 어떻게 정확하게 값이 나오는지 확인하면,

(위에 사용한 결과에 이어서)



제법 마음에 든다.

Decimal 연산은 사실 많이 느리다. 그래서 성능도 비교해 보면 좋을 것 같은데,

예를 들어,

Numpy 로 대략 10만개의 소수점을 랜덤으로 생성해서 이를 Decimal 로 변형 후 연산을 해보면 좋겠다.



제법 느리지 않은듯 보인다.


제법 빠른듯 보인다.


대략 이정도의 차이가 발생하는데,

Polars 에서 사용하는 것이 타입을 유지하고 관리하기 훨씬 수훨하다.

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