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

如何高效获取同Ticker对应上一日期的价格?优化千万级数据集处理

更高效的股票上一日期价格获取方案

我有一个仅4行的可复现示例,但实际要处理的是包含1200万行的数据集。当前我通过多步骤代码实现了获取同一只股票代码(Ticker)对应上一日期的价格,是否有更简便的实现方式?以下是我当前的代码:

import pandas as pd

df = pd.DataFrame([['1/1/2023','ABC',0.01],['1/1/2023','XYZ',0.09],['1/7/2023','ABC',0.0],['1/7/2023','XYZ',0.03]],columns=['date','ticker','price'])
df['date'] = pd.to_datetime(df['date'])
dates = pd.DataFrame(df['date'].unique(),columns=['date'])
dates['lastweek'] = dates['date'].shift(1)
tmp = df[['date','ticker']]
tmp = tmp.merge(dates,on='date',how='left')
tmp = tmp.merge(df[['date','ticker','price']],left_on=['lastweek','ticker'],right_on=['date','ticker'])
tmp['price'] = tmp['price'].fillna(0)
tmp = tmp.drop(columns=['date_y'])
tmp = tmp.rename(columns={'date_x':'date','price':'lastweekprice'})
df = df.merge(tmp[['date','ticker','lastweekprice']],on=['date','ticker'],how='left')

你当前的代码用了多次merge操作,对于1200万行的大数据集来说效率会很低,因为merge是相对耗时的内存密集型操作。其实用pandas的groupby+shift就能一步搞定,代码更简洁,性能也更优:

import pandas as pd

df = pd.DataFrame([['1/1/2023','ABC',0.01],['1/1/2023','XYZ',0.09],['1/7/2023','ABC',0.0],['1/7/2023','XYZ',0.03]],columns=['date','ticker','price'])
df['date'] = pd.to_datetime(df['date'])

# 先按股票代码和日期排序,确保每组内日期顺序正确
df = df.sort_values(['ticker', 'date'])
# 按股票分组后,对价格列做偏移,获取上一日期的价格,空值填充为0
df['lastweekprice'] = df.groupby('ticker')['price'].shift(1).fillna(0)

关键逻辑说明:

  • 排序:必须先按ticker和date排序,保证每个股票的记录是按日期先后排列的,这样shift(1)才能准确取到上一个日期的价格
  • 分组偏移:groupby('ticker')['price'].shift(1)会对每个股票组内的价格列向上偏移一行,正好对应该股票上一日期的价格
  • 空值处理:每个股票的第一条记录没有上一日期,所以用fillna(0)把空值填充为0,和你原代码的逻辑完全一致

这种方法避免了多次数据合并,内存占用更低,处理1200万行数据的速度会比原代码快很多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:28:22