在basic数据库中读取stock_basic表格的ts_code列的数据作为表名,给表名加反引号才可以查找 在daily数据库遍历所有表格,对于每个表格 查询net_mf_amount列的数据,按照trade_date降序排列 对查询结果进行pandas计算,a和b列均已存在,不需要判断,对net_mf_amount列的前一天的数据减去今天的数据放在a列, 将a列的值前一天的数据减去今天的数据放在b列,如果a和b之前计算过,则跳过计算下一个值 保存a和b列的值 继续处理下一个表格,直到处理完所有表格,,代码报错ProgrammingError: Duplicate column name 'a'
时间: 2024-02-09 20:12:11 浏览: 85
backup_sqlServer.rar_sql database back_数据库备份_数据库备份 Visual Basic_
好的,我理解了你的问题。根据你所提供的问题,我可以为你提供以下代码作为参考:
```python
import pandas as pd
import pymysql
# 建立连接
basic_conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='basic')
daily_conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', db='daily')
# 获取basic数据库中的表名
cursor = basic_conn.cursor()
cursor.execute("SELECT ts_code FROM stock_basic")
tables = cursor.fetchall()
# 遍历所有表格
for table in tables:
table_name = table[0]
sql = f"SELECT net_mf_amount, trade_date FROM `{table_name}` ORDER BY trade_date DESC"
cursor = daily_conn.cursor()
cursor.execute(sql)
data = cursor.fetchall()
df = pd.DataFrame(list(data), columns=['net_mf_amount', 'trade_date'])
# 对查询结果进行pandas计算
if 'a' not in df.columns and 'b' not in df.columns:
df['a'] = df['net_mf_amount'].shift(1) - df['net_mf_amount']
df['b'] = df['a'].shift(1) - df['a']
else:
continue
# 保存a和b列的值
cursor = daily_conn.cursor()
try:
cursor.execute(f"ALTER TABLE `{table_name}` ADD COLUMN a FLOAT")
cursor.execute(f"ALTER TABLE `{table_name}` ADD COLUMN b FLOAT")
except:
pass
for index, row in df.iterrows():
a_value = row['a']
b_value = row['b']
trade_date = row['trade_date']
cursor.execute(f"UPDATE `{table_name}` SET a = {a_value}, b = {b_value} WHERE trade_date = '{trade_date}'")
daily_conn.commit()
# 关闭连接
cursor.close()
basic_conn.close()
daily_conn.close()
```
这段代码会首先连接basic数据库,获取stock_basic表格中的ts_code列的数据作为表名。然后,它会连接daily数据库,并遍历所有表格,对于每个表格查询net_mf_amount列的数据,按照trade_date降序排列。接着,它会对查询结果进行pandas计算,将a和b列的值保存到数据库中,并继续处理下一个表格,直到处理完所有表格。最后,关闭连接。
需要注意的是,如果在计算过程中出现了“Duplicate column name 'a'”这个错误,可能是因为之前已经执行过保存a和b列的操作,可以在保存之前,先判断一下df中是否已经存在a和b列,如果已经存在,则跳过计算下一个值。
阅读全文