3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 JoinQuant(聚宽)平台中,当你使用 query() 函数来获取财务数据(get_fundamentals)时,代码中的 label() 方法的作用是给查询的字段起一个别名(Alias)。
这个方法并不是 Python 语言自带的内置函数,也不是 Pandas 的方法,而是来自于一个非常著名的 Python 数据库工具库——SQLAlchemy。
在你的代码示例中:
(balance.total_owner_equities / valuation.market_cap / 100000000.0).label("BTM")
你进行了一个数学运算(计算账面市值比 BTM)。如果不使用 label(),当你把这个查询结果转换成 Pandas DataFrame 时,这一列的列名将会是一长串非常难看的字符串,类似于 "balance.total_owner_equities / valuation.market_cap / 100000000.0"。
加上 .label("BTM") 后,返回的 DataFrame 中,这一列的列名就会干净利落地变成 "BTM"。这极大地方便了后续的数据处理和调用(例如你可以直接用 df['BTM'] 来获取这一列的数据)。
同理,balance.total_assets.label("Inv") 就是把总资产这一列在返回的结果中重命名为 "Inv"。
既然知道了它的出处,你可以通过以下途径深入学习:
query() 对象实际上就是一个 sqlalchemy.orm.query.Query 对象。你可以搜索 SQLAlchemy label alias 来了解更多关于列重命名的知识。label() 的作用等同于 SQL 语句中的 AS 关键字(例如 SELECT total_assets AS Inv FROM balance)。了解基础的 SQL 查询语法有助于你更好地理解 JoinQuant 的 query() 逻辑。get_fundamentals 章节,虽然没有详细展开 SQLAlchemy 的所有方法,但提到了 query_object 是一个 SQLAlchemy 对象,支持 filter(), order_by(), limit() 等链式调用。不使用 label():
q = query(balance.total_assets / 10000)
df = get_fundamentals(q, date='2023-01-01')
# df 的列名可能是 'balance.total_assets / 10000'
使用 label():
q = query((balance.total_assets / 10000).label('assets_in_wan'))
df = get_fundamentals(q, date='2023-01-01')
# df 的列名变成了 'assets_in_wan',调用时直接 df['assets_in_wan'] 即可
希望这个解答能帮你理清思路,祝量化学习顺利!