问题描述
balance.total_owner_equities/valuation.market_cap/100000000.0).label("BTM")
balance.total_assets.label("Inv")
求指点,代码中的 label() 是什么意思呢?在对象下没有看到这个属性。百度也没有找到python中有这个函数方法,请指点下应该去看哪些资料学习这块知识。多谢
解决方案
什么是 label() 方法?
在 JoinQuant(聚宽)平台中,当你使用 query() 函数来获取财务数据(get_fundamentals)时,代码中的 label() 方法的作用是给查询的字段起一个别名(Alias)。
这个方法并不是 Python 语言自带的内置函数,也不是 Pandas 的方法,而是来自于一个非常著名的 Python 数据库工具库——SQLAlchemy。
为什么需要使用 label()?
在你的代码示例中:
(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"。
学习资料推荐
既然知道了它的出处,你可以通过以下途径深入学习:
- SQLAlchemy 官方文档:JoinQuant 的
query()对象实际上就是一个sqlalchemy.orm.query.Query对象。你可以搜索SQLAlchemy label alias来了解更多关于列重命名的知识。 - SQL 基础知识:
label()的作用等同于 SQL 语句中的AS关键字(例如SELECT total_assets AS Inv FROM balance)。了解基础的 SQL 查询语法有助于你更好地理解 JoinQuant 的query()逻辑。 - JoinQuant 官方 API 文档:在聚宽 API 文档的
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'] 即可
希望这个解答能帮你理清思路,祝量化学习顺利!