for循环遍历股票列表时如何为history变量加股票代码后缀生成独立变量
问题解答
一、原有代码问题修复
你的代码存在三个核心错误:
history被定义为元组(),元组是不可变数据结构,不支持键值对赋值操作- 函数参数
setTicker和循环变量重名,逻辑混乱 - 函数最终仅返回循环最后一个元素(MSFT)的结果,没有保存所有股票数据
优先推荐使用字典存储所有股票数据,无需动态生成独立变量,维护性更高,实现代码如下:
import pandas as pd import yfinance as yf tickerList = ("AAPL", "HOOD", "TSLA", "GOOG", "MSFT") # 用字典存储所有股票数据,键为股票代码,值为对应DataFrame history_dict = {} def moduleApi(ticker_list, setPeriod, setInterval): for ticker in ticker_list: stock = yf.Ticker(ticker) history_dict[ticker] = pd.DataFrame(stock.history( period=setPeriod, interval=setInterval, group_by='ticker', proxy=None)) return history_dict # 调用函数获取所有数据 history_dict = moduleApi(tickerList, 'max', '1d') # 调取单只股票数据的方式 print(history_dict['AAPL']) print(history_dict['HOOD'])
二、动态生成独立变量的实现(不推荐)
如果你确实需要生成historyAAPL这类带股票代码后缀的独立变量,可以通过globals()方法实现,但是该方案会污染全局命名空间,后续维护难度高,仅作为可选方案提供:
# 接上文代码,将字典内数据转换为独立变量 for ticker, df in history_dict.items(): globals()[f'history{ticker}'] = df # 现在可直接调用historyAAPL、historyTSLA等变量 print(historyAAPL)
三、MySQL存储方案建议
- 将数据保存为DataFrame格式再导入MySQL是非常合理且成熟的方案,pandas自带
to_sql方法可以一键完成导入,无需额外格式转换 - 字典存储方案确实不适合直接导入SQL,DataFrame的二维表结构和MySQL表结构天然对应,导入效率和代码简洁度都最优
导入MySQL示例代码如下:
# 先安装依赖:pip install sqlalchemy pymysql from sqlalchemy import create_engine # 替换为你自己的MySQL连接信息 engine = create_engine('mysql+pymysql://用户名:密码@数据库地址/数据库名?charset=utf8mb4') # 循环导入每只股票的数据到对应独立表 for ticker, df in history_dict.items(): table_name = f'history{ticker}' # if_exists参数说明:replace为覆盖原有表,append为追加数据,fail为表存在时报错 df.to_sql(name=table_name, con=engine, if_exists='replace', index=True)
上述代码会自动为每只股票创建对应名称的表,DataFrame默认的日期索引也会同步存入表中,可根据需求提前处理DataFrame调整字段内容。
内容的提问来源于stack exchange,提问作者user16845627
相关产品推荐
相关产品推荐

