В настоящий момент я импортирую довольно большой CSV
в качестве фреймворка данных каждый раз, когда запускаю script. Есть ли хорошее решение для постоянного хранения этого фрейма данных между прогонами, поэтому мне не нужно тратить все это время на ожидание запуска script?
Как сохранить кадр данных с помощью Pandas
Ответ 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 Я получил следующие результаты:
Они также упоминают, что с преобразованием текстовых данных в категориальные данные сериализация намного быстрее. В их тесте примерно в 10 раз быстрее (см. Также тестовый код).
Редактировать: более высокие времена для рассола, чем CSV, могут быть объяснены используемым форматом данных. По умолчанию pickle
использует печатное представление ASCII, которое генерирует большие наборы данных. Однако, как видно из графика, утилита pickle с использованием более нового формата двоичных данных (версия 2, pickle-p2
) имеет гораздо меньшее время загрузки.
Некоторые другие ссылки:
- В вопросе о самой быстрой библиотеке Python для чтения CSV файла есть очень подробный ответ, в котором сравниваются разные библиотеки для чтения CSV файлов с тестом. В результате для чтения CSV файлов
numpy.fromfile
является самым быстрым. - Другой тест сериализации показывает, что msgpack, ujson и cPickle являются самыми быстрыми в сериализации.
Ответ 3
Если я правильно понимаю, вы уже используете pandas.read_csv()
но хотели бы ускорить процесс разработки, чтобы вам не приходилось загружать файл каждый раз, когда вы редактируете свой скрипт, не так ли? У меня есть несколько рекомендаций:
-
вы можете загрузить только часть CSV файла, используя
pandas.read_csv(..., nrows=1000)
чтобы загрузить только верхний бит таблицы, пока вы занимаетесь разработкой -
используйте ipython для интерактивного сеанса, чтобы таблица панд сохранялась в памяти при редактировании и перезагрузке сценария.
-
преобразовать CSV в таблицу HDF5
-
обновлено использование
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.