如何基于major_check值在minor_check中匹配特定序列并验证金融数据规则
基于Pandas的模式匹配与价格验证实现方案
核心方案思路
用Pandas的移位(shift)和布尔索引实现全向量化操作,彻底替代循环遍历;先统一处理minor_check中的NaN值,解决空值干扰问题。
步骤1:数据预处理
先把minor_check里的NaN替换为0,统一数值类型:
df['minor_check'] = df['minor_check'].fillna(0).astype(int)
步骤2:匹配目标模式
针对major_check的两种触发场景,分别生成模式匹配的布尔掩码:
场景1:major_check == 2,匹配21[2]12模式
模式对应位置:中心行(触发major_check=2的行)前2行依次为2、1,后2行依次为1、2
mask_2 = ( (df['major_check'] == 2) & (df['minor_check'].shift(2) == 2) & (df['minor_check'].shift(1) == 1) & (df['minor_check'] == 2) & (df['minor_check'].shift(-1) == 1) & (df['minor_check'].shift(-2) == 2) )
场景2:major_check == 1,匹配12[1]21模式
模式对应位置:中心行(触发major_check=1的行)前2行依次为1、2,后2行依次为2、1
mask_1 = ( (df['major_check'] == 1) & (df['minor_check'].shift(2) == 1) & (df['minor_check'].shift(1) == 2) & (df['minor_check'] == 1) & (df['minor_check'].shift(-1) == 2) & (df['minor_check'].shift(-2) == 1) )
步骤3:提取匹配的中心行
合并两种场景的掩码,得到所有符合模式的中心行索引:
matched_centers = df[mask_2 | mask_1].index
步骤4:验证价格数据规则
批量提取所有匹配模式对应的5行数据,用向量化方式验证价格规则:
import numpy as np # 收集所有需要验证的行索引(每个中心行对应前2、自身、后2行) valid_row_indices = [] for center in matched_centers: valid_row_indices.extend([center-2, center-1, center, center+1, center+2]) # 去重并排序,避免重复索引 valid_row_indices = sorted(list(set(valid_row_indices))) price_subset = df.loc[valid_row_indices, ['open', 'high', 'low', 'close']] # 按5行一组拆分,替换为你的具体价格规则验证逻辑 # 示例:验证每组5行的low值是否连续递增 price_groups = price_subset.groupby(np.arange(len(price_subset)) // 5) passed_groups = price_groups.apply(lambda x: (x['low'].diff().dropna() > 0).all()) # 最终得到符合模式且通过价格验证的中心行 final_valid_centers = matched_centers[passed_groups.values]
关键优势说明
- 全程采用Pandas向量化操作,执行效率远高于循环遍历DataFrame
- 提前统一处理NaN为0,消除空值对模式匹配的干扰
shift()操作精准定位模式的前后行位置,完全匹配需求中的模式结构
内容的提问来源于stack exchange,提问作者Annathema
相关产品推荐
相关产品推荐

