如何用Polars筛选符合门店营业时间规则的交易记录?
高效实现交易记录筛选方案
核心思路
先关联门店营业时间与交易数据,标记每笔交易是否处于营业时段内;再通过分组判断每个供应商的每个产品是否存在至少一笔有效交易;最后保留这些符合条件的产品的所有交易记录。
具体实现步骤(以Pandas为例)
假设门店营业时间数据集为store_hours,交易数据集为transactions:
关联两个数据集
通过供应商ID将交易数据与营业时间数据关联,只保留有营业时间记录的供应商交易:merged_df = transactions.merge(store_hours, left_on='vendor', right_on='vendorId', how='inner')标记有效交易
新增字段标记每笔交易是否在对应门店的营业区间内:merged_df['is_valid'] = (merged_df['saletime'] >= merged_df['opening time']) & (merged_df['saletime'] <= merged_df['closing time'])筛选符合条件的供应商-产品组合
按供应商+产品分组,判断每组是否存在至少一笔有效交易,得到需要保留的产品组合:valid_prod_pairs = merged_df.groupby(['vendor', 'prod'])['is_valid'].any().reset_index(name='keep')这里
any()只要组内存在有效交易就返回True,代表该产品符合保留要求。提取最终结果
将原始交易数据与筛选后的产品组合关联,保留所有符合条件的交易:final_result = transactions.merge(valid_prod_pairs[valid_prod_pairs['keep']], on=['vendor', 'prod'], how='inner') final_result = final_result.drop(columns=['keep']) # 移除多余标记列
效率优化说明
- 全程采用Pandas向量化操作,避免逐行循环,大数据量下性能远高于循环逻辑;
merge与groupby均为Pandas底层优化的C实现操作,处理速度快;- 若数据量超大,可直接将逻辑迁移至Dask或PySpark实现分布式处理,核心逻辑保持一致。
样本数据验证结果
- 供应商7744:产品11无有效交易,被剔除;产品12、13保留所有交易;
- 供应商2378:产品20存在有效交易,保留该产品的所有交易(包括闭店后的那笔);
- 供应商115:产品3无有效交易,被剔除。
内容的提问来源于stack exchange,提问作者user99463
相关产品推荐
相关产品推荐

