Pandas read_csv есть ли способ преобразовать типы данных sqlachemy в pandas dtypes? - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь прочитать в CSV, что я в конечном итоге подтолкнуть к базе данных. У меня есть предопределенная модель данных, в которой данные в конечном итоге. Также у csv нет заголовка.

Если я определю модель, например:

class SamFoo(Base):
    __tablename__ = 'foo'

    duns = Column(Text)
    duns_plus_four = Column(Text)
    cage_code = Column(Text)
    dodaac = Column(Text)
    sam_extract_code = Column(Text)
    purpose_of_registration = Column(Text)
    initial_registration_date = Column(DateTime)
    ...

Если я попытаюсь read_csv,

sam_name_type_dict = {c.name: c.type for c in SamFoo.__table__.c}
sam_name_type_dict.pop('id', None) # id isn't in csv data.
raw_data = pd.read_csv(
        data,
        sep='|',
        skiprows=1,
        header=None,
        names=list(sam_name_type_dict.keys()),
        dtype=sam_name_type_dict,
    )

Я получаю TypeError: data type not understood, поэтому мой вопрос, есть ли способ сопоставить типы данных sqlachemy с dtypes pandas?

1 Ответ

0 голосов
/ 08 мая 2018

Вот как я решил это:

from sqlalchemy.types import DateTime, Integer, Boolean, Text
import numpy as np
types_map = {
    Text: object,
    DateTime: np.datetime64,
    Integer: np.float64, # NA integer gotcha https://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
    Boolean: bool,
}

# had to split dates and regular dtypes into separate dicts
sam_sql_types = {c.name: c.type for c in SamFoo.__table__.c}
sam_sql_types.pop('id', None) # no id in csv
sam_dtypes = {k: types_map[type(v)] for k, v in sam_sql_types.items()}
sam_dates = {k: v for k, v in sam_dtypes.items() if v == np.datetime64}
sam_dtypes_non_dates = {k: v for k, v in sam_dtypes.items() if v != np.datetime64}

raw_data = pd.read_csv(
    data,
    sep='|',
    skiprows=1,
    header=None,
    names=list(sam_sql_types.keys()),
    dtype=sam_dtypes_non_dates,
    parse_dates=list(sam_dates.keys())
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...