Я запрашиваю данные из коллекции 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
)
Теперь ссылка, между датой 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"
}
Обновление
Из проецируемых столбцов
единственным, который не приводится явно, является _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
Мобильная версия