上面的代码报错 OperationalError: (1054, "Unknown column 'nan' in 'field list'")
时间: 2023-08-09 21:05:04 浏览: 162
好的,根据你提供的错误信息,这个错误是由于从数据库中查询出来的数据中包含了NaN值,而在执行SQL语句时,MySQL不支持将NaN值插入到数据库中。为了解决这个问题,我们可以在读取数据之后,先把其中的NaN值替换成0,再进行计算和保存操作。下面是修改后的代码:
```python
import pandas as pd
import numpy as np
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 = df.replace(np.nan, 0)
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()
```
这段代码和之前的代码几乎相同,只是在对查询结果进行pandas计算之前,加入了一行代码 `df = df.replace(np.nan, 0)`,用于将其中的NaN值替换成0。这样,在计算和保存的过程中,就不会出现类似“Unknown column 'nan' in 'field list'”这样的错误了。
阅读全文