问题描述
请参考下面的两行代码
# 同样的股票代码
security_list1=['600567.XSHG','600567.XSHG']
df1=get_price(security_list1, start_date='2022-04-11', end_date='2022-04-11',
frequency='daily', fields=['close'], skip_paused=False, fq='pre', panel=False)
print(df1)
# 不同的股票代码
security_list2=['600567.XSHG','600568.XSHG']
df2=get_price(security_list2, start_date='2022-04-11', end_date='2022-04-11',
frequency='daily', fields=['close'], skip_paused=False, fq='pre', panel=False)
print(df2)
输出结果是:
time code close
0 2022-04-11 600567.XSHG 3.02
time code close
0 2022-04-11 600567.XSHG 3.02
1 2022-04-11 600568.XSHG 1.76
也就意味着,当输入股票有重复的时候,系统自动给删掉了。
问如何保留?????
解决方案
是的,get_price 函数在底层处理时,为了优化数据库查询性能和减少冗余数据传输,会自动对传入的 security_list 进行去重(类似于转换成了 set 集合)。因此,无论你在列表中传入多少个相同的股票代码,API 接口只会返回该股票的一份数据。
如果你在业务逻辑中必须保留输入列表中的重复项(例如为了与某个包含重复股票代码的订单列表或权重列表对齐),你需要在获取到去重后的数据后,使用 pandas 库在本地进行数据合并(Merge)或映射(Map)来还原重复项。
解决方案:使用 Pandas 的 merge 方法还原重复项
你可以先将原始的带有重复项的 security_list 转换成一个 DataFrame,然后与 get_price 返回的结果进行左连接(Left Join)。
以下是具体的代码示例:
import pandas as pd
from jqdata import *
# 原始带有重复代码的股票列表
security_list1 = ['600567.XSHG', '600567.XSHG']
# 1. 调用 get_price 获取数据(此时系统会自动去重,只返回一条 600567.XSHG 的数据)
df1 = get_price(security_list1,
start_date='2022-04-11',
end_date='2022-04-11',
frequency='daily',
fields=['close'],
skip_paused=False,
fq='pre',
panel=False)
# 2. 将原始列表转换为 DataFrame
target_df = pd.DataFrame({'code': security_list1})
# 3. 使用 merge 将获取到的行情数据映射回原始列表
# how='left' 保证 target_df 中的每一行(包括重复行)都会被保留
result_df = pd.merge(target_df, df1, on='code', how='left')
print("保留重复项后的结果:")
print(result_df)
输出结果:
保留重复项后的结果:
code time close
0 600567.XSHG 2022-04-11 3.02
1 600567.XSHG 2022-04-11 3.02
总结
- API 行为:
get_price确实会自动去重,这是 API 设计的正常行为。 - 处理建议:不要试图让 API 直接返回重复数据,而是先获取唯一值数据,再通过 Pandas 在本地进行数据对齐和扩充。这种做法不仅能满足你的需求,还能最大限度地节省网络请求时间和内存消耗。