Необходимо редактировать подмножество строк из таблицы MySQL, используя Pandas Dataframe
Я пытаюсь изменить таблицу в моей базе данных. Однако мне трудно использовать метод to_sql, предоставленный Pandas. мой price_data
Датафрейм выглядит примерно так:
Начальный кадр данных (как строки в базе данных):
Код, используемый для изменения данных:
with con:
price_data.to_sql(con=con, name='clean_prices2', if_exists='append', index=False, flavor='mysql')
Конечной целью здесь является изменение исходного кадра данных (преобразование нулевых значений в значения Nan, затем их интерполяция) и сохранение его обратно в базу данных. Результаты должны выглядеть следующим образом (за исключением того же id
):
Желаемый результат:
Если вы посмотрите конкретно на close_price
столбец вы можете увидеть, что значение 0 было присвоено 90,7350
Мое текущее решение заключается в добавлении datarows, что приводит к дублированию записей вроде этого:
Фактический выход:
Наконец, мне нужно будет выполнить еще один запрос, чтобы удалить дублирующиеся строки (на основе price_date)
Я знаю, что могу изменить if_exists
параметр для замены, но это удалит остальную часть моей таблицы базы данных. В основном я хочу выполнить этот запрос несколько раз на разных symbol_id
"s
Есть ли способ изменить подмножество (в данном случае только 3 строки), не удаляя оставшиеся данные в моей таблице? Решение может либо изменить существующие строки (сохраняя id
) или удалите старые строки и создайте новые без нулей. Я просто пытаюсь сделать это без дополнительного удаления дубликата запроса.
1 ответ
Рассмотрим временную таблицу с точной структурой в качестве финальной таблицы, но регулярно заменяемую и затем используемую для обновления существующей финальной таблицы. Попробуйте использовать движок sqlalchemy для обеих операций.
В частности, для последнего SQL вы бы использовали запрос UPDATE JOIN между temp и final таблицей. Ниже предполагается, что вы используете pymysql
модуль (отрегулируйте по необходимости):
import pymysql
from sqlalchemy import create_engine
...
engine = create_engine("mysql+pymysql://user:password@hostname:port/database")
# PANDAS UPLOAD
price_data.to_sql(name='clean_prices_temp', con=engine, if_exists='replace', index=False)
# SQL UPDATE (USING TRANSACTION)
with engine.begin() as conn:
conn.execute("UPDATE clean_prices_final f" +
" INNER JOIN clean_prices_temp t" +
" ON f.symbol_id = t.symbol_id" +
" AND f.price_date = t.price_date" +
" SET f.open_price = t.open_price," +
" f.high_price = t.high_price," +
" f.low_price = t.low_price," +
" f.close_price = t.close_price," +
" f.adj_close_price = t.adj_close_price;")
engine.dispose()