Данные становятся БОЛЬШИМИ

Некоторые наборы данных слишком велики, чтобы поместиться в основную память вашего настольного компьютера, не говоря уже о вашем портативном компьютере. Тем не менее, мы хотели бы работать с большими наборами данных в эпоху больших данных. Однако мы действительно не хотим учиться настраивать инфраструктуру Hadoop или Spark только для небольшого эксперимента.

Наша мечта

Разве не было бы замечательно, если бы вы могли мгновенно загрузить файл данных размером 1 Терабайт, читая только те части, которые вам нужны, с помощью стратегии, которую умные программисты ядра потратили десятилетия на оптимизацию? И, делая безумные запросы, почему бы нам не попросить API, который немного похож на панд, который мы все используем. Ах да, и пожалуйста, не используйте слишком много памяти на моем MacBook Air 2013 года, пока вы занимаетесь им. Поскольку сейчас 2018 год, и мы все работаем в блокноте Jupyter, заставьте его работать и с ним, ладно? Убедитесь, что все мои открытые записные книжки также совместно используют память этого набора данных.

Было бы здорово, если бы вы могли мгновенно загрузить файл данных размером 1 ТБ.

Осуществляем нашу мечту

Все это возможно с помощью сопоставления памяти - метода, при котором вы сообщаете операционной системе, что хотите, чтобы часть памяти синхронизировалась с содержимым на диске. Технически он очень похож на диск подкачки. Если часть памяти не модифицируется или не используется какое-то время, ядро ​​отбрасывает ее, чтобы ОЗУ можно было использовать повторно. Кроме того, все процессы, у которых открыт один и тот же файл, используют одну и ту же физическую память.

Отображение памяти отличное, вы можете мгновенно отобразить память для файла размером 1 ТБ, и ядро ​​разумно решает, что читать, а что отбрасывать. Теперь представьте, что вы хотите отфильтровать некоторые строки, содержащие нерелевантные данные. В пандах с нашим DataFrame 1 ТБ мы могли бы сделать df_filtered = df[df.x > 0], который делает копию всех данных, занимая еще 0,8 ТБ ... ну, на самом деле вы увидите ошибку MemoryError.

Встречайте vaex

Vaex - это библиотека Python, которая упрощает работу с такими большими наборами данных. В дополнение к отображению памяти, он никогда не будет касаться или копировать данные, если явно не запрошено. Это позволяет работать с наборами данных размером с ваш жесткий диск. Кроме того, он выполняет ленивые вычисления, работает с виртуальными столбцами, выполняет эффективную очистку данных, быстро вычисляет N-мерную статистику, создает интерактивную визуализацию и многое другое.
Итак, я думаю, снова новый формат файла? Нет, мы используем старый добрый формат hdf5, который поддерживается любым уважающим себя языком. Vaex на самом деле не заботится о формате файла, пока вы можете отображать данные в памяти, вы будете жить долго и процветать 🖖.

Apache Arrow

Неужели hdf5 недостаточно новый и сексуальный? Хорошо, мы поддерживаем Apache Arrow, который также позволяет отображать память и взаимодействовать с другими языками.

Итак ... никаких панд?

Есть некоторые проблемы с пандами, которые оригинальный автор Уэс МакКинни описывает в своем проницательном блоге:« Apache Arrow и «10 вещей, которые я ненавижу в пандах ». Многие из этих проблем будут решены в следующей версии pandas (pandas2?), Построенной на основе Apache Arrow и других библиотек. Vaex начинается с чистого листа, сохраняя при этом API похожим, и готов к использованию сегодня.

Вэкс ленив

Vaex - это не просто замена пандам. Несмотря на то, что у него есть API-интерфейс, похожий на pandas, для доступа к столбцу при выполнении такого выражения, какnp.sqrt(ds.x**2 + ds.y**2), никаких вычислений не происходит. Вместо этого создается объект выражения vaex, и при распечатке он показывает некоторые значения предварительного просмотра.

В системе выражения vaex выполняет вычисления только при необходимости. Кроме того, данные не обязательно должны быть локальными: выражения можно отправлять по сети, а статистику можно вычислять удаленно, что предоставляет пакет vaex-server.

Виртуальные столбцы

Мы также можем добавлять выражения в DataFrame, в результате чего получаются виртуальные столбцы. Виртуальный столбец ведет себя как обычный столбец, но не занимает памяти. Vaex не делает различий между реальными и виртуальными столбцами, они рассматриваются как равные.

Что, если вычисление выражения на лету действительно дорого? Используя Pythran или Numba, мы можем оптимизировать вычисления, используя ручную JIT-компиляцию.

Выражения JIT-ed поддерживаются даже для удаленных DataFrames (JIT-обработка происходит на сервере).

У вас много оперативной памяти? Просто материализуйте колонну. Вы можете выжать дополнительную производительность за счет оперативной памяти.

Очистка данных

Фильтрация DataFrame, например ds_filtered = ds[ds.x >0], просто приводит к ссылке на существующие данные плюс логическая маска, отслеживающая, какие строки выбраны, а какие нет. Практически не используется память и не производится копирование памяти.

Практически не используется память и не производится копирование памяти.

Помимо фильтрации DataFrame, выбор может также определять подмножество данных. С помощью выбора вы можете рассчитать статистику для нескольких подмножеств за один проход по данным. Это отлично подходит для DataFrames, которые не помещаются в память (Out-of-core).

Отсутствие значений может быть настоящей проблемой, и не всегда легко решить, как с ними бороться. С помощью vaex вы можете легко заполнить или отбросить строки с пропущенными значениями. Но вот в чем дело: оба метода dropna и fillna реализуются через фильтрацию и выражения. Это означает, что, например, вы можете опробовать несколько значений заполнения без дополнительных затрат памяти, независимо от размера вашего набора данных.

Бинированная статистика

Vaex действительно силен в статистике. Поскольку мы имеем дело с большими данными, нам нужна альтернатива groupby, что-то более быстрое в вычислительном отношении. Вместо этого вы можете рассчитывать статистику на обычной N-мерной сетке, которая работает очень быстро. Например, вычисление среднего значения столбца в обычных ячейках занимает около секунды, даже если набор данных содержит миллиард строк (да, 1 миллиард строк в секунду!).

да, 1 миллиард строк в секунду!

Визуализации

Создание осмысленных графиков и визуализаций - лучший способ понять ваши данные. Но когда ваш DataFrame содержит 1 миллиард строк, создание стандартных точечных диаграмм не только занимает очень много времени, но и приводит к бессмысленной и неразборчивой визуализации. Вы можете получить гораздо лучшее представление о структуре ваших данных, если сосредоточитесь на совокупных свойствах (например, количестве, сумме, среднем, медиане, стандартном отклонении и т. Д.) Одной или нескольких функций / столбцов. При вычислении в бункерах эта статистика дает лучшее представление о том, как распределяются данные. Vaex отлично справляется с такими вычислениями, а результаты легко визуализируются.

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

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

Используя ipyvolume, мы даже можем сделать трехмерную объемную визуализацию.

Поскольку базовый механизм расчета статистики на N-мерных сетках очень быстр, мы можем делать их на лету и иметь интерактивные визуализации
(на основе bqplot).

Более?

Да, vaex включает в себя кухонную мойку, но это модульная кухонная мойка. Vaex на самом деле является метапакетом, который устанавливает все пакеты Python из семейства vaex. Вот список пакетов:

  • vaex-core: DataFrame и основные алгоритмы, принимают несколько массивов в качестве входных столбцов.
  • vaex-hdf5: Предоставляет массивы numpy с отображением памяти в vaex DataFrame.
  • vaex-arrow: Аналогично, но с использованием Apache Arrow.
  • vaex-viz: Визуализация на основе matplotlib.
  • vaex-jupyter: Интерактивная визуализация на основе виджетов / ipywidgets, bqplot, ipyvolume и ipyleaflet Jupyter.
  • vaex-astro: Преобразования, связанные с астрономией, и поддержка файлов FITS.
  • vaex-server: Предоставляет сервер для удаленного доступа к DataFrame.
  • vaex-distributed: (Подтверждение концепции) объединены несколько серверов / кластеров в один DataFrame для распределенных вычислений.
  • vaex-ui: Интерактивное автономное приложение / графический интерфейс на основе Qt.

Хочу больше?

Мы постоянно работаем над улучшением vaex. Но это еще не все. Мы также очень много работаем над vaex-ml, пакетом, который добавляет в vaex возможности машинного обучения. Скоро появятся действительно крутые вещи, так что следите за обновлениями! А пока посмотрите эту живую демонстрацию для практической демонстрации vaex и предварительного просмотра vaex-ml.

Узнайте больше о vaex и vaex-ml из нашей живой демонстрации на PyParis 2018

Вы также можете попробовать отрывки из этой статьи в Интернете в Блокноте Jupyter с использованием mybinder:

Заключение

Готовы ли вы к большим табличным данным? Мы! Политика нулевого копирования памяти, отображение памяти, API-интерфейс, похожий на pandas, и невероятно быстрые вычисления статистики на N-мерных сетках делают vaex идеальной библиотекой Python для исследования и анализа ваших массивных наборов данных. И все это, не выходя из ноутбука или ПК. Vaex имеет открытый исходный код (MIT) и находится на GitHub, проверьте его домашнюю страницу, документацию или задайте вопросы о gitter. Попробуйте и дайте нам знать, что вы думаете.

Маартен Бредделс - предприниматель и внештатный разработчик / консультант / специалист по данным, работающий в основном с Python, C ++ и Javascript в экосистеме Jupyter. Основатель vaex.io. Его опыт варьируется от быстрых численных вычислений, проектирования API до трехмерной визуализации. Он имеет степень бакалавра ИКТ, магистра и доктора астрономии, любит программировать и решать задачи.

стоковые изображения с сайта https://pixabay.com/