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
и наоборот. Этот обходной путь настолько дешев, насколько это возможно.