В этой статье подробно описывается Vaex, мощная библиотека инструментов, способная обрабатывать сотни миллионов или даже миллиарды строк данных в секунду без загрузки всего набора данных в память. Для задач анализа больших данных эффективность Vaex проще и требует меньше требований к оборудованию и среде! Обновленная версия панды! Используйте это сейчас~
💦 автор:КореяНобуко@ShowMeAI 📘 данныеАнализ практических серий: чttps://www.showmeai.tech/tutorials/40 📘 Место этой статьиАдрес: хтtps://www.showmeai.tech/article-detail/393 📢 Заявление: Все права защищены. Пожалуйста, свяжитесь с платформой и автором для перепечатки и укажите источник. 📢 собиратьShowMeAI Посмотреть подробнеецветное содержание
Студентам, которые занимаются анализом данных и машинным обучением на Python, очень нравится библиотека инструментов pandas. Она проста в использовании и мощна. Она позволяет легко выполнять обработку данных, анализ данных, преобразование данных и другие процессы.
но,pandas не очень эффективен для обработки больших данных,Это даже отнимает много времени при чтении большого документа.。Такдля Большойданныенабор,Есть ли инструмент,Это может быть как pandas Так же прост в эксплуатации Dataframe, обладает чрезвычайно высокой эффективностью и в то же время не spark А как насчет таких сложных требований к использованию и аппаратной среде? иметь! Вы можете попробовать это 📘Vaex。
📘Vaex это очень мощный Python DataFrame Библиотека, способная обрабатывать сотни миллионов или даже миллиарды строк в секунду без загрузки всего набора данных в память. Это делает его пригодным для использования более чем на одной машине. RAM особенно полезен для исследования, визуализации и статистического анализа больших наборов данных, а также Vaex Он также сочетает в себе удобство и простоту использования.
В этой статье ShowMeAI познакомит вас с этим мощным инструментом, который поможет вам более эффективно обрабатывать работу по анализу больших данных.
Инструмент Vaex предназначен для эффективной обработки данных, объем которых намного превышает объем доступной памяти.。с помощью этого,мы можем легкоиметь дело ссколь угодно большойизданныенабор。Vaex В предыдущих версиях поддерживались форматы двоичных файлов, например. HDF5、 Arrow и Parquet . Начиная с версии 4.14.0 его так же легко можно открыть в вышеуказанных форматах и с помощью Jumbo. CSV документ. Частично это связано с 📘Aпредмет со стрелкой в пачеглаз,Он обеспечивает довольно эффективный читатель CSV.
Примечание. Данные, использованные в этой статье, можно найти по адресу 📘числоПо данным официального сайтаПолучать.
Ниже приводится использование при чтении больших файлов:
print('Check file size on disk:')
!du -h chicago_taxi_2013_2020.csv
print()
df = vaex.open('chicago_taxi_2013_2020.csv')
print(f'Number of rows: {df.shape[0]:,}')
print(f'Number of columns: {df.shape[1]}')
mean_tip_amount = df.tip_amount.mean(progress='widget')
print(f'Mean tip amount: {mean_tip_amount:.2f}')
df.fare_amount.viz.histogram(shape=128, figsize=(6, 4), limits=[0, 42], progress='widget');
Приведенный выше пример показывает, как легко vaex может обрабатывать огромный файл CSV (файл CSV размером 76 ГБ). Подробное описание вышеописанного процесса выглядит следующим образом:
① когда мы используемvaex.open()
для CSV Файл, Векс будет транслировать весь CSV документ для определения количества строк и столбцов, а также типа данных каждого столбца. Этот процесс не занимает много времени ОЗУ, но это может занять некоторое время в зависимости от CSV количество строк и количество столбцов.
может пройти
schema_infer_fraction
контроль Vaex Степень чтения файла. Чем меньше число, тем быстрее чтение, но определение типа данных может быть менее точным (поскольку не обязательно сканируются все данные). В приведенном выше примере мы используем параметры по умолчанию примерно в 5 Прочтите за несколько секунд 76 GB из CSV файлы, содержащие почти 2 И Син и 23 Список.
② Затем мы проходим vaex Рассчитаноtip_amount
Списокизсреднее значение,кропотливый 6 Второй.
③ Наконец мы нарисовалиtip_amount
Списокиз Гистограмма,кропотливый 8 Второй.
То есть мы 20 Прочтите за несколько секунда целая 76 GB CSV документ 3 раз без загрузки всего документа в память。
📢 Обратите внимание, что независимо от формата документа Vaex из API Они все одинаковы. Это означает, что вы можете легко CSV、HDF5、Arrow и Parquet Переключение между документами без изменения кода.
Конечно, с точки зрения самой производительности, использование CSV document — не лучший выбор, и его, как правило, следует избегать по разным причинам. Тем не менее, большие CSV Документ по-прежнему встречается в повседневной работе, что делает эту функцию очень удобной для быстрого просмотра и изучения его содержимого, а также эффективного преобразования в более подходящий формат документа.
анализ Одной из наиболее распространенных операций с данными является групповое агрегирование статистики. Vaex Существует два основных способа задания операций агрегирования:
Давайте посмотрим, как это сделать на практике. В оставшейся части этой статьи мы будем использовать 📘NНабор данных YC Taxi из подмножества,Содержит более 1 миллиарда записей данных.
df = vaex.open('yellow_taxi_2009_2015_f32.hdf5')
print(f'Number of rows: {df.shape[0]:,}')
print(f'Number of columns: {df.shape[1]}')
df.groupby(df.vendor_id, progress='widget').agg(
{'fare_amount': 'mean', # Option 1
'tip_amount_mean': vaex.agg.mean(df.tip_amount), # Option 2
})
Вышеуказанный метод работы pandas Dataframe Это в основном то же самое. Ваэкс Он также поддерживает второй метод следующим образом:
df.groupby(df.vendor_id, progress='widget').agg(
{'fare_amount_norm': vaex.agg.mean(df.fare_amount) / vaex.agg.std(df.fare_amount)}
)
Явное определение метода агрегатной функции (второй способ выше) также поддерживает выбор условия строки Входить.,Например, в следующем примере,Все наши данные,а такжеpassenger_count
для 2 и 4 статистика агрегации строк изданных Входить:
df.groupby(df.vendor_id, progress='widget').agg(
{'fare_amount_mean_all': vaex.agg.mean(df.fare_amount),
'fare_amount_mean_pc2': vaex.agg.mean(df.fare_amount, selection=df.passenger_count == 2),
'fare_amount_mean_pc4': vaex.agg.mean(df.fare_amount, selection=df.passenger_count == 4)}
)
Все использовали его раньше pandas При анализе данных иногда мы структурируем промежуточный процесс как pipeline трубопровод,Он содержит различные этапы преобразования данных. каждое исполнение,Если мы можем только дождаться обработки данных,Тогда у нас нет особого контроля над всем процессом.
Vaex очень мощный,Он может указывать, сколько времени займет каждый шаг и сколько времени осталось до завершения всего конвейера.,При работе с гигантским документом,Полоса степени входа очень полезна.
Фактический процесс работы с гигантским документом выглядит следующим образом:
with vaex.progress.tree('rich'):
result_1 = df.groupby(df.passenger_count, agg='count')
result_2 = df.groupby(df.vendor_id, agg=vaex.agg.sum('fare_amount'))
result_3 = df.tip_amount.mean()
В приведенном выше примере гистограмма степени из Вхождения,Вы можете видеть, сколько времени занимает каждый шаг. Это не только позволяет нам освоить обработку данных из Вход и процесс,Это также позволяет нам узнать, где находится узкое место во всем процессе.,Чтобы лучше оптимизировать и обрабатывать.
Vaex С ленивым расчетом (ленивый вычисления) и специальные эффекты, которые оценивают выражения только при необходимости. Общая рекомендация заключается в том, что без каких-либо изменений в исходном DataFrame Основные свойства операций. Эти операции представляют собой ленивые вычисления. Например:
Прочие операции,Может производить содержательные расчеты,Например, группировка операций,Или вычислите агрегацию (например, столбец и итог или среднее значение).
Этот рабочий процесс обеспечивает хороший баланс между производительностью и удобством при проведении интерактивного исследования или анализа данных.
Когда мы определяем процесс преобразования данных или конвейер данных, мы хотим, чтобы инструмент оптимизировал производительность во время вычислений. Ваэкс поддерживатьdelay=True
Равные параметрычисло,Вычисления и операции могут выполняться параллельно.,Позволяет Vaex заранее строить расчетные графики,И попытайтесь найти наиболее эффективный способ подсчета результатов.
Например:
with vaex.progress.tree('rich'):
result_1 = df.groupby(df.passenger_count, agg='count', delay=True)
result_2 = df.groupby(df.vendor_id, agg=vaex.agg.sum('fare_amount'), delay=True)
result_3 = df.tip_amount.mean(delay=True)
df.execute()
мы видим,Явно используя ленивую оценку,Мы можем улучшить производительность и реже проверять данные. в этом случае,При использовании отложенного расчета мы начинаем с 5 Данные передачи становятся только 2 раз, что приводит к увеличению скорости примерно 30%. Ты можешь 📘VОфициальное руководство по асинхронному программированию aexДополнительные примеры можно найти здесь.
Из-за высокой эффективности,Vaex часто используется в качестве информационной панели, приложения для обработки данных и серверной части.,Особенно те приложения, которым необходимо обрабатывать большие объемы данных.
При использовании приложений для передачи данных,Часто определенные операции выполняются неоднократно с одними и теми же или похожими подмножествами данных. Например,Пользователи начнут с одной и той же «Домашней страницы».,Выберите опцию «Общая» или «Высокая частота».,Затем углубитесь в данные. в этом случае,Часто бывает полезно кэшировать результаты операций.。Vaex осознал 📘ПервыйВходитьиз мелкозернистого механизма кэширования ,Позволяет кэшировать результаты отдельных операций.,Можно использовать повторно позже.
Следующие примеры представляют собой конкретное использование:
vaex.cache.on()
with vaex.progress.tree('rich'):
result_1 = df.passenger_count.nunique()
with vaex.progress.tree('rich'):
result_2 = df.groupby(df.passenger_count, agg=vaex.agg.mean('trip_distance'))
Vaex Существует прямой способ определить размер чтения данных, когда мы находимся в анализе. Используется, когда данные unique
, nunique
или groupby
метод,Возможна очень большая задержка полного объема данных.,мы можем указать limit
женьшеньчисло,Это ограничит наш диапазон вычислений.,Таким образом завершая увеличение скорости.
В приведенном ниже примере мы устанавливаем limit
приезжать 100, говорит он Vaex в достижении 100 Рассчитайте и верните результат:
result = df.pickup_longitude.nunique(limit=100, limit_raise=False)
print(f'result: {result}')
По мере роста набора данных,Хранение их в облаке становится все более распространенным и практичным.,итолько частьданные子набор保留在книгаземля。Vaex Очень дружелюбен к облаку — он может легко загружать (передавать) данные из любого общедоступного облачного хранилища.
и Vaex Будут получены только необходимые данные. Например, при выполнении df.head()
Когда только первый 5 ХОРОШО. Чтобы вычислить среднее значение столбца, получите все данные только для этого конкретного столбца, Vaex будет передавать эту часть данных в потоковом режиме,Поэтому он не занимает много пропускной способности и сетевых ресурсов:
df_cloud = vaex.open('gs://vaex-data/airlines/us_airline_data_1988_2019.hdf5')
print('Size of data:')
print(f'Number of rows: {df_cloud.shape[0]:,}')
print(f'Number of columns: {df_cloud.shape[1]}')
df_cloud.head()
Наконец, Векс Есть также очень мощные функции, которые можно использовать GPU для ускорения, и он поддерживает очень много платформ: подходит для Windows и Linux Платформа из NVIDIA, применимо к Mac OS из Radeon и Apple Silicon。
В следующем примере,Мы определяем функцию для расчета дугового расстояния между двумя точками на сфере. Это довольно сложная математическая операция,Требуется много вычислений. Мы используем предыдущие данные (набор данных содержит более 1 миллиарда строк),Попробуйте вычислить среднее расстояние по дуге всех поездок на такси в наборе данных New York Taxi:
print(f'Number of rows: {df.shape[0]:,}')
def arc_distance(theta_1, phi_1, theta_2, phi_2):
temp = (np.sin((theta_2-theta_1)/2*np.pi/180)**2
+ np.cos(theta_1*np.pi/180)*np.cos(theta_2*np.pi/180)
* np.sin((phi_2-phi_1)/2*np.pi/180)**2)
distance = 2 * np.arctan2(np.sqrt(temp), np.sqrt(1-temp))
return distance * 3958.8
df['arc_distance_miles_numpy'] = arc_distance(df.pickup_longitude, df.pickup_latitude,
df.dropoff_longitude, df.dropoff_latitude)
# Requires cupy and NVDIA GPU
df['arc_distance_miles_cuda'] = df['arc_distance_miles_numpy'].jit_cuda()
# Requires metal2 support on MacOS (Apple Silicon and Radeon GPU supported)
# df['arc_distance_miles_metal'] = df['arc_distance_miles_numpy'].jit_metal()
result_cpu = df.arc_distance_miles_numpy.mean(progress='widget')
result_gpu = df.arc_distance_miles_cuda.mean(progress='widget')
print(f'CPU: {result_cpu:.3f} miles')
print(f'GPU: {result_gpu:.3f} miles')
На картинке выше вы можете увидеть использование GPU Вы можете получить довольно хороший прирост производительности. Если у нас нет графического процессора, не беспокойтесь! Ваэкс Он также поддерживает передачу 📘Numbaи 📘PyТран войдетКомпиляция точно в срок,Это также может значительно улучшить производительность.