ΠΠ»Π°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π±ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π² Python 3.7.
ΠΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΏΠ»ΠΎΡ
ΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ ΠΏΠ°Π½Π΄Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π»ΠΈ ΠΊΠ»Π°ΡΡΡ Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΡΠΎΠΈΡΡ ΠΊΠ°Π΄Ρ Π΄Π°Π½Π½ΡΡ
, Π²ΡΠ·Π²Π°Π² .from_dataclasses
ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ .DataFrame(data=dataclass_list)
. Π’Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄Π΅Π»Π°ΡΡ .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 Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π½Π°ΡΡ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»Π°ΡΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠ»Π°ΡΡΡ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΡ ΠΊΠ»Π°ΡΡΠ° Π΄Π°Π½Π½ΡΡ .
ΠΠ· Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ°:
<strong i="7">@dataclass</strong>
class SimpleDataObject(object):
field_a: int
field_b: str
x = SimpleDataObject(a=2, b=βfβ)
Π― Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π΄Π°ΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠ· ΡΠ°ΠΌΠΎΠ°Π½Π°Π»ΠΈΠ·Π°, ΡΡΠΎ x
β ΡΡΠΎ ΠΊΠ»Π°ΡΡ Π΄Π°Π½Π½ΡΡ
, Π²Π΅ΡΠ½ΠΎ? ΠΡΠ»ΠΈ ΡΡΠΎ ΡΠ°ΠΊ, ΡΠΎ ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΠΎΠ΄ΡΠ»Ρ dataclasses
ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΠΌΠΎΠ°Π½Π°Π»ΠΈΠ·Π° is_dataclass
ΠΈ fields
, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠ° ΡΠ°ΡΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π±ΡΡΡΡΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ API/ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ Π·Π΄Π΅ΡΡ. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ
Π΅Π»ΠΏΠ΅Ρ asdict
ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ dataclasses ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠ΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
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
Π― ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π» ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΠΏΡΠΎΠ²Π΅ΡΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ __init__, Π² ΡΡΠΎΠΌ PR , ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΠΈΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π°ΡΡΡΠΎΠ΅Π½ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ py-Π²Π΅ΡΡΠΈΠΉ. Π’Π°ΠΊ ΡΡΠΎ ΠΌΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΡΠΎΠ±Ρ ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠΎΠ΄ΡΠ»Ρ
dataclasses
ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ°ΠΌΠΎΠ°Π½Π°Π»ΠΈΠ·Π°is_dataclass
ΠΈfields
, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΠ° ΡΠ°ΡΡΡ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ Π½Π°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π±ΡΡΡΡΠΎ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡ-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ API/ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ Π·Π΄Π΅ΡΡ. ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ Π΅Π»ΠΏΠ΅Ρ
asdict
ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ dataclasses ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ ΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΠ΅ΠΌ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.