запись с паркета на паркет с помощью панд

#python #pandas #parquet

Вопрос:

Пытаюсь экспортировать и конвертировать свои данные в файл parquet. Данные-это данные sba от kaggle, которые мы немного изменили. Пытаюсь скрыть его, чтобы загрузить на сервер hfds.

Канал передачи данных https://www.kaggle.com/mirbektoktogaraev/should-this-loan-be-approved-or-denied

введите описание изображения здесь

введите описание изображения здесь

пытаюсь использовать код:

 sba.to_parquet('sba.parquet.gzip', compression = 'gzip', partition_cols= 'State')
 

но получите ошибку:

 ---------------------------------------------------------------------------
ArrowInvalid                              Traceback (most recent call last)
<ipython-input-39-377ee6551e44> in <module>
----> 1 sba.to_parquet('sba.parquet.gzip', compression = 'gzip', partition_cols= 'State')

/opt/conda/lib/python3.8/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    197                 else:
    198                     kwargs[new_arg_name] = new_arg_value
--> 199             return func(*args, **kwargs)
    200 
    201         return cast(F, wrapper)

/opt/conda/lib/python3.8/site-packages/pandas/core/frame.py in to_parquet(self, path, engine, compression, index, partition_cols, storage_options, **kwargs)
   2453         from pandas.io.parquet import to_parquet
   2454 
-> 2455         return to_parquet(
   2456             self,
   2457             path,

/opt/conda/lib/python3.8/site-packages/pandas/io/parquet.py in to_parquet(df, path, engine, compression, index, storage_options, partition_cols, **kwargs)
    388     path_or_buf: FilePathOrBuffer = io.BytesIO() if path is None else path
    389 
--> 390     impl.write(
    391         df,
    392         path_or_buf,

/opt/conda/lib/python3.8/site-packages/pandas/io/parquet.py in write(self, df, path, compression, index, storage_options, partition_cols, **kwargs)
    150             from_pandas_kwargs["preserve_index"] = index
    151 
--> 152         table = self.api.Table.from_pandas(df, **from_pandas_kwargs)
    153 
    154         path_or_handle, handles, kwargs["filesystem"] = _get_path_or_handle(

/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi in pyarrow.lib.Table.from_pandas()

/opt/conda/lib/python3.8/site-packages/pyarrow/pandas_compat.py in dataframe_to_arrays(df, schema, preserve_index, nthreads, columns, safe)
    600         for i, maybe_fut in enumerate(arrays):
    601             if isinstance(maybe_fut, futures.Future):
--> 602                 arrays[i] = maybe_fut.result()
    603 
    604     types = [x.type for x in arrays]

/opt/conda/lib/python3.8/concurrent/futures/_base.py in result(self, timeout)
    430                 raise CancelledError()
    431             elif self._state == FINISHED:
--> 432                 return self.__get_result()
    433 
    434             self._condition.wait(timeout)

/opt/conda/lib/python3.8/concurrent/futures/_base.py in __get_result(self)
    386     def __get_result(self):
    387         if self._exception:
--> 388             raise self._exception
    389         else:
    390             return self._result

/opt/conda/lib/python3.8/concurrent/futures/thread.py in run(self)
     55 
     56         try:
---> 57             result = self.fn(*self.args, **self.kwargs)
     58         except BaseException as exc:
     59             self.future.set_exception(exc)

/opt/conda/lib/python3.8/site-packages/pyarrow/pandas_compat.py in convert_column(col, field)
    572             e.args  = ("Conversion failed for column {!s} with type {!s}"
    573                        .format(col.name, col.dtype),)
--> 574             raise e
    575         if not field_nullable and result.null_count > 0:
    576             raise ValueError("Field {} was non-nullable but pandas column "

/opt/conda/lib/python3.8/site-packages/pyarrow/pandas_compat.py in convert_column(col, field)
    566 
    567         try:
--> 568             result = pa.array(col, type=type_, from_pandas=True, safe=safe)
    569         except (pa.ArrowInvalid,
    570                 pa.ArrowNotImplementedError,

/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi in pyarrow.lib.array()

/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi in pyarrow.lib._ndarray_to_array()

/opt/conda/lib/python3.8/site-packages/pyarrow/error.pxi in pyarrow.lib.check_status()

ArrowInvalid: ('Could not convert 2004 with type str: tried to convert to int', 'Conversion failed for column ApprovalFY with type object')
 

Любая помощь была бы потрясающей.

Комментарии:

1. Похоже, что в «Одобрении» могут быть объекты смешанного типа. Преобразование во все одинаковые типы (int или string) должно решить проблему. Более подробная информация о преобразовании из панд в стрелку

Ответ №1:

@Мика Корнфилд прав. Вот более конкретный ответ. Если вы посмотрите на свои данные, более конкретно, между строками 688127 и 688128, вы обнаружите следующее

df.loc[688127,»Одобрено»]
2004

против

df.loc[688128,»Одобрено»]
«2004»

Этот тип изменения данных вызывает проблемы при анализе в виде файла parquet. Я не эксперт по паркетным файлам, однако я понял, что паркетные файлы определяют тип данных, чтобы хранить их более эффективно. Поэтому, если у вас есть два разных типа данных в одном столбце, вы получите сообщение об ошибке. Многие люди сталкиваются с такого рода проблемами,когда они сохраняют свои данные в csv, а затем пытаются прочитать файл csv и объединить данные csv с новыми данными, которые они получают из API и т. Д. Каждый раз, когда вы сохраняете свои данные в формате csv, он преобразует их в текст, и когда вы читаете их, он может изменить их с 2004 на «2004».

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