Необходимо редактировать подмножество строк из таблицы 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()
Другие вопросы по тегам