pandasのread_csv時にdtypeを指定してメモリの節約

f:id:taigok:20190122215238j:plain

Kaggleで大きいデータの取り扱い

Microsoft Malware Predictionというコンペに参加しています。 このコンペでは与えられたデータが大きく、普通にread_csvだとローカルPCではメモリに乗りきりません。 こんな時いくつか方法がありますが、今回はread_csvのdtype指定についてまとめます。データは4.08 GBです。

pandasのread_csv時にdtypeを指定

pandasの仕様上、read_csv時にdtypeを指定しないと、整数はint64 、小数はfloat64 が勝手に割り当てられるようです。なので、必要最低限の型を割り当てる必要があります。

dtypes = {
        'MachineIdentifier':             'category',
        'ProductName':                   'category',
       ・
       ・
       ・
        'OsSuite':                             'int16',
        'OsPlatformSubRelease':   'category',
        'Census_IsVirtualDevice':  'float16',
        'Census_IsTouchEnabled': 'int8',
        'Census_IsPenCapable':     'int8',
        'Wdft_IsGamer':                   'float16',
        'Wdft_RegionIdentifier':      'float16',
        'HasDetections':                  'int8'
        }
df_train = pd.read_csv('../input/train.csv', dtype=dtypes)

ではそもそもメモリに乗らないデータのカラムごとの型をどう見極めればいいでしょうか。方法としてはいくつかあると思いますが、read_csv時に読み込む行数を少なくしてデータを確認して必要なデータ型を調べる方法です。

df_train = pd.read_csv('../input/train.csv', nrows=10000)
df_train.head(10000)

参考