Введение
В науке о данных вы столкнетесь со многими сложными проблемами, которые нужно решить. Одной из основных проблем, с которыми вы сталкиваетесь, является этап подготовки данных. Большая часть эффективной науки о данных направлена на то, чтобы научиться эффективно работать с данными. Одним из самых первых шагов работы с данными является загрузка данные. Звучит просто, правда? Подумайте еще раз. Во многих ситуациях наборы данных слишком велики, чтобы поместиться в локальную память вашего компьютера. Итак, что делать, если набор данных, с которым вы работаете, не помещается в локальную память? Вот тут-то и вступает в игру фрагментирование.
Разбивка на части разбивает ваш большой набор данных на небольшие наборы данных. Это позволяет вам выполнять конвейер анализа на меньших объемах данных, которые помещаются в память вашего компьютера. Ниже вы можете увидеть рисунок, который представляет общую идею разделения на фрагменты и то, что оно решает.
Читайте также: Введение в долговременную краткосрочную память (LSTM)
В этой статье мы расскажем, как выполнить фрагментацию с помощью библиотеки Python. панды. Панды«яЭто библиотека с открытым исходным кодом, имеющая лицензию BSD, предоставляющая высокопроизводительные и простые в использовании структуры данных и инструменты анализа данных». Это де-факто библиотека для работы с данными в Python, предоставляющая множество полезных и эффективных функций для своих структур данных.
Основное использование
Чтобы читать в pandas по частям, необходимо понимать, как pandas выполняет ввод/вывод файлов (IO) и основные функции для ввода/вывода файлов в pandas. Чтобы ознакомиться с этими функциями, ознакомьтесь с документацией pandas: Ввод, вывод. Pandas использует соглашение «read_» для ввода файла и «to_» для вывода файла. Это означает, что все функции ввода и вывода файлов будут соответствовать следующему синтаксису:
import pandas as pd file1 = pd.read_csv("myInputFile.csv") ## File Input file1.to_csv("myOutputFile.csv") ## File Output |
Для конкретного блока кода выше мы читаем тип файла «csv» или значения, разделенные запятыми, и это будет основной темой остальной части статьи. Другие типы файлов, которые можно прочитать в pandas с помощью этого соглашения, перечислены в таблице 1.
Тип файла | Синтаксис ввода | Синтаксис вывода |
Плоские файлы (csv, txt, tsv и т. д.) | pd.read_csv() | pd.to_csv() |
Файлы Excel | pd.read_excel() | pd.to_excel() |
JSON-файлы | pd.read_json() | pd.to_json() |
HTML-файлы | pd.read_html() | pd.to_html() |
XML-файлы | pd.read_xml() | pd.to_xml() |
Файлы HDFStore (HDF5) | pd.read_hdf() | pd.to_csv() Использовать параметры плоского файла |
Перьевые файлы | pd.read_feather() | pd.to_csv() Использовать параметры плоского файла |
Паркетные пилки | pd.read_parquet() | pd.to_csv() Использовать параметры плоского файла |
ORC-объекты | pd.read_orc() | pd.to_csv() Использовать параметры плоского файла |
SAS-файлы | pd.read_sas() | pd.to_sas() |
SPSS-файлы | pd.read_spss() | pd.to_csv() Использовать параметры плоского файла |
SQL-таблицы | pd.read_sql_table(), pd.read_sql_query(), pd.read_sql() | pd.to_sql() |
Подключения Google BigQuery | pd.read_gbg() | pd.to_csv() Использовать параметры плоского файла |
STATA-файлы | pd.read_stata() | pd.to_stata() |
Теперь, когда вы понимаете основной синтаксис загрузки и сохранения данных с помощью pandas, давайте более подробно рассмотрим read_csv() и то, как его можно использовать для выполнения фрагментирования. Функция read_csv() имеет более 50 возможных параметров, которые может установить пользователь, но для большинства случаев использования вам нужно понимать только несколько основных параметров, в основном путь к файлу и параметры разделителя. Они необходимы для правильного чтения интересующего файла. Путь к файлу — это расположение интересующего файла. Разделитель определяет, какой символ (обычно запятая или символ табуляции) обозначает одну ячейку в файле. Для чтения порциями панда предоставляет параметр «chunksize», который создает итерируемый объект, считывающий н количество строк в блоках. В приведенном ниже блоке кода вы можете узнать, как использовать параметр «chunksize» для загрузки объема данных, который поместится в память вашего компьютера. В качестве примера мы используем numpy для генерации случайных гауссовых чисел для создания файлов данных CSV формы (10 000, 10) или 10 000 строк по 10 столбцов. Затем мы загружаем данные с параметром «chunksize», установленным на 100, и сравниваем их с традиционным методом загрузки в кадрах данных pandas, чтобы увидеть, дают ли они тот же результат при сложении 2 и 3 столбцов вместе.
#!/usr/bin/env python # coding: utf-8
import pandas as pd import numpy as np import os for i in range(200):
data = np.random.normal(size=(10000, 10))
data = pd.DataFrame(data)
data.to_csv("./data/test"+str(i+1).zfill(3)+".csv", sep=",")
testfiles = os.listdir("./data/") testfiles = np.sort(testfiles)
###### Chunking pandas approach #######
all_data2 = () ### List to gather all dataframes of results for i in testfiles:
result = () ### List to gather all series of add_col1_with_col2
with pd.read_csv("data/"+i, sep=",", chunksize=100, index_col=0) as reader:
for chunk in reader:
add_col1_with_col2 = chunk.iloc(:, 1) + chunk.iloc(:, 2)
result.append(add_col1_with_col2)
result = pd.concat(result)
all_data2.append(result)
result2 = pd.concat(all_data2)
###### Traditional pandas approach #######
all_data = () for i in testfiles:
data2 = pd.read_csv("data/"+i, index_col=0)
all_data.append(data2)
all_data = pd.concat(all_data) result1 = all_data.iloc(:, 1) + all_data.iloc(:, 2)
### Results are the same np.unique(result1 == result2)
#### OUTPUT #### array(( True))
Как мы видим из результатов, оба метода дают один и тот же результат, а это означает, что метод фрагментирования работает одинаково, но позволяет вам работать с данными эффективно с точки зрения использования памяти. Давайте рассмотрим, что мы сделали с обоими методами. Во-первых, в методах фрагментирования мы используем функцию read_csv() с параметром chunksize, равным 100, в качестве вызова итератора «reader». Итератор предоставляет нам метод get_chunk() в виде чанка. Мы перебираем фрагменты и добавляем второй и третий столбцы. Мы добавляем результаты в список и создаем DataFrame с помощью pd.concat(). Затем мы перебираем все файлы и делаем то же самое, получаем результаты каждого файла и сохраняем их в другом списке. Этот список мы снова объединяем с помощью pd.concat(). Во втором способе мы просто открываем все файлы и добавляем их вместе с помощью pd.concat(). Затем мы выполняем математические вычисления для всех данных одновременно. Мы можем это сделать, потому что в качестве примера мы используем набор данных, который помещается в память. Затем мы проверяем, дает ли метод фрагментирования тот же результат, что и традиционный метод, и это так. Этот пример позволяет нам увидеть полезность опции pandas «chunk_size».
Читайте также: Программирование для детей: как создать Pacman на Scratch
Также обратите внимание на Даск
При работе с большими файлами появилось множество нововведений, которые также могут помочь вам упростить выполнение тех же задач. Одним из таких нововведений является библиотека Python. Даск. Dask — гибкая библиотека для параллельных вычислений. Он имеет множество замечательных функций, которые можно использовать и на вашем локальном компьютере. Например, вы можете использовать фреймы данных dask так же, как вы используете фреймы данных pandas, но они всегда будут загружаться в память! Как, спросите вы? Это связано с тем, что dask фактически не загружает данные в память, пока это не будет явно указано! dask использует функцию «compute()», которую вы вызываете, когда готовы выполнить некоторые вычисления. Таким образом, вы можете настроить свой код так, чтобы он работал быстро и помещался в памяти. Посмотрите видео от dask, в котором объясняются основы фреймов данных dask.
Заключение: Pandas и большие фреймы данных
В этой статье мы продемонстрировали, как и когда использовать функцию фрагментирования pandas для размещения больших наборов данных в памяти. Мы сравнили это с загрузкой кадра данных без фрагмента и определили, что фрагментирование дает тот же результат, что и без него, но с дополнительным преимуществом размещения в памяти. Мы также рассмотрели, как вы можете использовать фреймы данных dask в качестве альтернативы методу фрагментирования pandas для более сложных случаев использования.
Подскажите утилиту работы с большими наборами данных, какие библиотеки или методы для работы с большими наборами данных вам больше всего нравятся? Оставьте комментарий ниже и дайте нам знать ваши мысли!