大样本DataFrame中基因组区域重叠识别及并行优化问询
基因组区域重叠检测优化方案
问题背景
有300万行的Pandas DataFrame,包含chromosome(染色体)、start(起始位置)、stop(终止位置)、main_category(分类标签)等字段,需要:
- 识别同一染色体上的重叠区域
- 关联对应的
main_category标签 - 现有双重循环实现效率极低(O(n²)复杂度),且需验证逻辑正确性,同时利用8核CPU并行提速
现有代码问题分析
- 逻辑与输出不符:样本输出中出现
chr1:10-20与chr1:35-55的重叠记录,但这两个区间实际无重叠(20 < 35),属于错误记录;不过原代码的重叠判断逻辑本身是正确的:# 正确重叠判断:区间A与B重叠当且仅当A的终止 >= B的起始,且A的起始 <= B的终止 full_df['stop'][i] >= full_df['start'][j] and full_df['start'][i] <= full_df['stop'][j] - 效率瓶颈:双重循环时间复杂度为O(n²),300万行数据会产生约4.5e12次计算,完全无法在合理时间内完成。
高效优化方案
核心思路
- 按染色体分组:不同染色体的区域无重叠可能,分组后独立处理,避免无效计算
- 用区间树快速查询:区间树是专门针对区间重叠查询的数据结构,单区间查询复杂度为O(log n + k)(k为重叠项数量),远优于双重循环
- 并行处理分组:利用多CPU核心同时处理不同染色体的分组,最大化硬件资源利用率
完整实现代码
依赖安装
先安装区间树库:
pip install intervaltree
并行化代码实现
import pandas as pd from intervaltree import IntervalTree from joblib import Parallel, delayed import multiprocessing def process_chromosome_group(group_df): """处理单个染色体的区域重叠检测""" # 构建区间树:键为(start, stop),值为(hg_38_locs, main_category) tree = IntervalTree() for _, row in group_df.iterrows(): tree.addi(row['start'], row['stop'], (row['hg_38_locs'], row['main_category'])) overlapping_pairs = [] # 遍历每个区间,查找所有重叠区间(排除自身并避免重复记录) for _, row in group_df.iterrows(): current_loc = row['hg_38_locs'] current_label = row['main_category'] # 查询当前区间的所有重叠项 overlaps = tree.search(row['start'], row['stop']) for interval in overlaps: overlap_loc, overlap_label = interval.data # 仅保留i<j的配对,避免重复记录 if current_loc < overlap_loc: overlapping_pairs.append({ 'overlapping_regions': (current_loc, overlap_loc), 'overlapping_labels': (current_label, overlap_label) }) return pd.DataFrame(overlapping_pairs) if __name__ == '__main__': # 示例数据 data = { 'chromosome': ['chr1', 'chr1', 'chr1', 'chr1', 'chr1'], 'start': [10, 15, 35, 45, 55], 'stop': [20, 25, 55, 56, 60], 'hg_38_locs': ['chr1:10-20', 'chr1:15-25', 'chr1:35-55', 'chr1:45-56', 'chr1:55-60'], 'main_category': ['label1', 'label2', 'label2', 'label3', 'label1'] } full_df = pd.DataFrame(data) # 按染色体分组 chromosome_groups = [group for _, group in full_df.groupby('chromosome')] # 并行处理:最多使用8核CPU num_cores = min(multiprocessing.cpu_count(), 8) results = Parallel(n_jobs=num_cores)( delayed(process_chromosome_group)(group) for group in chromosome_groups ) # 合并所有结果 compiled_df = pd.concat(results, ignore_index=True) print(compiled_df)
正确输出结果
overlapping_regions overlapping_labels 0 (chr1:10-20, chr1:15-25) (label1, label2) 1 (chr1:35-55, chr1:45-56) (label2, label3) 2 (chr1:45-56, chr1:55-60) (label3, label1)
优化效果说明
- 时间复杂度大幅降低:整体复杂度降至O(n log n),300万行数据可在数分钟内处理完成
- 并行化提速:不同染色体分组独立处理,充分利用8核CPU的计算能力,进一步缩短处理时间
- 结果准确性保障:通过区间树查询和重复过滤逻辑,确保重叠配对无遗漏、无重复
内容的提问来源于stack exchange,提问作者youtube
相关产品推荐
相关产品推荐

