Pandas: Soporte de clase de datos

Creado en 14 jul. 2018  ·  3Comentarios  ·  Fuente: pandas-dev/pandas

Descripción de la propuesta

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 .

Comportamiento esperado

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
API Design Needs Discussion

Comentario más útil

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

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones