需要使用 Pandas Dataframe 编辑来自 MySQL table 的行子集
Need to edit subset of rows from MySQL table using Pandas Dataframe
我正在尝试更改数据库中的 table。但是我发现很难使用 Pandas 提供的 to_sql 方法。我的 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
我目前的解决方案是追加数据行,这会导致重复输入,如下所示:
实际输出:
最后,我将不得不执行另一个查询来删除重复的行(基于 price_date)
我知道我可以将 if_exists
参数更改为 replace,但这会删除我数据库的其余部分 table。基本上我想在不同的 symbol_id
的
上多次执行此查询
是否可以在不删除 table 中的其余数据的情况下修改一个子集(在这种情况下,只有 3 行)?该解决方案可以修改现有行(保持相同 id
)或删除旧行,并创建不带零的新行。我只是想在没有额外删除重复查询的情况下完成此操作。
考虑一个 temp table,其结构与 final table 完全相同,但会定期更换,然后将用于更新现有的 final table。尝试对这两个操作使用 sqlalchemy engine。
具体来说,对于后者 SQL,您将在临时和最终 table 之间使用 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()
我正在尝试更改数据库中的 table。但是我发现很难使用 Pandas 提供的 to_sql 方法。我的 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
我目前的解决方案是追加数据行,这会导致重复输入,如下所示:
实际输出:
最后,我将不得不执行另一个查询来删除重复的行(基于 price_date)
我知道我可以将 if_exists
参数更改为 replace,但这会删除我数据库的其余部分 table。基本上我想在不同的 symbol_id
的
是否可以在不删除 table 中的其余数据的情况下修改一个子集(在这种情况下,只有 3 行)?该解决方案可以修改现有行(保持相同 id
)或删除旧行,并创建不带零的新行。我只是想在没有额外删除重复查询的情况下完成此操作。
考虑一个 temp table,其结构与 final table 完全相同,但会定期更换,然后将用于更新现有的 final table。尝试对这两个操作使用 sqlalchemy engine。
具体来说,对于后者 SQL,您将在临时和最终 table 之间使用 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()