Необходимо отредактировать подмножество строк из таблицы MySQL с помощью Pandas Dataframe

Я пытаюсь изменить таблицу в своей базе данных. Однако мне трудно использовать метод to_sql, предоставленный Pandas. Мой price_data Dataframe выглядит примерно так:

Исходный кадр данных (как строки в базе данных):

введите здесь описание изображения

Код, используемый для изменения данных:

with con:
    price_data.to_sql(con=con, name='clean_prices2', if_exists='append', index=False, flavor='mysql')

Конечной целью здесь является изменение исходного фрейма данных (преобразование нулевых значений в значения Нана, а затем их интерполяция) и сохранение его обратно в базу данных. Результаты должны выглядеть так (кроме того же id):

Желаемый результат:

введите здесь описание изображения

Если вы посмотрите конкретно на столбец close_price, вы увидите, что значение 0 было присвоено 90,7350.

Мое текущее решение заключается в добавлении строк данных, что приводит к дублированию таких записей:

Фактический результат:

введите здесь описание изображения

Наконец, мне пришлось бы выполнить еще один запрос, чтобы удалить повторяющиеся строки (на основе price_date).

Я знаю, что могу изменить параметр if_exists на replace, но это удалит остальную часть моей таблицы базы данных. В основном я хочу выполнить этот запрос несколько раз на разных symbol_id

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


person Justin    schedule 17.09.2016    source источник
comment
Я бы посоветовал использовать временную промежуточную таблицу, а затем запустить запрос на обновление. Вам разрешено вносить изменения в БД?   -  person Parfait    schedule 17.09.2016
comment
Кроме того, подходят ли столбцы symbol_id и price_date для сопоставления временной таблицы с итоговой? И, наконец, вы всегда будете только обновлять или вставлять новые строки? Обратите внимание: MySQL имеет свои уникальные команды: UPSERT и INSERT REPLACE.   -  person Parfait    schedule 17.09.2016
comment
Эй, Парфе, да, изменения БД разрешены.   -  person Justin    schedule 17.09.2016
comment
Для вашего второго вопроса symbol_id и price_date должно быть достаточно для определения любого значения, поэтому я считаю, что да и для этого вопроса. И для этой конкретной функциональности он будет обновлять только новые строки. Заранее спасибо за помощь   -  person Justin    schedule 17.09.2016


Ответы (1)


Рассмотрим временную таблицу с точной структурой в качестве конечной таблицы, но регулярно заменяемую и затем используемую для обновления существующей итоговой таблицы. Попробуйте использовать движок sqlalchemy для обеих операций.

В частности, для последнего SQL вы должны использовать запрос UPDATE JOIN между временной и конечной таблицами. . Ниже предполагается, что вы используете модуль 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()
person Parfait    schedule 17.09.2016