Las clases de datos se agregaron en Python 3.7.
Sería bueno que los pandas admitieran clases de datos. Por ejemplo, podría ser posible construir un marco de datos llamando a .from_dataclasses
o simplemente a .DataFrame(data=dataclass_list)
. También debería haber la posibilidad de hacer .to_dataclasses
.
from dataclasses import dataclass
import pandas as pd
<strong i="12">@dataclass</strong>
class SimpleDataObject(object):
field_a: int
field_b: str
dataclass_object1 = SimpleDataObject(1, 'a')
dataclass_object2 = SimpleDataObject(2, 'b')
>>> asd
# Dataclasses to DataFrame
df = pd.from_dataclasses([dataclass_object1, dataclass_object2])
df.dtypes == ['field_a', 'field_b']
>>> True
df.dtypes == ['int', 'str']
>>> True
# Dataclasses to DataFrame
df = pd.DataFrame(data=[dataclass_object1, dataclass_object2])
df.dtypes == ['field_a', 'field_b']
>>> True
df.dtypes == ['int', 'str']
>>> True
# DataFrame to Dataclasses
df = pd.DataFrame(columns=['field_a', 'field_b'], data=[[1, 'a'], [2, 'b']])
dataclass_list = df.to_dataclasses()
dataclass_list == [dataclass_object1, dataclass_object2]
>>> True
AFAIK no está garantizado que pueda saber que una determinada instancia es una clase de datos. Por ejemplo, las clases no heredan de dataclass.
De tu ejemplo:
<strong i="7">@dataclass</strong>
class SimpleDataObject(object):
field_a: int
field_b: str
x = SimpleDataObject(a=2, b=‘f’)
No creo que puedas decir por introspección que x
es una clase de datos, ¿correcto? Si ese es el caso, esto no es posible de hacer.
El módulo dataclasses
tiene funciones de introspección is_dataclass
y fields
, por lo que esa parte no debería ser un problema.
Dicho esto, no estoy seguro de que debamos comprometernos rápidamente con ninguna API/soporte específico aquí. Por ahora, el ayudante asdict
del módulo de clases de datos puede ayudar con el caso de uso de ingesta.
In [18]: from dataclasses import asdict
In [19]: pd.DataFrame([asdict(x) for x in [dataclass_object1, dataclass_object2]])
Out[19]:
field_a field_b
0 1 a
1 2 b
Compilé una solución donde compruebo los datos proporcionados durante __init__, en este PR , sin embargo, parece que su canal de prueba está configurado para admitir múltiples versiones de py. Así que puede que necesite un poco más de tiempo para que esto suceda.
Comentario más útil
El módulo
dataclasses
tiene funciones de introspecciónis_dataclass
yfields
, por lo que esa parte no debería ser un problema.Dicho esto, no estoy seguro de que debamos comprometernos rápidamente con ninguna API/soporte específico aquí. Por ahora, el ayudante
asdict
del módulo de clases de datos puede ayudar con el caso de uso de ingesta.