如何高效获取同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
相关产品推荐
相关产品推荐

