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

如何提升基于Symbol和Date查询Pandas DataFrame中close_adjusted值的效率?

优化方案:从小时级到秒级的查询提速

你的核心问题在于循环+逐次过滤的方式效率极低:每次调用price_diff都要对460万行的DataFrame做两次过滤操作,25000次循环就意味着50000次全表扫描,这必然导致严重的性能瓶颈。我们可以通过以下两步优化,把耗时压缩到秒级:

1. 给原始数据集设置复合索引

把symbol和date设为复合索引,Pandas会将这两个列转为哈希表结构,后续查询会从O(n)的全表扫描变成O(1)的直接定位,这是性能提升的核心基础。

# 给460万行的大数据集设置复合索引
df = df.set_index(['symbol', 'date'])
# 确保同一个symbol+date组合只有一行数据(避免重复匹配)
df = df[~df.index.duplicated(keep='first')]

2. 批量处理查询,彻底抛弃循环

不要逐行调用price_diff,把你的25000行查询数据整理成单独的DataFrame(比如叫query_df,包含symbol、date_one、date_two三列),通过索引匹配批量提取价格并计算差值。

示例代码:

# 假设你的查询表结构为:query_df = pd.DataFrame({'symbol': [...], 'date_one': [...], 'date_two': [...]})

# 批量提取date_one对应的close_adjusted
query_df['close_one'] = df.loc[
    list(zip(query_df['symbol'], query_df['date_one'])), 
    'close_adjusted'
].values

# 批量提取date_two对应的close_adjusted
query_df['close_two'] = df.loc[
    list(zip(query_df['symbol'], query_df['date_two'])), 
    'close_adjusted'
].values

# 计算差值,未匹配到的数据会显示NaN,可替换为你的dummy值
query_df['price_diff'] = query_df['close_one'] - query_df['close_two']
query_df['price_diff'] = query_df['price_diff'].fillna(dummy)

为什么这个方法效率高?

  • 复合索引让价格查询变成直接定位,无需扫描整个数据集;
  • 批量操作是Pandas的向量运算,内部用C实现,比Python循环快几个数量级;
  • 全程仅需两次批量查询,而非50000次逐行过滤。

如果查询数据里有大量重复的symbol或date,还可以用groupby做预聚合进一步优化,但上面的方案已经足够解决你的性能问题。

内容的提问来源于stack exchange,提问作者Ayam Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:09:06