У меня есть база данных PostgreSQL, с которой я взаимодействую, используя SQLAlchemy в Python.
База данных содержит ежедневные данные о ценах (включая нерабочие дни), начиная с января 2005 года; столбец даты является индексом для этой базы данных. Данные могут быть переизданы в течение 5 дней после объявления цены закрытия ценной бумаги, поэтому каждый день я фиксирую 5-дневное скользящее окно цен закрытия в фрейме данных для каждой ценной бумаги, которое я использую для перезаписи соответствующих данных. в БД.
Для этого я использую следующую функцию:
def update_from_df(self):
con = self._engine.connect()
self._df.to_sql(self._table_name,con,if_exists="replace")
con.close()
Вышеприведенная функция удаляет все данные, которые находились в базе данных (то есть данные, которые не имеют соответствующего индекса в качестве данных кадра данных), и заменяет их гораздо меньшим набором данных, который содержался в DF. Это нежелательно - я просто хочу перезаписать данные, которые имеют тот же тикер даты и цены, что и в DF.
В попытке исправить это, я написал код, который просматривает диапазон дат в кадре данных (который содержит обновленные данные), удаляя строки в базе данных, соответствующие диапазону данных, копируя порцию данных из кадра данных и, наконец, добавив эти данные в базу данных. Этот процесс немного неуклюжий, и я беспокоюсь, что при большем выборе данных производительность будет ограничена.
Вместо использования replace
в коде альтернативы insert
, append
не помогают с этой проблемой.
Существует ли функция, которая обновляет базу данных PostgreSQL, используя данные кадра данных, которые имеют только соответствующий индекс, не затрагивая все другие данные базы данных?