Как сохранить кадр данных с помощью Pandas

В настоящий момент я импортирую довольно большой CSV в качестве фреймворка данных каждый раз, когда запускаю script. Есть ли хорошее решение для постоянного хранения этого фрейма данных между прогонами, поэтому мне не нужно тратить все это время на ожидание запуска script?

Ответ 1

Самый простой способ - pickle с помощью to_pickle:

df.to_pickle(file_name)  # where to save it, usually as a .pkl

Затем вы можете загрузить его с помощью:

df = pd.read_pickle(file_name)

Примечание: до 0.11.1 save и load были единственным способом сделать это (теперь они устарели в пользу to_pickle и read_pickle соответственно).


Еще один популярный выбор - использовать HDF5 (pytables), который предлагает очень быстро время доступа для больших наборов данных:

store = HDFStore('store.h5')

store['df'] = df  # save it
store['df']  # load it

Более продвинутые стратегии обсуждаются в cookbook.


Начиная с версии 0.13 также msgpack, которая может быть лучше для интероперабельности, как более быстрая альтернатива JSON, или если у вас есть объект python/text-heavy (см. этот вопрос).

Ответ 2

Хотя уже есть некоторые ответы, я нашел хорошее сравнение, в котором они попробовали несколько способов сериализации Pandas DataFrames: Эффективное хранение Pandas DataFrames.

Они сравнивают:

  • pickle: оригинальный формат данных ASCII
  • cPickle, библиотека C
  • pickle-p2: использует более новый двоичный формат
  • json: стандартная библиотека json
  • json-no-index: как json, но без индекса
  • msgpack: двоичная альтернатива JSON
  • CSV
  • hdfstore: формат хранения HDF5

В своем эксперименте они сериализуют DataFrame из 1 000 000 строк, причем два столбца проверяются отдельно: один с текстовыми данными, другой с числами. Их отказ от ответственности говорит:

Вы не должны доверять тому, что следует обобщению ваших данных. Вы должны посмотреть на свои собственные данные и запустить тесты самостоятельно

Исходный код теста, на который они ссылаются, доступен онлайн. Поскольку этот код не работал напрямую, я внес некоторые незначительные изменения, которые вы можете получить здесь: serialize.py Я получил следующие результаты:

time comparison results

Они также упоминают, что с преобразованием текстовых данных в категориальные данные сериализация намного быстрее. В их тесте примерно в 10 раз быстрее (см. Также тестовый код).

Редактировать: более высокие времена для рассола, чем CSV, могут быть объяснены используемым форматом данных. По умолчанию pickle использует печатное представление ASCII, которое генерирует большие наборы данных. Однако, как видно из графика, утилита pickle с использованием более нового формата двоичных данных (версия 2, pickle-p2) имеет гораздо меньшее время загрузки.

Некоторые другие ссылки:

Ответ 3

Если я правильно понимаю, вы уже используете pandas.read_csv() но хотели бы ускорить процесс разработки, чтобы вам не приходилось загружать файл каждый раз, когда вы редактируете свой скрипт, не так ли? У меня есть несколько рекомендаций:

  1. вы можете загрузить только часть CSV файла, используя pandas.read_csv(..., nrows=1000) чтобы загрузить только верхний бит таблицы, пока вы занимаетесь разработкой

  2. используйте ipython для интерактивного сеанса, чтобы таблица панд сохранялась в памяти при редактировании и перезагрузке сценария.

  3. преобразовать CSV в таблицу HDF5

  4. обновлено использование DataFrame.to_feather() и pd.read_feather() для хранения данных в двоичном формате R-совместимого пера, который очень быстрый (в моих руках, немного быстрее, чем pandas.to_pickle() для числовых данных и намного быстрее для строковых данных).

Вы также можете быть заинтересованы в этом ответе на stackoverflow.

Ответ 4

Сопло работает хорошо!

import pandas as pd
df.to_pickle('123.pkl')    #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df

Ответ 5

Pandas DataFrames имеют функцию to_pickle, которая полезна для сохранения DataFrame:

import pandas as pd

a = pd.DataFrame({'A':[0,1,0,1,0],'B':[True, True, False, False, False]})
print a
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False

a.to_pickle('my_file.pkl')

b = pd.read_pickle('my_file.pkl')
print b
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False

Ответ 6

Вы можете использовать файл формата пера. Это очень быстро.

df.to_feather('filename.ft')

Ответ 7

Как уже упоминалось, существуют различные параметры и форматы файлов (HDF5, JSON, CSV, паркет, SQL) для хранения фрейма данных. Однако pickle не является гражданином первого класса (в зависимости от ваших настроек), потому что:

1) pickle является потенциальной угрозой безопасности. Сформируйте Python документацию для pickle:

Предупреждение Модуль pickle не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников.

2) pickle медленный. Найти здесь и здесь ориентиры.

В зависимости от вашей настройки/использования оба ограничения не применяются, но я бы не рекомендовал использовать pickle как постоянство по умолчанию для фреймов данных pandas.

Ответ 8

Формат файлов Numpy довольно быстрый для числовых данных

Я предпочитаю использовать numpy файлы, так как они работают быстро и легко. Здесь простой тест для сохранения и загрузки блока данных с 1 столбцом в 1 миллион точек.

import numpy as np
import pandas as pd

num_dict = {'voltage': np.random.rand(1000000)}
num_df = pd.DataFrame(num_dict)

используя магическую функцию ipython %%timeit

%%timeit
with open('num.npy', 'wb') as np_file:
    np.save(np_file, num_df)

вывод

100 loops, best of 3: 5.97 ms per loop

чтобы загрузить данные обратно в фрейм данных

%%timeit
with open('num.npy', 'rb') as np_file:
    data = np.load(np_file)

data_df = pd.DataFrame(data)

вывод

100 loops, best of 3: 5.12 ms per loop

НЕ ПЛОХО!

CONS

Там проблема, если вы сохраните файл numpy с помощью python 2, а затем попробуйте открыть с помощью python 3 (или наоборот).

Ответ 9

import pickle

example_dict = {1:"6",2:"2",3:"g"}

pickle_out = open("dict.pickle","wb")
pickle.dump(example_dict, pickle_out)
pickle_out.close()

Приведенный выше код сохранит файл рассола

pickle_in = open("dict.pickle","rb")
example_dict = pickle.load(pickle_in)

Эти две строки откроют сохраненный файл рассола

Ответ 10

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.