Ошибка типа: аргумент «схема»: «Объект» не является типом данных PolarsPython

Программы на Python
Ответить
Anonymous
 Ошибка типа: аргумент «схема»: «Объект» не является типом данных Polars

Сообщение Anonymous »

Почему?
Я запрашиваю данные из коллекции MongoDB и загружаю результат в Polars DataFrame. В зависимости от фильтра limit запроса mongo операция работает или вызывает ошибку заголовка. Мне не удалось это исправить, потому что я не могу сказать, связана ли проблема с Mongo или с Polars. Кстати, я новичок в Polars.
Контекст
По сути, это запрос, который я выполняю на Python, используя pymongo==4.5. .0:

Код: Выделить всё

import datetime as dt
res= mongo_clt.col.db.find(
filter={
'createdAt': {
'$gte': dt.datetime.fromisoformat("2024-09-01")
},
},
projection=[
"type",
"checked",
"status",
"createdAt",
],
limit=0
)
Обратите внимание, что установка limit=0 — это то же самое, что отсутствие добавления ограничения, и поэтому следует запрашивать все записи.
Теперь ссылка, между датой 2024-09-01 и сегодня (2025-01-08) я должен собрать около 4700 строк, которые я проверил, выполнив запрос в MongoDB Compass и загрузив ответ непосредственно в кадр данных Pandas вместо Полярный.
Схема, которую я использую для прогнозируемых переменных:

Код: Выделить всё

import polars as pl
cols_type = {
'type':pl.Categorical,
'checked':pl.Boolean,
'status':pl.Categorical,
'createdAt':pl.Datetime('ms')
}
Тогда распаковка ответа будет следующей:

Код: Выделить всё

df = pl.DataFrame(
data=res,
schema_overrides=cols_types,
)
Проблема
Если я устанавливаю предел = 100 или даже предел = 1000, операция работает, и я получаю Polars dataframe со 100 (или 1000) строками правильных типов.
Теперь, если я подниму предел до 4000 или просто удалю его, я получу следующую ошибку:

Код: Выделить всё

{
"name": "TypeError",
"message": "argument 'schema': 'Object' is not a Polars data type",
"stack": "---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[5], line 1
----> 1 df_raq = pl.DataFrame(
2     data=res,
3     schema_overrides=cols_types,
4 )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/dataframe/frame.py:419, in DataFrame.__init__(self, data, schema, schema_overrides, strict, orient, infer_schema_length, nan_to_null)
414     self._df = pandas_to_pydf(
415         data, schema=schema, schema_overrides=schema_overrides, strict=strict
416     )
418 elif not isinstance(data, Sized) and isinstance(data, (Generator, Iterable)):
--> 419     self._df = iterable_to_pydf(
420         data,
421         schema=schema,
422         schema_overrides=schema_overrides,
423         strict=strict,
424         orient=orient,
425         infer_schema_length=infer_schema_length,
426     )
428 elif isinstance(data, pl.DataFrame):
429     self._df = dataframe_to_pydf(
430         data, schema=schema, schema_overrides=schema_overrides, strict=strict
431     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:990, in iterable_to_pydf(data, schema, schema_overrides, strict, orient, chunk_size, infer_schema_length)
988 if not values:
989     break
--> 990 frame_chunk = to_frame_chunk(values, original_schema)
991 if df is None:
992     df = frame_chunk

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:963, in iterable_to_pydf..to_frame_chunk(values, schema)
962 def to_frame_chunk(values: list[Any], schema: SchemaDefinition | None) -> DataFrame:
--> 963     return pl.DataFrame(
964         data=values,
965         schema=schema,
966         strict=strict,
967         orient=\"row\",
968         infer_schema_length=infer_schema_length,
969     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/dataframe/frame.py:384, in DataFrame.__init__(self, data, schema, schema_overrides, strict, orient, infer_schema_length, nan_to_null)
375     self._df = dict_to_pydf(
376         data,
377         schema=schema,
(...)
380         nan_to_null=nan_to_null,
381     )
383 elif isinstance(data, (list, tuple, Sequence)):
-->  384     self._df = sequence_to_pydf(
385         data,
386         schema=schema,
387         schema_overrides=schema_overrides,
388         strict=strict,
389         orient=orient,
390         infer_schema_length=infer_schema_length,
391     )
393 elif isinstance(data, pl.Series):
394     self._df = series_to_pydf(
395         data, schema=schema, schema_overrides=schema_overrides, strict=strict
396     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:435, in sequence_to_pydf(data, schema, schema_overrides, strict, orient, infer_schema_length)
432 if not data:
433     return dict_to_pydf({}, schema=schema, schema_overrides=schema_overrides)
--> 435 return _sequence_to_pydf_dispatcher(
436     data[0],
437     data=data,
438     schema=schema,
439     schema_overrides=schema_overrides,
440     strict=strict,
441     orient=orient,
442     infer_schema_length=infer_schema_length,
443 )

File ~/.pyenv/versions/3.10.12/lib/python3.10/functools.py:889, in singledispatch..wrapper(*args, **kw)
885 if not args:
886     raise TypeError(f'{funcname} requires at least '
887                     '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:676, in _sequence_of_dict_to_pydf(first_element, data, schema, schema_overrides, strict, infer_schema_length, **kwargs)
668 column_names, schema_overrides = _unpack_schema(
669     schema, schema_overrides=schema_overrides
670 )
671 dicts_schema = (
672     _include_unknowns(schema_overrides, column_names or list(schema_overrides))
673     if column_names
674     else None
675 )
--> 676 pydf = PyDataFrame.from_dicts(
677     data,
678     dicts_schema,
679     schema_overrides,
680     strict=strict,
681     infer_schema_length=infer_schema_length,
682 )
684 # TODO: we can remove this `schema_overrides` block completely
685 #  once https://github.com/pola-rs/polars/issues/11044 is fixed
686 if schema_overrides:

TypeError: argument 'schema': 'Object' is not a Polars data type"
}
Я предполагаю, что схема вывода по полярам имеет какую-то проблему, поэтому я попробовал установить pl.DataFrame(strict=False), но это не дало никакого эффекта.
Обновление
Из проецируемых столбцов
единственным, который не приводится явно, является _id, который всегда возвращается .
В монго есть типа ObjectId, так что именно на него ссылается приведенная выше ошибка.
Поэтому я принудительно привел его к pl.String, и результатом стала *новая ошибка поднят, являясь ComputeError:

Код: Выделить всё

{
"name": "ComputeError",
"message": "could not append value: 677fe3e18f80eb81115eb375 of type: object to the builder; make sure that all rows have the same schema or consider increasing `infer_schema_length`

it might also be that a value overflows the data-type's capacity",
"stack": "---------------------------------------------------------------------------
ComputeError                              Traceback (most recent call last)
Cell In[3], line 23
1 res= mongo_clt.col.db.find(
2     filter={
3         'createdAt': {
(...)
20     limit=0
21 )
---> 23 df = pl.DataFrame(
24     data=res,
25     schema={
26         '_id':pl.String,
27         'type':pl.Categorical,
28         'checked':pl.Boolean,
29         # 'assetId':pl.String,
30         'status':pl.Categorical,
31         'createdAt':pl.Datetime('ms'),
32         'feedback':pl.Struct
33     }
34 )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/dataframe/frame.py:419, in DataFrame.__init__(self, data, schema, schema_overrides, strict, orient, infer_schema_length, nan_to_null)
414     self._df = pandas_to_pydf(
415         data, schema=schema, schema_overrides=schema_overrides, strict=strict
416     )
418 elif not isinstance(data, Sized) and isinstance(data, (Generator, Iterable)):
--> 419     self._df = iterable_to_pydf(
420         data,
421         schema=schema,
422         schema_overrides=schema_overrides,
423         strict=strict,
424         orient=orient,
425         infer_schema_length=infer_schema_length,
426     )
428 elif isinstance(data, pl.DataFrame):
429     self._df = dataframe_to_pydf(
430         data, schema=schema, schema_overrides=schema_overrides, strict=strict
431     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:990, in iterable_to_pydf(data, schema, schema_overrides, strict, orient, chunk_size, infer_schema_length)
988 if not values:
989     break
--> 990 frame_chunk = to_frame_chunk(values, original_schema)
991 if df is None:
992     df = frame_chunk

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:963, in iterable_to_pydf..to_frame_chunk(values, schema)
962 def to_frame_chunk(values: list[Any], schema: SchemaDefinition | None) -> DataFrame:
--> 963     return pl.DataFrame(
964         data=values,
965         schema=schema,
966         strict=strict,
967         orient=\"row\",
968         infer_schema_length=infer_schema_length,
969     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/dataframe/frame.py:384, in DataFrame.__init__(self, data, schema, schema_overrides, strict, orient, infer_schema_length, nan_to_null)
375     self._df = dict_to_pydf(
376         data,
377         schema=schema,
(...)
380         nan_to_null=nan_to_null,
381     )
383 elif isinstance(data, (list, tuple, Sequence)):
--> 384     self._df = sequence_to_pydf(
385         data,
386         schema=schema,
387         schema_overrides=schema_overrides,
388         strict=strict,
389         orient=orient,
390         infer_schema_length=infer_schema_length,
391     )
393 elif isinstance(data, pl.Series):
394     self._df = series_to_pydf(
395         data, schema=schema, schema_overrides=schema_overrides, strict=strict
396     )

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:435, in sequence_to_pydf(data, schema, schema_overrides, strict, orient, infer_schema_length)
432 if not data:
433     return dict_to_pydf({}, schema=schema, schema_overrides=schema_overrides)
-->  435 return _sequence_to_pydf_dispatcher(
436     data[0],
437     data=data,
438     schema=schema,
439     schema_overrides=schema_overrides,
440     strict=strict,
441     orient=orient,
442     infer_schema_length=infer_schema_length,
443 )

File ~/.pyenv/versions/3.10.12/lib/python3.10/functools.py:889, in singledispatch..wrapper(*args, **kw)
885 if not args:
886     raise TypeError(f'{funcname} requires at least '
887                     '1 positional argument')
--> 889 return dispatch(args[0].__class__)(*args, **kw)

File ~/Desktop/dev/.venv/lib/python3.10/site-packages/polars/_utils/construction/dataframe.py:676, in _sequence_of_dict_to_pydf(first_element, data, schema, schema_overrides, strict, infer_schema_length, **kwargs)
668 column_names, schema_overrides = _unpack_schema(
669     schema, schema_overrides=schema_overrides
670 )
671 dicts_schema = (
672     _include_unknowns(schema_overrides, column_names or list(schema_overrides))
673     if column_names
674     else None
675 )
--> 676 pydf = PyDataFrame.from_dicts(
677     data,
678     dicts_schema,
679     schema_overrides,
680     strict=strict,
681     infer_schema_length=infer_schema_length,
682 )
684 # TODO: we can remove this `schema_overrides` block completely
685 #  once https://github.com/pola-rs/polars/issues/11044 is fixed
686 if schema_overrides:

ComputeError: could not append value: 677fe3e18f80eb81115eb375 of type: object to the builder; make sure that all rows have the same schema or consider increasing `infer_schema_length`

it might also be that a value overflows the data-type's capacity"
}
  • Я не могу увеличить infer_schema_lenght, потому что я уже использую полную длину.
  • Значение 677fe3e18f80eb81115eb375 соответствует _id, но я мог видеть это только в MongoDB Compass, когда я загружаю ответ с помощью Pandas, я не нахожу этого row.
  • Может ли быть так: значение превышает емкость типа данных ?


Подробнее здесь: https://stackoverflow.com/questions/793 ... -data-type
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»