Menu Docs
Página inicial do Docs
/ / /
PyMongoArrow

Tipos de dados

Nesta página

  • Considerações sobre arrays incorporadas
  • Tipos de extensão
  • Valores nulos e conversão para DataFrames Pandas
  • Tipos de extensão aninhadas

O PyMongoArrow suporta a maioria dos BSON types. Como Arrow ePolars fornecem suporte de primeira classe para Listas e Estruturas, isso inclui matrizes e documentos incorporados.

O suporte para tipos adicionais será adicionado em versões subsequentes.

Dica

Para obter mais informações sobre BSON types os tipos de BSON, consulte a BSON especificação de BSON.

Tipo de JSON
Identificadores de tipo
String
py.str, uma instância de pyarrow.string
documento incorporado
py.dict, e instância de pyarrow.struct
Array incorporada
Uma instância de pyarrow.list_
ObjectId
py.bytes, bson.ObjectId, uma instância de pymongoarrow.types.ObjectIdType, uma instância de pymongoarrow.pandas_types.PandasObjectId
Decimal128
bson.Decimal128, uma instância de pymongoarrow.types.Decimal128Type, uma instância de pymongoarrow.pandas_types.PandasDecimal128
Boolean
Uma instância de ~pyarrow.bool_, ~py.bool
Ponto flutuante binário de 64 bits
py.float, uma instância de pyarrow.float64
Inteiro de bits
Uma instância de pyarrow.int32
Inteiro de 64 bits
~py.int, bson.int64.Int64, uma instância de pyarrow.int64
Data hora UTC
Uma instância de ~pyarrow.timestamp com resolução ms , py.datetime.datetime
Dados binários
bson.Binary, uma instância de pymongoarrow.types.BinaryType, uma instância de pymongoarrow.pandas_types.PandasBinary.
Código JavaScript
bson.Code, uma instância de pymongoarrow.types.CodeType, uma instância de pymongoarrow.pandas_types.PandasCode

Observação

O PyMongoArow suporta Decimal128 apenas em sistemas little-endian. Em sistemas big-endian, ele usa null em vez disso.

Utilize identificadores de tipo para especificar que um campo é de um determinado tipo durante a declaração pymongoarrow.api.Schema . Por exemplo, se seus dados tiverem campos f1 e f2 tipos de suporte inteiro de 32 bits e data/hora UTC, e um _id que é um ObjectId, você poderá definir seu esquema da seguinte maneira:

schema = Schema({
'_id': ObjectId,
'f1': pyarrow.int32(),
'f2': pyarrow.timestamp('ms')
})

Tipos de dados não suportados em um esquema causam um ValueError identificando o campo e seu tipo de dados.

O esquema utilizado para uma array incorporada deve utilizar o tipo pyarrow.list_() , para especificar o tipo dos elementos da array. Por exemplo,

from pyarrow import list_, float64
schema = Schema({'_id': ObjectId,
'location': {'coordinates': list_(float64())}
})

O PyMongoArrow implementa os tipos ObjectId, Decimal128, Binary data e JavaScript code como tipos de extensão para PyArrow e Pandas. Para tabelas de setas, os valores desses tipos têm o tipo de extensão pymongoarrow apropriado, como pymongoarrow.types.ObjectIdType. Você pode obter o objeto Python bson apropriado usando o método .as_py() ou chamando .to_pylist() na tabela.

>>> from pymongo import MongoClient
>>> from bson import ObjectId
>>> from pymongoarrow.api import find_arrow_all
>>> client = MongoClient()
>>> coll = client.test.test
>>> coll.insert_many([{"_id": ObjectId(), "foo": 100}, {"_id": ObjectId(), "foo": 200}])
<pymongo.results.InsertManyResult at 0x1080a72b0>
>>> table = find_arrow_all(coll, {})
>>> table
pyarrow.Table
_id: extension<arrow.py_extension_type<ObjectIdType>>
foo: int32
----
_id: [[64408B0D5AC9E208AF220142,64408B0D5AC9E208AF220143]]
foo: [[100,200]]
>>> table["_id"][0]
<pyarrow.ObjectIdScalar: ObjectId('64408b0d5ac9e208af220142')>
>>> table["_id"][0].as_py()
ObjectId('64408b0d5ac9e208af220142')
>>> table.to_pylist()
[{'_id': ObjectId('64408b0d5ac9e208af220142'), 'foo': 100},
{'_id': ObjectId('64408b0d5ac9e208af220143'), 'foo': 200}]

Ao converter parapandas, as colunas do tipo de extensão têm um tipo de extensão pymongoarrow apropriado, como pymongoarrow.pandas_types.PandasDecimal128 . O valor do elemento no dataframe é o tipo bson apropriado.

>>> from pymongo import MongoClient
>>> from bson import Decimal128
>>> from pymongoarrow.api import find_pandas_all
>>> client = MongoClient()
>>> coll = client.test.test
>>> coll.insert_many([{"foo": Decimal128("0.1")}, {"foo": Decimal128("0.1")}])
<pymongo.results.InsertManyResult at 0x1080a72b0>
>>> df = find_pandas_all(coll, {})
>>> df
_id foo
0 64408bf65ac9e208af220144 0.1
1 64408bf65ac9e208af220145 0.1
>>> df["foo"].dtype
<pymongoarrow.pandas_types.PandasDecimal128 at 0x11fe0ae90>
>>> df["foo"][0]
Decimal128('0.1')
>>> df["_id"][0]
ObjectId('64408bf65ac9e208af220144')

O Apollos não suporta Tipos de Extensão.

Em Seta e Áries, todas as Matrizes são anuláveis. O Pandas tem tipos de dados experimentais anuláveis, como Int64. Você pode instruir a Arrow a criar um DataFrame de Pandas usando dtypes anuláveis com o seguinte código de documentação do Apache.

>>> dtype_mapping = {
... pa.int8(): pd.Int8Dtype(),
... pa.int16(): pd.Int16Dtype(),
... pa.int32(): pd.Int32Dtype(),
... pa.int64(): pd.Int64Dtype(),
... pa.uint8(): pd.UInt8Dtype(),
... pa.uint16(): pd.UInt16Dtype(),
... pa.uint32(): pd.UInt32Dtype(),
... pa.uint64(): pd.UInt64Dtype(),
... pa.bool_(): pd.BooleanDtype(),
... pa.float32(): pd.Float32Dtype(),
... pa.float64(): pd.Float64Dtype(),
... pa.string(): pd.StringDtype(),
... }
... df = arrow_table.to_pandas(
... types_mapper=dtype_mapping.get, split_blocks=True, self_destruct=True
... )
... del arrow_table

Definir uma conversão para pa.string() também converte strings de Arrow em strings NumPy, e não objetos.

seta pendente-179, os tipos de extensão, como ObjectId, que aparecem em documentos aninhados não são convertidos para o tipo de extensão PyMongoArrow correspondente , mas têm o tipo bruto de Arrow, FixedSizeBinaryType(fixed_size_binary[12]).

Estes valores podem ser consumidos como estão ou convertidos individualmente para o tipo de extensão desejado, como _id = out['nested'][0]['_id'].cast(ObjectIdType()).

Voltar

Comparação com o PyMongo