Прямо сейчас я импортирую довольно большой CSV
файл данных каждый раз, когда запускаю скрипт. Есть ли хорошее решение для того, чтобы держать этот фрейм данных постоянно доступным между запусками, чтобы мне не пришлось тратить все это время на ожидание запуска скрипта?
317
Ответы:
Самый простой способ - засолить его, используя
to_pickle
:Затем вы можете загрузить его обратно, используя:
Примечание: до 0.11.1
save
иload
были единственным способом сделать это (теперь они устарели в пользуto_pickle
иread_pickle
соответственно).Другой популярный выбор - использовать HDF5 ( pytables ), который предлагает очень быстрое время доступа для больших наборов данных:
Более продвинутые стратегии обсуждаются в кулинарной книге .
Начиная с версии 0.13 есть также msgpack, который может быть лучше для обеспечения взаимодействия, как более быстрая альтернатива JSON, или если у вас есть данные, связанные с объектами Python / text-heavy (см. Этот вопрос ).
источник
Хотя уже есть некоторые ответы, я нашел хорошее сравнение, в котором они попробовали несколько способов сериализации Pandas DataFrames: Эффективное хранение Pandas DataFrames .
Они сравнивают:
В своем эксперименте они сериализуют DataFrame из 1 000 000 строк, причем два столбца проверяются отдельно: один с текстовыми данными, другой с числами. Их отказ от ответственности говорит:
Исходный код теста, на который они ссылаются, доступен онлайн . Поскольку этот код не работал напрямую, я внес некоторые незначительные изменения, которые вы можете получить здесь: serialize.py Я получил следующие результаты:
Они также упоминают, что с преобразованием текстовых данных в категориальные данные сериализация намного быстрее. В их тесте примерно в 10 раз быстрее (см. Также тестовый код).
Изменить : более высокие времена для рассола, чем CSV, можно объяснить используемым форматом данных. По умолчанию
pickle
используется печатное представление ASCII, которое генерирует большие наборы данных. Однако, как видно из графика, для консервирования с использованием более нового формата двоичных данных (версия 2pickle-p2
) время загрузки значительно меньше.Некоторые другие ссылки:
numpy.fromfile
является самым быстрым.источник
.to_pickle()
(который использует двоичное хранилище) с.to_hdf()
(без сжатия). Целью была скорость, размер файла для HDF был 11x Pickle, и время загрузки было 5x Pickle. Мои данные были ~ 5k файлов по ~ 7k строк по 6 столбцов каждый, в основном числовые.Если я правильно понимаю, вы уже используете,
pandas.read_csv()
но хотели бы ускорить процесс разработки, чтобы вам не приходилось загружать файл каждый раз, когда вы редактируете свой скрипт, не так ли? У меня есть несколько рекомендаций:вы можете загрузить только часть файла CSV, используя
pandas.read_csv(..., nrows=1000)
только верхний бит таблицы, пока вы занимаетесь разработкойиспользуйте ipython для интерактивного сеанса, чтобы таблица панд сохранялась в памяти при редактировании и перезагрузке скрипта.
преобразовать CSV в таблицу HDF5
обновленное использование
DataFrame.to_feather()
иpd.read_feather()
хранение данных в R-совместимом двоичном формате с пером , который очень быстрый (в моих руках, немного быстрее, чемpandas.to_pickle()
на числовых данных и намного быстрее на строковых данных).Вы также можете быть заинтересованы в этом ответе на stackoverflow.
источник
to_feather
бы хорошо работать со строковыми данными? Я установил бенчмаркингto_pickle
иto_feature
на моем числовом кадре данных и рассола примерно в 3 раза быстрее.Рассол работает хорошо!
источник
.pkl
предложенное в ответе @Andy Haydens.Вы можете использовать файл формата пера. Это очень быстро.
источник
R
помощьюfeather
библиотеки.У DataFrames Pandas есть
to_pickle
функция, которая полезна для сохранения DataFrame:источник
Как уже упоминалось, существуют различные параметры и форматы файлов ( HDF5 , JSON , CSV , паркет , SQL ) для хранения фрейма данных. Тем
pickle
не менее, это не первоклассный гражданин (в зависимости от вашей настройки), потому что:pickle
это потенциальный риск для безопасности. Сформируйте Python документацию для pickle :pickle
медленный. Найти здесь и здесь ориентиры.В зависимости от вашей настройки / использования оба ограничения не применяются, но я бы не рекомендовал
pickle
в качестве сохранения по умолчанию для кадров данных pandas.источник
Numpy форматы файлов довольно быстро для числовых данных
Я предпочитаю использовать NumPy файлы, так как с ними быстро и легко работать. Вот простой тест для сохранения и загрузки фрейма данных с 1 столбцом в 1 миллион точек.
используя
%%timeit
магическую функцию ipythonвыход
загрузить данные обратно в фрейм данных
выход
НЕПЛОХО!
МИНУСЫ
Существует проблема, если вы сохраняете файл с использованием Python 2, а затем пытаетесь открыть с помощью Python 3 (или наоборот).
источник
https://docs.python.org/3/library/pickle.html
Форматы протокола маринования:
Протокол версии 0 является исходным «читаемым человеком» протоколом и обратно совместим с более ранними версиями Python.
Протокол версии 1 - это старый двоичный формат, который также совместим с более ранними версиями Python.
Протокол версии 2 был представлен в Python 2.3. Это обеспечивает намного более эффективное травление классов нового стиля. Обратитесь к PEP 307 за информацией об улучшениях, внесенных протоколом 2.
Протокол версии 3 был добавлен в Python 3.0. Он имеет явную поддержку байтовых объектов и не может быть распакован Python 2.x. Это протокол по умолчанию и рекомендуемый протокол, когда требуется совместимость с другими версиями Python 3.
Протокол версии 4 был добавлен в Python 3.4. Добавлена поддержка очень больших объектов, выборка большего количества типов объектов и некоторые оптимизации форматов данных. Обратитесь к PEP 3154 за информацией об улучшениях, внесенных протоколом 4.
источник
pyarrow совместимость между версиями
Общий ход был в сторону pyarrow / пера (предупреждения об устаревании от pandas / msgpack). Однако у меня есть проблема с pyarrow с переходным процессом в спецификации. Данные, сериализованные с pyarrow 0.15.1, не могут быть десериализованы с 0.16.0 ARROW-7961 . Я использую сериализацию, чтобы использовать Redis, поэтому приходится использовать двоичную кодировку.
Я перепробовал различные варианты (используя ноутбук Jupyter)
Со следующими результатами для моего фрейма данных (в
out
переменной jupyter)перо и паркет не работают для моего фрейма данных. Я собираюсь продолжать использовать пиарроу. Однако я дополню рассолом (без компрессии). При записи в кеш-хранилище пиарроу и маринованные сериализуются формы При чтении из кэша происходит аварийное восстановление в случае сбоя десериализации pyarrow.
источник
Формат зависит от вашего варианта использования
Сравнение форматов файлов панд в этом видео .
источник