У меня есть собственное приложение на 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, а нефактические типы значений.