실무로 배우는 파이썬/cm. Python efficiency

pandas보다 속도 빠른 polars의 csv reader & saver 빅데이터 분석의 시작과 끝

에스도비91 2025. 5. 22. 23:02
반응형

오른쪽 러바오는 내가 직접 찍은 사진!!

 

파이썬으로 pandas만 쓰시나요?

** pandas와 🐼는 관련이 없습니다.

panel data(다차원 시계열 데이터)의 약자

 

 

빅데이터를 다룬다면 polars도 해야합니다.

왜냐? 훨~씬 빠르거든요!!

 

 

오늘 정리해볼 파이썬 함수 코드

bigdata 분석의 시작과 끝이라 할 수 있는

csv reader와 saver 읽기와 저장하기!!

 

pandas로 read_csv, to_csv로 정말

단순하게 코드를 짤 수도 있지만, 다루는 데이터가

GB단위를 넘어가 속도 압박에 이것저것 맞춰주기

까다로운 polars를 쓰고 batch size 설정 잘못해서

회사 컴을 먹통으로 만들어가며 이번이 최종본이다!

라는 생각을 수차례 한 뒤, 이제는 정말 마지막이다..

라고 생각하며 공유합니다.

 

def csv_reader(path, use_cols=None, plr=0): # 국제표준 UTF-8
    header=pd.read_csv(path, nrows=0) ; cols=list(header.columns) if use_cols is None else use_cols
    if plr==1: # polars에서 dtype str은 Utf8
        cl_N={c: pl.Utf8 for c in header.columns.tolist() if c in cols}
        pdf=pl.read_csv(path, batch_size=int(1E5/len(cols)), schema_overrides=cl_N, columns=cols)
        return pdf.select(sorted(pdf.columns)) # polars는 column 순서도 고려됨 concat 등..
    else: return pd.read_csv(path, dtype=str, usecols=cols)
def csv_saver(df, path, plr=0): 
    df.write_csv(path, batch_size=int(1E5/len(df.columns))) if plr==1 else df.to_csv(path, index=False)

 

이게 바로 가장 최근 업데이트 한 함수 코드!!

path에는 절대경로를 써도 되고, 코드와 같은

위치에서 쓴다면 파일명만 적어도 됩니다.

일부 column들만 가져올꺼면 use_cols 부분에

리스트로 담으면 되고, polars로 쓸 경우엔 plr=1

e.g.) csv_reader(test.csv, plr=1)

 

초반에는 인코더로 cp949 등 여러모로 써봤는데

UTF-8이 국제표준이자 한글 지원도 됩니다.

pandas의 read_csv는 따로 encoder를 명시하지

않으면 default로 Utf8을 씁니다. 전부 str type으로

불러오고, 이후, type 변경해서 쓰는게 편하더라구요.

 

polars의 경우 if문 밑을 보면 column별 타입 지정에,

컬럼 순서를 명시하지 않으면 멋대로 불러와서 이후,

concat 등 작업에 지장이 생기니 일일이 챙겨야..ㅠ

 

또 하나, batch_size 항목이 있는데

이건, polars로 데이터를 몇 행씩 읽을꺼냐? 입니다.

제가 처음 사용하던 데이터가 대략 30개 컬럼에

수천만 행(rows)이여서 대략 10,000 정도로 썼는데

(30*10,000 행렬 데이터 씩 read)

Memory(bytes)=batch_size×N_cols×Avg_col_size

 

최근 업무가 바뀌면서, 확인한 데이터 형식은

항목 별로 column화시킨 pivot 된 자료였습니다.

대략 만오천 columns에 5만 rows.. 

이걸 똑같이 batch size를 1만으로 했으니...

(15,000*10,000 행렬 데이터씩.. 로드한셈)

한번에 뭉텅이로 작업이 들어가니 컴퓨터가

버틸리가 없죠.. 렉 걸리고 먹통되고 난리였습니다.

그러니 batch_size는 1E5/N_cols(df 컬럼 수)

반비례 식으로 적당히 잡아주면 끝~!!

 

반응형