问题描述
finance.run_query(query(finance.FUND_MAIN_INFO).filter(finance.FUND_MAIN_INFO.main_code==main_code).limit(n))
filter(finance.FUND_MAIN_INFO.main_code==main_code):指定筛选条件,通过finance.FUND_MAIN_INFO.main_code==main_code可以指定你想要查询的基金主体代码;除此之外,还可以对表中其他字段指定筛选条件;多个筛选条件用英文逗号分隔。
问题描述:如何表述多字段多条件筛选,比如“基金运作方式”要同时选“ETF”和‘'LOF',“基金类别”同时选“股票型”,“混合型”,“基金型”,“贵金属”如何在一句语句中表述?
解决方案
在 JoinQuant 聚宽平台中,finance.run_query 底层使用的是 SQLAlchemy。当需要对同一个字段进行多个值的筛选(即 SQL 中的 IN 操作)时,可以使用 SQLAlchemy 提供的 .in_() 方法。
针对您的需求:
- “基金运作方式”同时选“ETF”和“LOF”
- “基金类别”同时选“股票型”、“混合型”、“基金型”、“贵金属”
假设对应的字段名为 operate_mode(运作方式)和 underlying_asset_type(基金类别),您可以在 filter() 中使用 .in_() 方法,并将多个字段的筛选条件用逗号分隔(逗号在 filter 中代表 AND 逻辑)。
具体代码示例:
from jqdata import *
# 构建查询语句
q = query(finance.FUND_MAIN_INFO).filter(
# 基金运作方式 包含 ETF 或 LOF
finance.FUND_MAIN_INFO.operate_mode.in_(['ETF', 'LOF']),
# 基金类别 包含 股票型、混合型、基金型、贵金属
finance.FUND_MAIN_INFO.underlying_asset_type.in_(['股票型', '混合型', '基金型', '贵金属'])
).limit(100)
# 执行查询
df = finance.run_query(q)
# 打印结果
print(df)
语法解析:
.in_([...]):这是 SQLAlchemy 的语法,等同于 SQL 语句中的IN ('A', 'B')。它允许您传入一个列表,只要字段的值在列表中,该条记录就会被筛选出来。filter(条件1, 条件2):在filter函数中,用逗号分隔的多个条件默认是 “且”(AND) 的关系。这意味着查询出的结果必须同时满足“运作方式在指定列表中”且“基金类别在指定列表中”。
注:具体的字段名称(如 operate_mode 和 underlying_asset_type)请参考聚宽最新的数据字典文档,以确保字段名完全匹配。