pandas.read_csv() 에서 왠만하면 컬럼타입을 지정하자

다음과 같은 파일이 있다 :

CODE,DATE,TIME,OPEN,HIGH,LOW,CLOSE,VOLUME
000020,20190502,901,9770,9790,9770,9790,98
000020,20190502,902,9830,9830,9830,9830,1
000020,20190502,903,9830,9850,9830,9850,1

그렇다. 이건 하루치 분봉 데이터를 모은 것으로, 46M 정도의 크기이다.

이를 다음과 같이 나이브하게 로드했다:

>>> df=pd.read_csv('test.csv')
sys:1: DtypeWarning: Columns (0) have mixed types. Specify dtype option on import or set low_memory=False.

분봉이므로 9시 1분부터 오후 3시 30분까지 383개의 데이터가 존재한다.

그런데 다음과 같은 명령으로 조회시 특정 컬럼에 대해서만 개수가 모자라는 현상이 있었다 :
>>> df[df['CODE']=='071970']

262140  071970  20190502  1029  5170  5170  5170   5170       1
262141  071970  20190502  1030  5170  5170  5170   5170       0
262142  071970  20190502  1031  5140  5140  5130   5140     177
262143  071970  20190502  1032  5140  5140  5130   5140       0

[92 rows x 8 columns]

중간에 전처리가 잘못됐나 열심히 살펴봤지만 문제 없다.

그런데 메시지를 다시보면, 타입 경고가 떠있다. stackoverflow 느님에 의하면. pandas 가 컬럼 타입을 동적으로 추론하는 데에는 많은 메모리가 소모된다고 한다.

그것과 이것이 무슨 관계일까? 라는 의심은 들었으나, 다음과 같이 타입을 명시해봤다.

>>> df = pd.read_csv(infile,error_bad_lines=True,dtype={'CODE':np.str})

262431  071970  20190502  1520  5120  5120  5120   5120      56
262432  071970  20190502  1521  5120  5120  5120   5120       0
262433  071970  20190502  1530  5150  5150  5150   5150     583

[382 rows x 8 columns]

Boom!

왜 이런 문제가 생기는 것인지는 내부 구조까지 들여다보지는 않았지만, 어쨌든 제목과 같이 중요한 교훈을 얻었다.

끝.

댓글

이 블로그의 인기 게시물

스프링 컨텍스트 설정파일과 URI 경로를 제대로 못찾는 삽질