You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效将含不同键的嵌套字典转换为指定格式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 07:05:26