Типы привязки во фрейме данных для MSSQL - PullRequest
0 голосов
/ 19 января 2019

У меня есть собственное приложение на python, которое я создал для работы с ETL.По сути, это работает довольно хорошо, но у меня возникли некоторые проблемы с поиском оптимизированного способа привязки типов данных в фрейме данных к безопасным типам для MSSQL.

Что я сейчас делаю, так это:

def _bindKnownType(self, val): 
    """docstring"""

    if isinstance(val, bool):
        val = int(val)
    elif isinstance(val, pd._libs.tslibs.timestamps.Timestamp):
        val = val.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]
    elif pd.isnull(val):
        val = None

    return val

def InsertDf(df)
    """docstring"""
    values = []
    for arr in df.values:
        values.append(list(arr))
    safeVals = []
    for iter in values:
        v = [self._bindKnownType(v) for v in iter]
        safeVals.append(v)
        values = safeVals     
    mySQLInsertFunction(df, values)

Таким образом, выше пара функций.Первый принимает значение и проверяет его тип, приводя его при необходимости, второй является промежуточной функцией, которая считывает все значения в кадре данных в список, а затем перебирает этот список, передавая каждое значение функции _bindKnownType.

Мое решение выше - отстой.Это очень медленно.Я уверен, что мог бы сделать все необходимые преобразования в виде векторизованной функции, но у меня возникают проблемы с получением истинных типов данных объектов.У кого-нибудь есть отличное решение для этого?Я уверен, что не должен быть первым человеком, борющимся с этим ...

Вот пример использования applymap:

 df.applymap(lambda x: _bindKnownType(x))

Это все еще очень медленно, это занимает почти 4 минуты, чтобызапустить 100 раз на фрейме данных, который содержит 1000 строк и 90 столбцов.

Я рассмотрел использование df.astype(), но это не представляется возможным, так как он использует упакованные типы в df, а нефактические типы значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...