В каком формате экспортировать фрейм данных Pandas при сохранении типов данных?Не CSV;SQLite?Паркет? - PullRequest
1 голос
/ 25 марта 2019

Мой рабочий процесс обычно включает загрузку некоторых данных, обычно из файлов CSV, в кадр данных pandas, очистку их, определение правильного типа данных для каждого столбца, а затем их экспорт на сервер SQL.

Дляте ситуации когда сервер SQL недоступен, каковы хорошие альтернативы для хранения очищенных данных и явного определения типа данных для каждого столбца?

  • Единственное реальное решениеЯ протестировал экспорт в файл sqlite .db , используя ответ здесь , чтобы убедиться, что даты читаются как даты.
  • Как насчет Перо, HDF5, Паркет? Панды поддерживают их , но я не знаю много об этих форматах.Я прочитал, что перо не рекомендуется для длительного хранения (потому что API может измениться? Не ясно)

  • Я не уверен в использовании маринада: я понимаю, что это не безопасный формат,и API постоянно меняется и нарушает обратную совместимость

  • CSV на самом деле не вариант, потому что вывод типов данных в моих данных часто является кошмаром ;при чтении данных обратно в панды мне нужно было бы явно объявить форматы, включая формат даты, в противном случае:

    • панды могут создавать столбцы, где одна строка - это дд-мм-гггг, а другая строкамм-дд-гггг (см. здесь ).Плюс
    • У меня есть много текстовых столбцов, в которых первые 10 тыс. Строк кажутся числами, а следующие 100 - текстовыми, поэтому большинство программных продуктов определит, что столбец числовой, а затем не выполнит импорт. Может быть, мне нужно создать функцию, которая экспортирует вспомогательный файл со всеми определениями типов данных, форматами даты и т. Д.?Возможные, но громоздкие .

ОБНОВЛЕНИЕ : Это интересное сравнение, согласно которому HDF5 был самым быстрым форматом: https://medium.com/@bobhaffner/gist-to-medium-test-db3d51b8ba7b

Кажется, я понимаю, что еще одно различие между HDF5 и Parquet заключается в том, что datetime64 не имеет прямого эквивалента в Hdf5.Кажется, что большинство людей хранят свои даты в HDF5 в виде строк в формате ISO (гггг-мм-дд).

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Если ваши данные представляют собой двумерную таблицу и предназначены для обработки больших данных, таких как Apache Spark, используйте паркет. HDF5 не подходит для обработки даты / времени, как вы упомянули.

Если ваши данные имеют 3 или более измерений, HDF5 будет хорошим выбором - особенно для долгосрочного архивирования, переносимости и совместного использования.

Apache Feather - самая быстрая, если производительность имеет значение.

1 голос
/ 25 марта 2019

Если вы действительно хотите избежать консервирования и сохранения CSV (я не полностью согласен с вашими утверждениями о том, что эти варианты невозможны), вы можете запустить локальный сервер базы данных, чтобы сохранить данные и выполнить дамп / восстановление.процесс, когда сервер SQL снова доступен.В противном случае:

Используйте to_pickle метод объекта DataFrame.

Или сохраните файл json типа данных с вашими типами данных и укажите формат даты, когдасохранение CSV:

# export
import json
data_types = df.dtypes.astype(str).to_dict()
with open('data_type_key.json', 'w') as f
    json.dump(data_types, f)
df.to_csv('data.csv', date_format='%Y%m%d')

# import
data_types = json.loads('data_type_key.json')
data_frame = pd.read_csv(your_csv_path, dtype=data_types)
...