Я пытался найти ответ на этот вопрос в течение многих месяцев, изучая панд. Я использую SAS для своей повседневной работы, и он отлично подходит для поддержки из ядра. Однако SAS ужасен как часть программного обеспечения по многим другим причинам.
Однажды я надеюсь заменить свое использование SAS на python и pandas, но в настоящее время мне не хватает неосновного рабочего процесса для больших наборов данных. Я говорю не о «больших данных», которые требуют распределенной сети, а о файлах, слишком больших, чтобы уместиться в памяти, но достаточно маленьких, чтобы уместиться на жестком диске.
Моя первая мысль - использовать HDFStore
для хранения больших наборов данных на диске и извлекать только те части, которые мне нужны, в рамки данных для анализа. Другие упоминали MongoDB как более простую альтернативу. У меня вопрос такой:
Каковы лучшие рабочие процессы для достижения следующих целей:
- Загрузка плоских файлов в постоянную структуру базы данных на диске
- Запрос этой базы данных для получения данных для подачи в структуру данных Pandas
- Обновление базы данных после манипулирования частями в пандах
Примеры из реальной жизни будут высоко оценены, особенно от тех, кто использует панд на «больших данных».
Редактировать - пример того, как я хотел бы, чтобы это работало:
- Итеративно импортируйте большой плоский файл и сохраните его в постоянной структуре базы данных на диске. Эти файлы обычно слишком велики, чтобы поместиться в памяти.
- Чтобы использовать Панд, я хотел бы прочитать подмножества этих данных (обычно всего несколько столбцов за раз), которые могут поместиться в памяти.
- Я бы создал новые столбцы, выполняя различные операции с выбранными столбцами.
- Затем мне пришлось бы добавить эти новые столбцы в структуру базы данных.
Я пытаюсь найти наилучший способ выполнения этих шагов. Читая ссылки о пандах и таблицах, кажется, что добавление нового столбца может быть проблемой.
Изменить - Отвечая на вопросы Джеффа конкретно:
- Я строю модели потребительского кредитного риска. Типы данных включают телефон, SSN и адресные характеристики; ценности имущества; уничижительная информация, такая как судимости, банкротства и т. д. Наборы данных, которые я использую каждый день, содержат в среднем от 1000 до 2000 полей смешанных типов данных: непрерывные, номинальные и порядковые переменные числовых и символьных данных. Я редко добавляю строки, но я выполняю много операций, которые создают новые столбцы.
- Типичные операции включают объединение нескольких столбцов с использованием условной логики в новый составной столбец. Например,
if var1 > 2 then newvar = 'A' elif var2 = 4 then newvar = 'B'
. Результатом этих операций является новый столбец для каждой записи в моем наборе данных. - Наконец, я хотел бы добавить эти новые столбцы в структуру данных на диске. Я бы повторил шаг 2, изучая данные с помощью кросс-таблиц и описательной статистики, пытаясь найти интересные, интуитивно понятные связи для моделирования.
- Типичный файл проекта обычно составляет около 1 ГБ. Файлы организованы таким образом, что строка состоит из записи данных потребителя. Каждая строка имеет одинаковое количество столбцов для каждой записи. Это всегда будет так.
- Довольно редко, когда я создаю новый столбец, я добавляю его по строкам. Тем не менее, для меня довольно распространено подмножество строк при создании отчетов или создании описательной статистики. Например, я мог бы хотеть создать простую частоту для определенной сферы бизнеса, скажем, Розничные кредитные карты. Для этого я бы выбрал только те записи, где бизнес = розничная торговля, в дополнение к тем столбцам, о которых я хочу сообщить. Однако при создании новых столбцов я бы извлекал все строки данных и только те столбцы, которые мне нужны для операций.
- Процесс моделирования требует, чтобы я проанализировал каждый столбец, посмотрел на интересные отношения с некоторой переменной результата и создал новые составные столбцы, которые описывают эти отношения. Столбцы, которые я исследую, обычно делаются небольшими наборами. Например, я сконцентрируюсь на наборе, скажем, 20 столбцов, которые имеют дело только со значениями собственности, и посмотрю, как они относятся к дефолту по кредиту. После их изучения и создания новых столбцов я перехожу к другой группе столбцов, например, «Образование в колледже», и повторяю процесс. Я занимаюсь созданием переменных-кандидатов, которые объясняют связь между моими данными и некоторым результатом. В самом конце этого процесса я применяю некоторые методы обучения, которые создают уравнение из этих составных столбцов.
Редко когда я добавляю строки в набор данных. Я почти всегда буду создавать новые столбцы (переменные или функции в статистике / на языке машинного обучения).
Ответы:
Я обычно использую десятки гигабайт данных именно таким образом, например, у меня есть таблицы на диске, которые я читаю с помощью запросов, создаю данные и добавляю обратно.
Стоит прочитать документы и в конце этой ветки несколько предложений о том, как хранить ваши данные.
Детали, которые повлияют на то, как вы храните ваши данные, например: предоставьте
как можно больше деталей; и я могу помочь вам разработать структуру.
(Приведя пример с игрушкой, мы можем предложить более конкретные рекомендации.)
Решение
Убедитесь, что у вас есть как минимум
0.10.1
установленные панды .Читайте итеративные файлы по частям и запросы к нескольким таблицам .
Поскольку pytables оптимизирован для работы со строками (то, к чему вы обращаетесь), мы создадим таблицу для каждой группы полей. Таким образом, легко выбрать небольшую группу полей (которая будет работать с большой таблицей, но более эффективно сделать это таким образом ... Я думаю, что я смогу исправить это ограничение в будущем ... это более интуитивно понятен в любом случае):
(далее псевдокод.)
Чтение в файлах и создание хранилища (по сути дела, что
append_to_multiple
делает):Теперь у вас есть все таблицы в файле (на самом деле вы можете хранить их в отдельных файлах, если хотите, вам, вероятно, придется добавить имя файла в group_map, но, вероятно, в этом нет необходимости).
Вот как вы получаете столбцы и создаете новые:
Когда вы будете готовы к post_processing:
Что касается data_columns, вам на самом деле не нужно определять ЛЮБЫЕ data_columns; они позволяют вам выбирать строки на основе столбца. Например, что-то вроде:
Они могут быть наиболее интересны для вас на последнем этапе создания отчета (по сути, столбец данных отделен от других столбцов, что может несколько повлиять на эффективность, если вы определите много).
Вы также можете захотеть:
Дайте мне знать, когда у вас есть вопросы!
источник
Я думаю, что в ответах выше отсутствует простой подход, который я нашел очень полезным.
Когда у меня есть файл, который слишком велик для загрузки в память, я разбиваю файл на несколько небольших файлов (по строкам или столбцам)
Пример: в случае торговых данных за 30 дней размером ~ 30 ГБ я разбиваю их на файл в день размером ~ 1 ГБ. Впоследствии я обрабатываю каждый файл отдельно и в конце собираю результаты
Одним из самых больших преимуществ является то, что он позволяет параллельную обработку файлов (или несколько потоков или процессов)
Другое преимущество состоит в том, что манипулирование файлами (например, добавление / удаление дат в примере) может быть выполнено с помощью обычных команд оболочки, что невозможно в более сложных / сложных форматах файлов.
Этот подход не охватывает все сценарии, но очень полезен во многих из них
источник
Теперь, спустя два года после вопроса, эквивалент панд "из ядра": dask . Это превосходно! Хотя он не поддерживает все функциональные возможности панд, вы можете продвинуться далеко вперед.
источник
dask
.Если ваши наборы данных имеют размер от 1 до 20 ГБ, вы должны получить рабочую станцию с 48 ГБ ОЗУ. Тогда Pandas может хранить весь набор данных в оперативной памяти. Я знаю, что это не тот ответ, который вы ищете здесь, но делать научные вычисления на ноутбуке с 4 ГБ ОЗУ нецелесообразно.
источник
Я знаю, что это старая ветка, но я думаю, что библиотеку Blaze стоит проверить. Он построен для подобных ситуаций.
Из документов:
Blaze расширяет возможности использования NumPy и Pandas для распределенных и неосновных вычислений. Blaze предоставляет интерфейс, похожий на интерфейс Num-Array NumPy или DataFrame Pandas, но отображает эти знакомые интерфейсы на множество других вычислительных движков, таких как Postgres или Spark.
Изменить: Кстати, это поддерживается ContinuumIO и Трэвис Олифант, автор NumPy.
источник
Это дело для пимонго. Я также прототипировал с использованием SQL Server, SQLite, HDF, ORM (SQLAlchemy) в Python. Прежде всего, pymongo - это БД на основе документов, поэтому каждый человек будет документом (
dict
с атрибутами). Многие люди формируют коллекцию, и вы можете иметь много коллекций (люди, фондовый рынок, доход).pd.dateframe -> pymongo Примечание: я использую
chunksize
inread_csv
для сохранения записей от 5 до 10k (pymongo удаляет сокет, если он больше)запрос: GT = больше, чем ...
.find()
возвращает итератор, поэтому я обычно использую егоichunked
для нарезки на более мелкие итераторы.Как насчет объединения, поскольку я обычно получаю 10 источников данных для вставки вместе:
затем (в моем случае иногда мне приходится сначала аггиться
aJoinDF
до его «слияния».)И затем вы можете записать новую информацию в свою основную коллекцию с помощью метода обновления ниже. (логическая коллекция против физических источников данных).
При небольших поисках просто денормализуйте. Например, у вас есть код в документе, и вы просто добавляете текст кода поля и выполняете
dict
поиск при создании документов.Теперь у вас есть хороший набор данных, основанный на человеке, вы можете раскрыть свою логику в каждом случае и создать больше атрибутов. Наконец, вы можете прочитать в pandas ваши ключевые индикаторы 3 to max max и выполнить исследование pivots / agg / data. Это работает для меня 3 миллиона записей с числами / большой текст / категории / коды / плавающие / ...
Вы также можете использовать два метода, встроенных в MongoDB (MapReduce и агрегатный каркас). Смотрите здесь для получения дополнительной информации об агрегатной структуре , так как она кажется проще, чем MapReduce, и выглядит удобной для быстрой работы с агрегатами. Обратите внимание, что мне не нужно было определять мои поля или отношения, и я могу добавлять элементы в документ. В текущем состоянии быстро меняющегося набора инструментов numpy, pandas, python, MongoDB помогает мне просто приступить к работе :)
источник
In [96]: test.insert((a[1].to_dict() for a in df.iterrows())) --------------- InvalidDocument: Cannot encode object: 0
. Есть идеи, что может быть не так? Мой dataframe состоит из всех типов int64 и очень прост.Я заметил это немного поздно, но я работаю с аналогичной проблемой (модели предоплаты ипотеки). Мое решение состояло в том, чтобы пропустить слой HDFStore pandas и использовать прямые таблицы. Я сохраняю каждый столбец как отдельный массив HDF5 в моем конечном файле.
Мой основной рабочий процесс - сначала получить файл CSV из базы данных. Я gzip это, так что это не так огромно. Затем я преобразовываю это в файл HDF5 с ориентацией на строки, перебирая его в python, преобразуя каждую строку в реальный тип данных и записывая его в файл HDF5. Это занимает несколько десятков минут, но не использует никакой памяти, поскольку работает только построчно. Затем я «транспонирую» ориентированный на строки файл HDF5 в ориентированный на столбцы файл HDF5.
Таблица транспонирования выглядит так:
Чтение обратно тогда выглядит так:
Теперь я обычно запускаю это на машине с тонной памяти, поэтому я могу быть недостаточно осторожен с использованием памяти. Например, по умолчанию операция загрузки считывает весь набор данных.
Обычно это работает для меня, но это немного неуклюже, и я не могу использовать причудливую магию pytables.
Изменить: реальное преимущество этого подхода, по сравнению с Pytables по умолчанию для массива записей, заключается в том, что я могу загрузить данные в R с помощью h5r, который не может обрабатывать таблицы. Или, по крайней мере, я не смог заставить его загружать разнородные таблицы.
источник
Один прием, который я нашел полезным для случаев использования больших данных, - это уменьшить объем данных за счет снижения точности с плавающей запятой до 32-битной. Это применимо не во всех случаях, но во многих приложениях 64-битная точность является излишней, а 2-кратная экономия памяти того стоит. Чтобы сделать очевидный момент еще более очевидным:
источник
Как отметили другие, через несколько лет появился « неосновательный» эквивалент панд: dask . Несмотря на то, что dask не является заменой панд и их функциональности, он выделяется по нескольким причинам:
Dask - это гибкая библиотека параллельных вычислений для аналитических вычислений, которая оптимизирована для динамического планирования задач для интерактивных вычислительных рабочих нагрузок коллекций «больших данных», таких как параллельные массивы, фреймы данных и списки, которые расширяют общие интерфейсы, такие как итераторы NumPy, Pandas или Python, до более крупных чем память или распределенные среды и масштабируется от ноутбуков до кластеров.
и добавить простой пример кода:
заменяет некоторый код панд следующим образом:
и, что особенно примечательно, предоставляет через
concurrent.futures
интерфейс общую инфраструктуру для выполнения пользовательских задач:источник
Здесь также стоит упомянуть Рэя ,
это распределенная вычислительная среда, которая имеет свою собственную реализацию для панд распределенным способом.
Просто замените импорт панд, и код должен работать как есть:
можете прочитать подробнее здесь:
https://rise.cs.berkeley.edu/blog/pandas-on-ray/
источник
Еще один вариант
Многие из операций, выполняемых в пандах, также могут выполняться в виде запросов к базе данных (sql, mongo).
Использование СУБД или mongodb позволяет выполнять некоторые агрегации в запросе к БД (который оптимизирован для больших данных и эффективно использует кэш и индексы)
Позже вы можете выполнить пост-обработку с помощью панд.
Преимущество этого метода заключается в том, что вы получаете оптимизацию БД для работы с большими данными, в то же время определяя логику в высокоуровневом декларативном синтаксисе - и вам не нужно разбираться с деталями, определяющими, что делать в памяти и что делать. ядра.
И хотя язык запросов и панды разные, обычно не сложно перевести часть логики из одной в другую.
источник
Рассмотрим Ruffus, если вы идете простым путем создания конвейера данных, который разбит на несколько небольших файлов.
источник
Недавно я столкнулся с похожей проблемой. Я обнаружил, что простое чтение данных по частям и добавление их, когда я пишу их по частям в тот же CSV, работает хорошо. Моя проблема заключалась в добавлении столбца даты на основе информации в другой таблице, используя значения определенных столбцов следующим образом. Это может помочь тем, кто смущен dask и hdf5, но лучше знаком с такими пандами, как я.
источник
Я хотел бы указать на пакет Vaex.
Посмотрите документацию: https://vaex.readthedocs.io/en/latest/ API очень близок к API панд.
источник
Почему панды? Вы пробовали стандартный Python ?
Использование стандартной библиотеки Python. Pandas подвержен частым обновлениям, даже с недавним выпуском стабильной версии.
Используя стандартную библиотеку python, ваш код всегда будет работать.
Один из способов сделать это - иметь представление о том, как вы хотите, чтобы ваши данные хранились, и какие вопросы вы хотите решить относительно данных. Затем нарисуйте схему того, как вы можете организовать свои данные (таблицы), которые помогут вам запрашивать данные, не обязательно нормализации.
Вы можете эффективно использовать:
Ram и HDD становятся все дешевле и дешевле, а стандартный Python 3 широко доступен и стабилен.
источник
В данный момент я работаю «как вы», просто по более низкой шкале, поэтому у меня нет PoC для моего предложения.
Тем не менее, я, кажется, добился успеха в использовании pickle в качестве системы кеширования и аутсорсинга выполнения различных функций в файлы - выполнение этих файлов из моего файла commando / main; Например, я использую prepare_use.py для преобразования типов объектов, разделения набора данных на набор данных тестирования, проверки и прогнозирования.
Как работает твое кеширование с рассолом? Я использую строки для доступа к файлам pickle, которые создаются динамически, в зависимости от того, какие параметры и наборы данных были переданы (с этим я пытаюсь захватить и определить, была ли программа уже запущена, используя .shape для набора данных, dict для переданного параметры). Соблюдая эти меры, я получаю строку, чтобы попытаться найти и прочитать файл .pickle, и могу, если найден, пропустить время обработки, чтобы перейти к выполнению, над которым я сейчас работаю.
При использовании баз данных я столкнулся с похожими проблемами, поэтому я с радостью использовал это решение - однако, существует множество ограничений - например, хранение огромных наборов солений из-за избыточности. Обновление таблицы до и после преобразования может быть выполнено с надлежащей индексацией - проверка информации открывает целую другую книгу (я попытался объединить данные проката для обхода контента и через 2 часа прекратил использовать базу данных), поскольку я хотел бы вернуться назад после каждый процесс трансформации)
Я надеюсь, что мои 2 цента помогут вам в некотором роде.
Приветствую.
источник