После преобразования фрейма данных в массив используется в 8 раз больше памяти. Почему?

#python #pandas #numpy #dataframe

#python #панды #numpy #фрейм данных

Вопрос:

Я хочу использовать StandardScaler в моем фрейме данных. В настоящее время объем df составляет 303 МБ. После применения StandardScaler фрейм данных превратился в массив numpy размером 2529 МБ. Как это возможно? Как мне решить эту проблему?

Я просто преобразовал его здесь вручную и не использовал StandardScaler, но результат тот же. Вычисления намного дольше с таким огромным набором данных. Как я могу решить эту проблему?

     X.info()

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 150930 entries, 0 to 150929
    Columns: 2095 entries, len_description to winery_àMaurice
    dtypes: int32(1), int64(1), uint8(2093)
    memory usage: 303.0 MB

    np.array(X.values).nbytes/1e6

    2529.5868
 

Комментарии:

1. Объем памяти вашего массива примерно в 8 раз больше, чем у фрейма данных. Большая часть ваших данных в фрейме данных имеет dtype unit8. Я предполагаю, что ваш массив numpy имеет dtype float64 (или int64) … следовательно, увеличение памяти в 8 раз.

2. да, это правильно!

3. Так что, одним словом, вы не можете решить эту проблему. Вы можете преобразовать данные в формат float32 или float16.

4. @Phil, зависит от ваших данных.. Почему бы вам сначала не попробовать преобразовать типы в Pandas, т.Е. X.apply(pd.to_numeric, downcast='integer').values.nbytes/1e6 . Если Pandas не может понизиться до int8 , это указывает на то, что у вас где — то есть ценности, которые нельзя сохранить int8 .

5. @phil в зависимости от имеющихся у вас данных. Для больших чисел это определенно произойдет. Обратите внимание, что uint8 можно хранить значения в диапазоне от -128 до 127