З Pandas покладіть свої великі масиви даних на дієту від Французької школи штучного інтелекту Седріка Соареса

Дуже великі набори даних - це кошмар для вчених з даних. На щастя, бібліотеки Pandas дозволяють маніпулювати ними, різко і в найкоротші терміни оптимізуючи їх вагу.

Будь-який Data Scientist стикається з колосальними наборами даних. Вони часто складаються з декількох мільйонів записів. Ці Pandas DataFrames споживають багато пам'яті та обчислювального часу. Тому надзвичайно важливо оптимізувати їх для візуалізації, маніпулювання та використання їх у моделях машинного навчання. Ось як це виправити за допомогою мінімуму маніпуляцій.

pandas

Наша демонстрація базується на частині набору даних автомобільних перевірок, проведених поліцією США між 2000 та 2018 роками. Дані, зібрані Університетом Стенфорда, ідентифікують близько 50 000 сесій перевірки дорожнього руху, класифікованих за штатами. Тільки набір даних штату Нью-Йорк представляє майже 8 мільйонів записів.

Виявлення набору даних

Наш файл csv важить 1 ГБ. Гірше того, що при читанні з Pandas DataFrame споживає 6,5 ГБ ресурсу пам'яті. Зверніть увагу на те, що попереднє визнання для поглибленої оцінки зайнятості пам'яті функцією pandas.DataFrame.info () вимагає передачі параметра "глибокий"

При детальному розгляді наш DataFrame містить 18 стовпців. Більшість складаються з рядків, які Пандас розглядає як об'єкти.

Оптимізація даних цього типу призведе до значної економії ресурсів пам'яті.

Значний виграш від класифікації об’єктів

Один з ефективних способів зробити це - присвоїти індекс кожному дуже надлишковому об’єкту. У майбутніх операціях Pandas використовуватиме останню, яка менше коштує в космосі. Метод життєздатний лише в тому випадку, якщо кількість унікальних об’єктів становить більше 50% від загальної кількості об’єктів. Який випадок у даних, зібраних Стенфордом.

Наприклад, стовпець "subject_sex" містить лише значення "жіночий" та "чоловічий".

Під час процесу оптимізації кожен стовпець тестується у циклі, щоб перевірити поріг унікальних значень, які можуть або не можуть викликати індексацію.

Нижче наведено метод тестування прибутків після кожної оптимізації.

Давайте використаємо його вперше на категоризованих об’єктах.

Ми спостерігаємо, що споживання пам'яті зменшилось на 61%.

Панди занадто щедрі у кодуванні числових значень

Переходимо до числових значень. За замовчуванням Pandas кодує числа в 64 біти. У більшості випадків діапазон кодування є великим. Дійсно, для цілих чисел стандарт дозволяє їх кодування в інтервалі від -9x10¹⁸ до 9x10¹⁸.

Крім того, за замовчуванням Pandas кодує всі цілі числа, позитивні чи негативні. Це призводить до половини часто невикористаного діапазону кодування .

Щоб виправити це, бібліотека пропонує функцію pd.to_numeric () для оптимізації кодування числових значень. Це перетинає DataFrame, стовпець за стовпцем і вибирає найбільш ефективний діапазон кодування (8, 16, 32 або 64 біти) для кожного з них.

У нашому випадку, крім відсутності цілих від’ємних чисел, ми виявляємо, що 64-бітове кодування є надмірним.

Параметр downcast = "unsigned" дозволяє визначити ексклюзивне кодування натуральних чисел. Функція apply () використовується для ітерації обробки по всіх стовпцях.

Після застосування функції цілі числа тепер кодуються в 32 біти без знака (без негативних значень). Це призводить до збільшення пам’яті на 50%.

Цю саму операцію можна виконати на поплавкових колонах. За винятком того, що кодування не може бути оптимізовано з урахуванням лише позитивних значень.

Як і цілі числа, виграш також становить 50% на плаваючих.

Наступним кроком є ​​заміна оптимізованих частин набору даних у глобальному DataFrame (optimized_df).

Не дивно, що, враховуючи частку стовпців об’єктів, загальний приріст пам’яті також становить 61%.

На цьому оптимізація завершена. Для автоматизації процесу кожного разу при відкритті csv, Pandas дозволяє вказати у формі словника формати даних, які застосовуватимуться до кожного стовпця.

Крім того, бібліотека дозволяє перетворювати на льоту під час відкриття стовпці тимчасових даних у форматі datetime. Цей формат більше підходить для обробки даних цього типу. Тому розумно видаляти ці стовпці під час створення словника.

Ось словник, колись створений.

Це тепер можна повторно вводити при відкритті csv як аргумент функції read_csv (). Перетворення у часовий ряд дати і часу отримується шляхом передачі списку стовпців, що підлягають обробці, в аргументі parse_dates.

Після перевірки Pandas дійсно враховує типи стовпців, зазначені у словнику.

Отже, простір добре оптимізовано відразу після створення набору даних.

Крім даних, оптимізація проходить через формат файлу

Ще можна скоротити деякий простір на диску та зробити імпорт даних у набір даних ще швидшим, замінивши файл CSV на резервну копію HDF5. Pandas пропонує функцію to_hdf () зробити це.

Функція read_hdf () відкрийте файл HDF5.

Для порівняння, файл csv важить 1 Гб, тоді як HDF5 займає лише 470 Мб.