ArrowNotImplementedError: ошибка halffloat при применении pandas.to_feather к кадру данных

У меня есть датафрейм со столбцами разных типов данных, включая даты. Нет, после внесения некоторых изменений, я хочу сохранить файл пера, чтобы получить к нему доступ позже. Но я получаю ошибку на следующем шаге

historical_transactions.to_feather('tmp/historical-raw')

ArrowNotImplementedError: halffloat

4 ответа

Я думаю, в вашем dataframe есть столбцы dtype как float16 который не поддерживается в формате пера. Вы можете преобразовать эти столбцы в float32 и попробовать.

Вы можете попробовать это:

    historical_transactions.astype('float32').to_feather('tmp/historical-raw')

Обратите внимание, что приведенная выше строка может завершиться ошибкой, если у вас также есть поля, которые нельзя преобразовать в float32. Чтобы игнорировать эти столбцы и оставить их как есть, попробуйте:

    historical_transactions.astype('float32', errors='ignore').to_feather('tmp/historical-raw')

Формат Feather зависит от Pyarrow, который, в свою очередь, зависит от формата Apache Parquet. Что касается форматов float, он поддерживает только float (32) и double (64). Не уверен, насколько это важно для вас, но есть также открытый запрос на автоматическое "Приведение стрелки половинной точности к float32" в GitHub.

Подробнее см. Здесь и здесь.

Улучшение ответа Кокаса, преобразование исключительно столбцов с полуплаванием

      half_floats = historical_transactions.select_dtypes(include="float16")
historical_transactions[half_floats.columns] = half_floats.astype("float32")
historical_transactions.to_feather('tmp/historical-raw')

Другой обходной путь — просматривать как при сохранении, так и при загрузке. Например:

      import numpy as np


def encode_float16_to_uint16(f16):
    return np.frombuffer(f16.astype(np.float16, copy=False), dtype=np.uint16)


def decode_uint16_to_float16(u16):
    return np.frombuffer(u16.astype(np.uint16, copy=False), dtype=np.float16)

numpy.frombufferсоздает представление исходного объекта, следовательно, при просмотре не используется копирование данныхfloat16массив какuint16и наоборот. Этот обходной путь настолько дешев, насколько это возможно.

Другие вопросы по тегам