如何将yfinance获取的DataFrame中股票代码替换为对应股票名称?
问题描述
我正在使用yfinance获取股票数据,该库采用股票代码(stock tickers)作为标识,但这些代码通常难以直接识别。因此在完成数据下载操作后,我希望通过查找本地列表,将DataFrame中的原始股票代码替换为对应的股票名称。我对字典以及索引/替换的概念较为陌生,能否请各位指点解决方向?
附上相关代码:
import yfinance as yf import pandas as pd import csv tickerCsv = open('Stocks.csv', 'r') reader = csv.reader(tickerCsv) next(reader, None) # skip the headers tickers = {rows[0] for rows in reader} data = yf.download(tickers, period='1mo', start="2009-01-01", end="2020-12-31", group_by='ticker') close_prices = pd.DataFrame() for ticker in tickers: close_prices[ticker] = data[ticker]['Adj Close'] close_prices[ticker].replace(dict(zip(reader['Symbol'], reader['Name'])))
Stocks.csv文件内容:左侧为股票代码,右侧为需要替换成的对应股票名称。
解决方案
核心思路是先构建股票代码-名称的映射字典,再用这个字典批量替换DataFrame的列名。你的代码存在几个逻辑问题,下面分步修正:
1. 正确读取CSV并构建映射字典
你用csv.reader读完一次后,文件游标会走到末尾,无法再次读取。直接用pandas读取CSV更高效,还能直接生成映射字典:
# 假设CSV有列名:Symbol(股票代码)、Name(股票名称) ticker_map = pd.read_csv('Stocks.csv', index_col='Symbol')['Name'].to_dict() # 若CSV无列名,替换成下面两行 # ticker_df = pd.read_csv('Stocks.csv', header=None) # ticker_map = dict(zip(ticker_df[0], ticker_df[1]))
这样ticker_map就是{股票代码: 股票名称}的字典,是后续替换的核心依据。
2. 修正数据下载逻辑
原代码中period='1mo'和start/end参数冲突,yfinance会优先使用period,导致时间范围不符合预期,需要删除period参数。同时构建收盘价DataFrame可以简化,无需循环:
# 从映射字典中提取股票代码列表 tickers = list(ticker_map.keys()) # 下载指定时间范围的股票数据 data = yf.download(tickers, start="2009-01-01", end="2020-12-31", group_by='ticker') # 直接提取所有股票的Adj Close列,重组为DataFrame close_prices = pd.DataFrame({ticker: data[ticker]['Adj Close'] for ticker in tickers})
3. 批量替换列名为股票名称
使用pandas的rename方法,结合映射字典就能一次性替换所有列名:
close_prices = close_prices.rename(columns=ticker_map)
完整修正代码
import yfinance as yf import pandas as pd # 读取CSV构建股票代码-名称映射字典 ticker_map = pd.read_csv('Stocks.csv', index_col='Symbol')['Name'].to_dict() # 若CSV无列名,启用下面两行 # ticker_df = pd.read_csv('Stocks.csv', header=None) # ticker_map = dict(zip(ticker_df[0], ticker_df[1])) # 获取股票代码列表 tickers = list(ticker_map.keys()) # 下载指定时间范围的股票数据 data = yf.download(tickers, start="2009-01-01", end="2020-12-31", group_by='ticker') # 构建收盘价DataFrame close_prices = pd.DataFrame({ticker: data[ticker]['Adj Close'] for ticker in tickers}) # 替换列名为股票名称 close_prices = close_prices.rename(columns=ticker_map) # 查看结果 print(close_prices.head())
关键概念说明
- 映射字典:
{key: value}的键值对结构,这里用股票代码做key、名称做value,是快速查找和批量替换的核心工具。 - DataFrame.rename():pandas专门用于修改列名或行索引的方法,传入字典即可完成批量替换,比循环操作高效得多。
- 文件读取注意:
csv.reader是流式读取,读完一次后游标会停在文件末尾,无法重复读取,用pandas读取CSV能避免这类问题。
内容的提问来源于stack exchange,提问作者Terence Lee
相关产品推荐
相关产品推荐

