如何高效将含不同键的嵌套字典转换为指定格式DataFrame
快速将YahooFinancials嵌套字典转换为指定格式DataFrame
问题背景
我需要把通过YahooFinancials获取的嵌套字典转换成目标格式的DataFrame。字典的键是股票代码(比如SMT.L、MSFT、NIO),每个键对应该股票的历史价格等数据。用普通循环处理速度很慢,尤其是股票数量多的时候,想找个高效的转换方法。
获取数据的代码如下:
from yahoofinancials import YahooFinancials yahoo_tickers = ['SMT.L', 'MSFT', 'NIO'] yahoo_financials = YahooFinancials(yahoo_tickers) data = yahoo_financials.get_historical_price_data( start_date='1970-01-30', end_date='2022-12-30', time_interval='daily' )
期望输出的DataFrame格式如下(Date为索引,包含价格字段、股票代码和工具类型列):
high low open ... adjclose yahoo_ticker instrumentType Date ... 1968-12-31 4.852 4.852 4.852 ... 1.762543 SMT.L EQUITY 1969-01-01 4.852 4.852 4.852 ... 1.762543 SMT.L EQUITY ... 2022-12-30 9.980 9.520 9.830 ... 9.750000 NIO EQUITY
高效转换方案
方案1:列表推导+批量合并
用pandas的pd.concat结合列表推导式,避免逐行循环的低效操作,大幅提升处理速度。核心是先把每个股票的数据转成小DataFrame,再一次性合并所有结果。
import pandas as pd # 批量处理每个股票的数据 final_df = pd.concat([ # 提取当前股票的价格数据转为DataFrame pd.DataFrame(data[ticker]['prices']) # 添加股票代码和工具类型列 .assign(yahoo_ticker=ticker, instrumentType=data[ticker]['instrumentType']) # 把时间戳转为datetime并设为索引 .pipe(lambda df: df.set_index(pd.to_datetime(df['date'], unit='s'))) # 删除原始时间戳列 .drop('date', axis=1) for ticker in yahoo_tickers ]) # 调整列顺序以匹配期望格式 desired_cols = ['high', 'low', 'open', 'close', 'volume', 'adjclose', 'yahoo_ticker', 'instrumentType'] final_df = final_df[desired_cols]
方案2:分步循环(适合中间调试)
如果需要分步查看每个股票的处理结果,可以用普通循环,但依然用列表存储小DataFrame最后合并,比循环内append高效:
import pandas as pd df_list = [] for ticker in yahoo_tickers: # 提取当前股票的所有数据 ticker_info = data[ticker] # 价格数据转DataFrame price_df = pd.DataFrame(ticker_info['prices']) # 添加股票标识列 price_df['yahoo_ticker'] = ticker price_df['instrumentType'] = ticker_info['instrumentType'] # 处理时间列并设为索引 price_df['Date'] = pd.to_datetime(price_df['date'], unit='s') price_df.set_index('Date', inplace=True) price_df.drop('date', axis=1, inplace=True) # 加入列表 df_list.append(price_df) # 合并所有DataFrame final_df = pd.concat(df_list) # 调整列顺序 final_df = final_df[['high', 'low', 'open', 'close', 'volume', 'adjclose', 'yahoo_ticker', 'instrumentType']]
效率提升原因
pd.concat是批量合并操作,比循环里逐个append(每次创建新DataFrame)效率高很多- 列表推导式的执行速度比普通for循环更快
- 所有操作基于pandas的向量化运算,避免了逐行处理的开销
内容的提问来源于stack exchange,提问作者msh855
相关产品推荐
相关产品推荐

