Анализ больших данных в Python переживает эпоху возрождения. Она началась с библиотеки NumPy. Эта библиотека, кстати, является одной из составных частей тех инструментов, о которых пойдёт речь в этом материале. В 2006 году тема обработки больших данных постепенно набирала обороты, этот процесс ускорился с появлением Hadoop. Потом появилась библиотека pandas со своими структурами данных DataFrame, которые обычно называют просто «датафреймами». В 2014 году большие данные стали мейнстримом, в этом же году появилась платформа Apache Spark. В 2018 году вышла библиотека Dask и другие средства для анализа данных в Python.
Каждый месяц мне попадаются новые инструменты для анализа данных в Python, которые мне очень хочется освоить. Потратив час-другой на их изучение, можно, в долгосрочной перспективе, сэкономить немало времени. Кроме того, важно следить за тем новым, что происходит в интересующей тебя сфере технологий. Возможно, вы полагаете, что эта статья будет посвящена библиотеке Dask. Но это не так. Сегодня я расскажу вам об одной недавно обнаруженной мной Python-библиотеке, о которой стоит знать тем, кто занимается анализом данных.
Vaex — это высокопроизводительная Python-библиотека, предназначенная для организации «ленивой» обработки датафреймов (похожих на датафреймы pandas), рассчитанная на визуализацию и исследование больших наборов табличных данных. Эта библиотека умеет вычислять основные статистические показатели по исследуемым данным. При этом обработка миллиарда записей может составлять что-то около секунды. Библиотека поддерживает множество средств визуализации, что помогает исследовать большие данные в интерактивном режиме.
Библиотека Vaex не похожа на Dask, но используемые в ней структуры данных похожи на сущности DataFrame, применяемые в Dask. Они построены на базе датафреймов pandas. Это означает, что Dask получает в наследство от pandas определённые ограничения по работе с датафреймами. Например — требование, в соответствии с которыми данные, которые планируется обрабатывать, должны быть полностью загружены в память. В случае с Vaex это не так.
Vaex не делает копий датафреймов, в результате средствами этой библиотеки можно обрабатывать масштабные датафреймы на компьютерах с небольшим объёмом оперативной памяти.
И Vaex и Dask используют «ленивые» механизмы обработки данных. Основное различие между ними заключаться в том, что Vaex вычисляет значения полей тогда, когда они нужны, а в Dask надо явным образом использовать функцию вычисления значений.
Для того чтобы раскрыть весь потенциал Vaex нужно, чтобы данные были бы представлены в формате HDF5 или Apache Arrow.
Установить Vaex так же легко, как и любой другой Python-пакет:
Создадим датафрейм pandas, в котором содержится 1 миллион строк и 1000 столбцов. Это позволит нам получить большой файл с данными.
Вот как выглядят эти данные.
Данные для проведения эксперимента
Сколько оперативной памяти использует этот датафрейм?
Сведения об использовании памяти
Сохраним этот датафрейм на диск для того чтобы потом прочитать его с помощью Vaex.
Если напрямую прочитать этот CSV-файл с помощью Vaex, особых выгод мы от этого не получим. Скорость чтения будет похожей на скорость, обеспечиваемую pandas. На моём ноутбуке и Vaex и pandas читают эти данные примерно за 85 секунд.
Для того чтобы увидеть возможности Vaex, CSV-данные нужно преобразовать в формат HDF5 (Hierarchical Data Format version 5). В Vaex есть функция для выполнения такого преобразования, которая позволяет работать с данными, объём которых превышает объём доступной оперативной памяти. Это достигается благодаря тому, что исходные данные разбиваются на фрагменты.
Если не удаётся, из-за нехватки памяти, открыть достаточно большой файл с помощью pandas, этот файл можно преобразовать в формат HDF5 и обработать с помощью Vaex.
Вышеприведённая функция автоматически создаёт HDF5-файл и сохраняет его на диск.
Проверим тип переменной
Теперь прочитаем набор данных объёмом 7.5 Гб с помощью Vaex. Прямо сейчас нам его читать не придётся — дело в том, что его уже представляет переменная
На выполнение этой команды у Vaex уходит меньше секунды. Но Vaex, на самом деле, из-за использования механизмов «ленивой» обработки данных, этот файл не читает.
Теперь давайте заставим Vaex прочитать файл, посчитав сумму значений в столбце
А вот эта команда меня по-настоящему удивила. Для вычисления суммы Vaex тоже понадобилось меньше секунды. Как это возможно? А возможно это благодаря мэппингу памяти.
Vaex показывает хорошую скорость и на визуализации данных. В библиотеке есть особые функции:
Результат визуализации данных
Vaex, при добавлении к набору данных нового столбца, создаёт виртуальный столбец. Он не занимает память. Значения, хранящиеся в нём, вычисляются, что называется, «на лету».
Новый столбец
Vaex не создаёт копий датафреймов при фильтрации данных. Это способствует более эффективному использованию памяти.
В Vaex агрегирование данных работает немного не так, как в pandas. Но самое важное тут то, что в Vaex эта операция выполняется очень быстро.
Создадим новый столбец, содержащий результаты сравнения
Vaex комбинирует операции группировки и агрегирования данных в одной команде. Следующая команда группирует данные по столбцу
Результаты выполнения команды
Vaex позволяет соединять данные без создания копий данных в памяти. Это, как и другие возможности библиотеки, способствует экономному использованию памяти. Функция
В этом материале мы рассмотрели основные особенности и возможности библиотеки Vaex. Если она вас заинтересовала — загляните в её репозиторий.
А вам пригодится библиотека Vaex?
Каждый месяц мне попадаются новые инструменты для анализа данных в Python, которые мне очень хочется освоить. Потратив час-другой на их изучение, можно, в долгосрочной перспективе, сэкономить немало времени. Кроме того, важно следить за тем новым, что происходит в интересующей тебя сфере технологий. Возможно, вы полагаете, что эта статья будет посвящена библиотеке Dask. Но это не так. Сегодня я расскажу вам об одной недавно обнаруженной мной Python-библиотеке, о которой стоит знать тем, кто занимается анализом данных.
Python-библиотека Vaex
Vaex — это высокопроизводительная Python-библиотека, предназначенная для организации «ленивой» обработки датафреймов (похожих на датафреймы pandas), рассчитанная на визуализацию и исследование больших наборов табличных данных. Эта библиотека умеет вычислять основные статистические показатели по исследуемым данным. При этом обработка миллиарда записей может составлять что-то около секунды. Библиотека поддерживает множество средств визуализации, что помогает исследовать большие данные в интерактивном режиме.
Сравнение Vaex и Dask
Библиотека Vaex не похожа на Dask, но используемые в ней структуры данных похожи на сущности DataFrame, применяемые в Dask. Они построены на базе датафреймов pandas. Это означает, что Dask получает в наследство от pandas определённые ограничения по работе с датафреймами. Например — требование, в соответствии с которыми данные, которые планируется обрабатывать, должны быть полностью загружены в память. В случае с Vaex это не так.
Vaex не делает копий датафреймов, в результате средствами этой библиотеки можно обрабатывать масштабные датафреймы на компьютерах с небольшим объёмом оперативной памяти.
И Vaex и Dask используют «ленивые» механизмы обработки данных. Основное различие между ними заключаться в том, что Vaex вычисляет значения полей тогда, когда они нужны, а в Dask надо явным образом использовать функцию вычисления значений.
Для того чтобы раскрыть весь потенциал Vaex нужно, чтобы данные были бы представлены в формате HDF5 или Apache Arrow.
Установка Vaex
Установить Vaex так же легко, как и любой другой Python-пакет:
pip install vaex
Эксперименты с Vaex
Создадим датафрейм pandas, в котором содержится 1 миллион строк и 1000 столбцов. Это позволит нам получить большой файл с данными.
import vaex
import pandas as pd
import numpy as np
n_rows = 1000000
n_cols = 1000
df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])
df.head()
Вот как выглядят эти данные.
Данные для проведения эксперимента
Сколько оперативной памяти использует этот датафрейм?
df.info(memory_usage='deep')
Сведения об использовании памяти
Сохраним этот датафрейм на диск для того чтобы потом прочитать его с помощью Vaex.
file_path = 'big_file.csv'
df.to_csv(file_path, index=False)
Если напрямую прочитать этот CSV-файл с помощью Vaex, особых выгод мы от этого не получим. Скорость чтения будет похожей на скорость, обеспечиваемую pandas. На моём ноутбуке и Vaex и pandas читают эти данные примерно за 85 секунд.
Для того чтобы увидеть возможности Vaex, CSV-данные нужно преобразовать в формат HDF5 (Hierarchical Data Format version 5). В Vaex есть функция для выполнения такого преобразования, которая позволяет работать с данными, объём которых превышает объём доступной оперативной памяти. Это достигается благодаря тому, что исходные данные разбиваются на фрагменты.
Если не удаётся, из-за нехватки памяти, открыть достаточно большой файл с помощью pandas, этот файл можно преобразовать в формат HDF5 и обработать с помощью Vaex.
dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)
Вышеприведённая функция автоматически создаёт HDF5-файл и сохраняет его на диск.
Проверим тип переменной
dv
:type(dv)
# вывод
vaex.hdf5.dataset.Hdf5MemoryMapped
Теперь прочитаем набор данных объёмом 7.5 Гб с помощью Vaex. Прямо сейчас нам его читать не придётся — дело в том, что его уже представляет переменная
dv
. Но следующую команду мы всё же запустим, сделав это для того чтобы узнать о том, какова скорость выполнения этой операции:dv = vaex.open('big_file.csv.hdf5')
На выполнение этой команды у Vaex уходит меньше секунды. Но Vaex, на самом деле, из-за использования механизмов «ленивой» обработки данных, этот файл не читает.
Теперь давайте заставим Vaex прочитать файл, посчитав сумму значений в столбце
col1
:suma = dv.col1.sum()
suma
# array(49486599)
А вот эта команда меня по-настоящему удивила. Для вычисления суммы Vaex тоже понадобилось меньше секунды. Как это возможно? А возможно это благодаря мэппингу памяти.
Визуализация данных
Vaex показывает хорошую скорость и на визуализации данных. В библиотеке есть особые функции:
plot1d
, plot2d
и plot2d_contour
.dv.plot1d(dv.col2, figsize=(14, 7))
Результат визуализации данных
Виртуальные столбцы
Vaex, при добавлении к набору данных нового столбца, создаёт виртуальный столбец. Он не занимает память. Значения, хранящиеся в нём, вычисляются, что называется, «на лету».
dv['col1_plus_col2'] = dv.col1 + dv.col2
dv['col1_plus_col2']
Новый столбец
Эффективная фильтрация данных
Vaex не создаёт копий датафреймов при фильтрации данных. Это способствует более эффективному использованию памяти.
dvv = dv[dv.col1 > 90]
Агрегирование данных
В Vaex агрегирование данных работает немного не так, как в pandas. Но самое важное тут то, что в Vaex эта операция выполняется очень быстро.
Создадим новый столбец, содержащий результаты сравнения
dv.col1 >= 50
:dv['col1_50'] = dv.col1 >= 50
Vaex комбинирует операции группировки и агрегирования данных в одной команде. Следующая команда группирует данные по столбцу
col1_50
и вычисляет сумму столбца col3
:dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3']))
dv_group
Результаты выполнения команды
Соединения данных
Vaex позволяет соединять данные без создания копий данных в памяти. Это, как и другие возможности библиотеки, способствует экономному использованию памяти. Функция
join
, показанная ниже, покажется знакомой пользователям pandas:dv_join = dv.join(dv_group, on=’col1_50')
Итоги
В этом материале мы рассмотрели основные особенности и возможности библиотеки Vaex. Если она вас заинтересовала — загляните в её репозиторий.
А вам пригодится библиотека Vaex?
somurzakov
что только не придумают питонисты, лишь бы не использовать SQL. Боюсь меня заминусуют, но ведь эти все задачи решаются простейшим SQL?
sergeypid
Я б заминусовал
AigizK
Не знаю как у питонистов, но DataScience работает с большими данными, и проводят много экспериментов. Отсюда и требования. Например мы данные из DB2 пересохранили в Dataframe т.к. это удобнее, Dask кластерами можно быстро подсчитать. То что можно загрузили в Google и теперь в разы быстрее считаем с помощью BigQuery. Но надо понимать что это стоит уже денег.
sshikov
Я не знаю точно, чему эквивалентны датафреймы в пандас, но в спарке они эквивалентны именно SQL. Поскольку спарковский API когда-то срисовали с пандас, подозреваю что тут все тоже самое.
То есть, их API — это именно API для построения SELECT и получения результата. А внутри — движок, который строит, оптимизирует и исполняет ровно такие же планы запросов.
Hardcoin
А смысл? Вы конечно можете посчитать standart deviation в базе, но на практике это не особо-то удобно, особенно если колонок много. На второй раз надоест набирать длинный запрос (но можно, конечно, героически сопротивляться, зато sql). А потом захочется поменять две колонки местами или в sklearn отправить, что бы линейную модель построить. Тоже это в базе данных будете делать? Это займет в десять раз больше времени.
jugard
Потому что это не для программистов. Это для того чтобы быстро и в лоб посчитать какую-нибудь штуку, в статье даже встречается словосочетание «анализ данных». В компаниях, где софт не производят а используют, постоянно приходится считать что-то простое на больших объёмах данных, выгружаемых из разного глючного софта, коего в мире не больше 10 экземпляров, с недокументированным внутренним устройством, умеющего делать экспорт в csv.
Если программисты перестанут писать софт с недокументированным внутренним устройством и закрытым исходным кодом, то питонистам такие библиотеки станут не нужны. Конечно, за исключением случаев обработки любых данных, накопленных до наступления Светлого будущего или полученных из старого софта.
Осталось донести необходимость такого подхода к созданию программ до менеджеров проектов, директоров и акционеров ВСЕХ компаний, занимающихся разработкой, распространением и поддержкой софта и заставить менеджмент и акционеров других компаний платить за такой софт.
SkyKing
Но кто то просто не хочет учить что то новое так ведь?