😀 Language/- Python

대용량 csv 파일 pyarrow로 pandas 다루기 & excel 저장 (feat. 연구 데이터)

또방91 2023. 4. 7. 14:09
728x90

 

 

 

대용량 csv 파일 pyarrow로 pandas 전처리 &excel 저장 (feat. 연구 데이터)

 

 

 

 

 

의료데이터를 활용한 연구를 하게 되면,

시시각각 변하는 환자들의 상태들을 체크하고 AI 분석을 위해서는

tracking 시계열정보를 활용하게 된다.

 

그렇다보니, 그 tracking term 기준이 몇 초냐 몇 분이냐에 따라 데이터 용량이 천차만별이겠지만

그래도 대용량 데이터가 수집되었다는 사실은 변하지 않는다.

 

데이터 마이닝이 나의 main job은 아니지만,

tracking time series data를 가명화 처리하는 과정으로 인해 

대용량 data에 대해 접하게 되었다.

 

  

 

 

🍎 문제 상황

문제상황 1_  가명화 처리를 위해서는 의료원의 가명화 프로그램을 활용해야하는데, 파일 업로드 상황에서는 excel 확장자만 가능

문제상황 2_ 대용량 csv는 메모장, 엑셀 프로그램으로 열리지 않음

-> 메모장: 간혹 다른 포스팅에서 가능하다고 하지만,  어느정도 용량 선을 넘어버리면 열리지 않음

->  엑셀: 데이터>텍스트/csv 파일 가져오기 메뉴로 로드한다고 해도... 아래와 같은 문구가 뜬다. 

그 문구에 따라서 텍스트 마법사에서 '구분시작행'을 입력 후 시도해봤지만 다 안불러지기도 하고, 여러번 시도하니 응답없음이란 문구가 뜨다가 꺼져버린다.

(*좋은 컴퓨터에서는 성공할지도? 성공한다면 추후 포스팅해보겠다.😉) 

텍스트가져오기 메뉴 시 뜬 팝업창

 

 

 텍스트 마법사를 활용해 그다음 나머지 데이터 가져오기 시도하는 화면

* 참고로 엑셀 한 시트당 최대 보이는 행의 수는 104876행이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

🍎 문제 해결

01. Jupyter 실행 & 필요한 모듈 설치

pip install pyarrow

from pyarrow import csv

 

02. 대용량 CSV 불러오기

# CSV로 불러오고 바로 pandas화
py_df= csv.read_csv("경로/파일명.csv").to_pandas()

*참고로 억단위 raw는 시도해보지 않았지만, 천만단위 raw에서 잘 불러오는 걸 확인하였다.

 

 

판다스로만 사용할 경우, 이제 자유롭게 데이터 EDA 및 전처리 과정 바로 수행하시면 되시고~

나처럼 excel이 필요한 경우, split하여 엑셀에 저장하면 된다!

 

03. Split하여 excel 저장하기

##### 반복문 돌려서 나눠서 저장######

#1. 각 파일로 저장하고 싶을 때
start= 0 #처음 시작
end= 50000 #몇개 나눠서 저장할지(단위)

for i in range(나누고 싶어하는 파일갯수 숫자):
	name= "원하는 파일명"+str(i+1)
    #이 경우 파일명은 <원하는파일명1>, <원하는파일명2> ..... 이런식으로 저장된다.
	py_df.iloc[ start:end, : ].to_excel("저장하고싶은 위치/" + name + ".xlsx")
    start= end
    end= end + 50000
    
    # 마지막 행의 경우, 설정한 단위의 배수가 아닐테니~
    if end > len(py_df):
    	py_df.iloc[ start:len(py_df), : ].to_excel("저장하고싶은 위치/파일명.xlsx")
        break #반복문 종료



#2. 하나의 파일에 각 시트로 저장하고 싶을 때
start= 0 #처음 시작
end= 50000 #몇개 나눠서 저장할지(단위)

for i in range(나누고 싶어하는 파일갯수 숫자):
	name= "원하는시트명"+str(i+1)
    #이 경우 파일명은 <원하는시트명1>, <원하는시트명2> ..... 이런식으로 저장된다.
	py_df.iloc[ start:end, : ].to_excel("저장하고싶은 위치/원하는파일명.xlsx", sheet_name=name)
    #시트이름의 경우 1,2,3 .... 이런식으로 저장됩니다.
    start= end
    end= end + 50000
    
    # 마지막 행의 경우, 설정한 단위의 배수가 아닐테니~
    if end > len(py_df):
    	py_df.iloc[ start:len(py_df), : ].to_excel("저장하고싶은 위치/파일명.xlsx")
        break #반복문 종료

 

 


🍎 참고

대용량 CSV를 로드하기위해선 pyarrow 모듈 말고도 다른 방법들이 여러가지 있는데,

그 중 나에게는 아파치의 pyarrow가 가장 적합했다.

 

사용할 수 있는 방법으로 Apache의 Pyarrow, Dask, pandas의 chunksize 등이 있는데, 

1GB파일을 로드하는데 걸린 시간을 비교실험해 본 재밌는 포스팅이 있어서 추가해본다

https://94ung.tistory.com/39

 

pandas 대용량 csv 파일 읽기 - dask

포스팅 개요 pandas에서 4GB csv 파일을 읽었을 때 노트북이 다운되거나 메모리가 부족하다는 에러 메세지가 나왔다. 검색해 본 결과, Apache의 Pyarrow, Dask, pandas의 chunksize를 이용하는 방법이 나와있었

94ung.tistory.com

 

🍎 한 줄평

위 코드식으로 시도한 뒤, 원활하게 파일형식 변환하여 연구수행 중에 있다 😀혹 위 코드식으로 적용했는데 되지않는 경우 댓글남겨주시기 바란다~ !

 

 

 

 

 

 

728x90