如何根据可选函数参数对Polars DataFrame实现可选过滤?
如何根据可选函数参数对Polars DataFrame实现可选过滤?
我懂你现在的需求啦——想给Polars DataFrame做可选过滤,只有当传入的函数参数不是默认值时,才启用对应的过滤条件对吧?这种场景在实际业务里特别常见,咱们可以用很灵活的方式来实现,我给你一步步拆解。
首先看你的函数参数:ticker: str = '', strategy: str = '', iteration: int = -1,核心思路就是先收集需要生效的过滤条件,再把它们组合起来应用到DataFrame上。
实现步骤
- 初始化一个空列表来存放要生效的过滤条件
- 逐个检查参数,若参数不是默认值,就添加对应的Polars过滤表达式到列表中
- 如果列表不为空,就把所有条件用**逻辑与(&)**组合起来(如果需要逻辑或就换成
|),然后应用到DataFrame的filter方法里;如果列表为空,就返回原DataFrame
具体代码实现
基础版写法
import polars as pl def filter_configs(self, ticker: str = '', strategy: str = '', iteration: int = -1): # 初始化过滤条件列表 filters = [] # 检查ticker参数,非默认值则添加过滤条件 if ticker != '': filters.append(pl.col("ticker") == ticker) # 检查strategy参数 if strategy != '': filters.append(pl.col("strategy") == strategy) # 检查iteration参数 if iteration != -1: filters.append(pl.col("iteration") == iteration) # 应用过滤条件 if filters: # 逐个组合所有条件(逻辑与) combined_condition = filters[0] for cond in filters[1:]: combined_condition = combined_condition & cond self.configs_df = self.configs_df.filter(combined_condition) return self.configs_df
简洁版(用functools.reduce简化条件组合)
如果觉得循环组合条件有点啰嗦,可以用functools.reduce来简化代码,逻辑和上面完全一致:
from functools import reduce import polars as pl def filter_configs(self, ticker: str = '', strategy: str = '', iteration: int = -1): filters = [] if ticker != '': filters.append(pl.col("ticker") == ticker) if strategy != '': filters.append(pl.col("strategy") == strategy) if iteration != -1: filters.append(pl.col("iteration") == iteration) if filters: # 用reduce一次性组合所有条件 self.configs_df = self.configs_df.filter(reduce(lambda a, b: a & b, filters)) return self.configs_df
补充说明
- 这种方式扩展性极强,后续如果新增可选过滤参数,只需要加对应的
if判断和条件表达式就行 - Polars的表达式是延迟计算的,这样组合条件不会带来额外性能损耗,效率很高
- 如果你的业务需要多个条件满足其一(逻辑或),只需要把代码中的
&换成|即可
备注:内容来源于stack exchange,提问作者StuartM
相关产品推荐
相关产品推荐

