2014-11-18 5 views
2

HDFStore.append을 사용할 때 데이터 프레임의 인덱스를 저장하는 데 사용되는 데이터 형식을 제어하는 ​​방법이 있습니까?팬덤 HDFStore : dtype 인덱스 변경

팬더 인덱스는 항상 hb5 파일에 64 비트로 저장됩니다. 저장소 효율성을 높이고 인덱스 열의 크기를 줄이려합니다.

나는 독특한 3 열 다중 지수가 UINT64 인덱스로 저장하는 것은 내 응용 프로그램에서 공간의 엄청난 낭비 :

df.set_index(['indA', 'indB', 'indC'])HDFStore.append 전에 결과를 설정하는 다음과 같은 데이터 프레임 단순히

In [15]: df.dtypes 
Out[15]: indA    int32 
indB    int16 
indC    int8 
data    float32 
dtype: object 

감안할 indA, indBindCInt64Col으로 hdf5 파일에 저장됩니다.

팬더 인덱스를 설정하고 대신 pytables 데이터 열을 지정하지 않으면 :

store.append('mytable', df, data_columns=['indA', 'indB', 'indB']) 

indA, indBindC은 그러나 추가 Int64Col이 HDF5 파일에 저장됩니다, 원래 dtypes 함께 저장됩니다.

이것은 실제로 도움이되지 않습니다. 원래의 dtypes에 저장함으로써 3 개의 ind 열에 대해 56 비트를 저장/보존하고 있습니다. 그러나 여분의 (불필요한) 인덱스 열은 64 비트입니다 ...

아이디어가 있으십니까?

답변

2

올바른 접근 방법입니다. 데이터 열은 검색 기능을 제공하고 dtype 보존을 제공합니다. 인덱스 스토리지는 현재 상당히 고정되어 있습니다.

색인을 저장할 옵션을 제공하는 것이 현안입니다 (here 참조). 나는 그것에 대해 약간의 연구를했지만, 우선 순위가 높은 ATM은 아닙니다. 환영합니다.

저장 공간을 줄이려는 경우 일반적으로 압축을 사용하는 것이 좋습니다. 상대적으로 적은 양의 저장 공간을 확보하기 위해 많은 작업을 수행하고있는 것처럼 보입니다.하지만 이는 my2c입니다.

+0

제프를 분명히 해주셔서 감사합니다. 스토리지 효율성을 최적화하려고 시도한 것 같습니다. 데이터 열에서 float64에서 float32로 이동하여 약 50 %의 비용을 절감 한 후, 필자는 롤업 중이 었습니다. 추가 int64 인덱스를 제거하는 것이 옳습니다. 정말로 가치가있는 것은 아닙니다 : 나는 찾고 있던 구조로 pytables hdf5를 만들었습니다. 인덱스를 데이터 열로 사용하는 HDFStore hdf5와 비교하면 저장 용량은 약 2 %에 불과합니다. (두 bzip2 압축.) - 혼전의 가치가 분명히 없습니다. 추가 된 int64 인덱스에서 압축이 잘 작동하는 것으로 보입니다. – ARF