运行后无股票名称,如何在code后增加股票名称一列?
行后无股票名称,如何在code后增加股票名称一列?
from jqdata import *
import numpy as np
import pandas as pd
df = get_fundamentals(query(
valuation.code, valuation.market_cap, valuation.pe_ratio, income.total_operating_revenue
).filter(
valuation.market_cap > 1000,
valuation.pe_ratio < 10,
income.total_operating_revenue > 2e10
), date='2015-10-15')
df
问题描述
解决方案
在 JoinQuant 聚宽平台中,get_fundamentals 查询财务数据返回的 DataFrame 默认只包含股票代码(code)。要增加股票名称列,最有效的方法是使用 get_all_securities() 获取全市场股票的基本信息,然后利用 Pandas 的 map 函数将股票代码映射为股票名称。
以下是修改后的完整代码,它会在 code 列之后插入一列 name(股票名称):
from jqdata import *
import numpy as np
import pandas as pd
# 1. 查询财务数据
df = get_fundamentals(query(
valuation.code,
valuation.market_cap,
valuation.pe_ratio,
income.total_operating_revenue
).filter(
valuation.market_cap > 1000,
valuation.pe_ratio < 10,
income.total_operating_revenue > 2e10
), date='2015-10-15')
# 2. 获取所有股票的基本信息
# get_all_securities() 返回的 DataFrame 的 index 是股票代码,包含 'display_name' 列
all_securities = get_all_securities()
# 3. 使用 map 函数根据 code 映射出股票名称,并新增一列 'name'
df['name'] = df['code'].map(all_securities['display_name'])
# 4. 调整列的顺序,将 'name' 列移动到 'code' 列之后
cols = df.columns.tolist()
# 找到 name 列并将其弹出,然后插入到索引为 1 的位置(即 code 之后)
cols.insert(1, cols.pop(cols.index('name')))
df = df[cols]
# 打印结果
print(df)
代码原理解析:
get_all_securities():这个 API 会返回一个包含所有标的信息的 DataFrame,其行索引(index)就是股票代码(如000001.XSHE),其中有一列名为display_name,存储了股票的中文简称。df['code'].map(...):这是 Pandas 中非常高效的数据映射方法。它会遍历df['code']中的每一个代码,去all_securities['display_name']中查找对应的名称并返回。- 调整列顺序:默认情况下,新增加的
name列会被放在 DataFrame 的最后一列。通过获取列名列表cols,使用pop移除name,再用insert(1, ...)将其插入到第二列(索引为1,紧跟在索引为0的code后面),最后重新赋值给df即可实现列的重排。