Найти тему
Nuances of programming

Обзор библиотеки Datatable в Python

Оглавление

Источник: Nuances of Programming

Данные, с которыми вы работаете, уже настолько большие, что вы часами ждёте их загрузки? Пора осваивать новый инструмент, который избавит вас от долгого ожидания —datatable!

“В период до 2003 года в мире было создано пять эксабайтов информации. Сейчас же каждые два дня появляются новые пять эксабайтов”, — Эрик Шмидт

Если вы пользовались языком R, то, скорее всего, вы уже работали с пакетом data.table. В R это расширение пакета data.frame. Для пользователей R он полезен в обработке больших объёмов данных (например, около 100 ГБ в RAM).

data.table в R — многофункциональный пакет с высокой производительностью. Он лёгок в использовании, удобен и быстр. Конечно, он очень известен: у него более 400 тысяч скачиваний каждый месяц и его используют почти 650 пакетов CRAN и Bioconductor.

А что делать тем, кто использует Python? Хорошие новости: для этого языка существует библиотека datatable, которая поддерживает большие данные, датасеты как внутри динамической памяти, так и вне, мультипотоковые алгоритмы и обеспечивает высокую производительность.

datatable

-2

Современные программы с использованием машинного обучения должны уметь обрабатывать огромное количество данных и создавать несколько признаков. Это нужно для создания моделей с высокой точностью. Модуль datatable был создан как раз для этого. Он поддерживает данные размером до 100 ГБ на одном вычислительном узле на максимальной скорости вычислений. Разработка библиотеки спонсировалась H2O.ai и впервые использовалась в Driverless.ai.

В некоторой степени библиотека похожа на pandas с тем лишь отличием, что она больше сфокусирована на данных больших размеров и скорости вычислений. К тому же datatable помогает пользователю понятными сообщениями об ошибках. Сейчас вы и сами увидите, в чём эта библиотека превосходит pandas.

Установка

На MacOS установка производится при помощи pip:

pip install datatable

На Linux — при помощи бинарного пакета:

-3

К сожалению, пока библиотека не работает на Windows, но ведётся работа для создания поддержки и этой ОС.

Для более подробной инструкции обращайтесь к документации.

Код, использованный в этой статье, можно найти на Github.

Считывание данных

Датасет —  Lending Club Loan Data — взят с Kaggle. Он содержит информацию обо всех займах в период с 2007 по 2015 год: статус займа (текущий, выплачен в срок, выплачен позже срока) и информацию об оплате. Файл состоит из 2,26 миллионов строк и 145 столбцов. Размер датасета идеален для демонстрации возможностей библиотеки.

-4

Загрузим данные в объект Frame. Это фундаментальная единица анализа в библиотеке datatable — почти то же самое, что и pandas dataframe или таблица SQL: данные содержатся в форме двумерного массива.

datatable

-5

ункция fread() одновременно и мощная, и быстрая. Она может автоматически распознавать и считывать большинство текстовых форматов, загружать данные из .zip архивов или ссылок, считывать файлы Excel.

К тому же парсер datatable:

  • автоматически распознаёт сепараторы, заголовки, типы столбцов и тому подобное;
  • может считывать данные из многих ресурсов: файлов, ссылок, текстов, архивов, программных оболочек и масок;
  • позволяет проводить многопоточное чтение файла;
  • показывает полосу загрузки больших файлов;
  • считывает как RFC4180-совместимые, так и несовместимые файлы.

pandas

Теперь посмотрим на то, как с задачей загрузки справляется pandas.

-6

Результаты показывают, что datatable работает гораздо быстрее: считывание заняло меньше минуты.

Преобразование объекта Frame

Существующий объект Frame можно преобразовать в массив numpy или pandas dataframe:

numpy_df = datatable_df.to_numpy()
pandas_df = datatable_df.to_pandas()

Давайте преобразуем наши данные в объект pandas dataframe и сравним время со считыванием в pandas.

-7

Получается, что для работы с объектом pandas dataframe гораздо эффективнее считать данные при помощи datatable, а затем преобразовать их в pandas dataframe.

-8

Свойства Frame

Давайте рассмотрим основные свойства этого класса. Кстати, они схожи со свойствами pandas dataframe.

-9

Также можно использовать команду head для того, чтобы вывести несколько первых строк датасета:

datatable_df.head(10)

Первые 10 строк датасета
Первые 10 строк датасета

Цвет показывает тип данных: красный — строки, зелёный — целые числа, синий — числа с плавающей точкой.

Сводная статистика

В pandas подсчёт сводной статистики — достаточно ресурсозатратный процесс. С datatable же всё гораздо удобнее. Для каждого столбца можно вычислить следующие значения:

-11

Давайте вычислим среднее значение столбцов, используя эти две библиотеки.

datatable

-12

pandas

-13

Как видим, для такого размера данных с pandas это сделать невозможно, так как происходит ошибка памяти.

Обработка данных

datatable — столбчатая структура данных, как и dataframe. Все обращения происходят при помощи квадратных скобок, как и в обычных матрицах, но с большим функционалом.

-14

Такая же нотация DT[i, j] используется в математике при работе с матрицами, в C/C++, R, pandasи numpy. Давайте посмотрим, что мы можем делать с данными в datatable.

Выбор подмножества строк/столбцов

Нижеприведённый код выбирает весь столбецfunded_amnt датасета.

datatable_df[:,'funded_amnt']

-15

А вот так мы можем выбрать первые пять строк и три столбца:

datatable_df[:5,:3]

-16

Сортировка датасета

Отсортируем его по значению funded_amnt_inv при помощи обеих библиотек и сравним время работы.

datatable

-17

pandas

-18

И вновь мы видим преимущество datatable.

Удаление строк/столбцов

Вот так можно удалить столбец с названием member_id:

del datatable_df[:, 'member_id']

Группирование

Как и pandas, datatable поддерживает функцию groupby. Давайте найдём среднее значение столбца funded_amount, сгруппированного по значению grade.

datatable

-19

pandas

-20

Что такое .f?

f это frame proxy, который позволяет нам обращаться к объекту Frame. То есть в нашем примере dt.f — это то же самое, что и datatable_df.

Фильтрация строк

Синтаксис похож на groupby. Давайте выберем только те строки loan_amnt, для которых значения loan_amntбольше, чем funded_amnt.

datatable_df[dt.f.loan_amnt>dt.f.funded_amnt,"loan_amnt"]

Сохранение

Содержимое объекта Frame можно записать в файл csv для дальнейшего использования.

datatable_df.to_csv('output.csv')

Если у вас есть вопросы по использованию библиотеки, то обращайтесь к документации.

Заключение

Модуль datatable определённо ускоряет работу с данными по сравнению с pandas, что очень полезно при работе с большими датасетами. С другой стороны, библиотека проигрывает pandas в функциональности. Но работа над библиотекой до сих пор ведётся, поэтому в будущем надеемся на расширение функционала.

Ссылки

Читайте нас в телеграмме и vk

Перевод статьи Parul Pandey: An Overview of Python’s Datatable package