问题描述
get_mtss()第一个参数,传入一个list,和分别传入一个股票代码,得出来的结果不一样的?顺序都乱套了。如果这个list再长一点更加乱
解决方案
您好!这并不是 get_mtss() 函数出错了,而是由于底层数据返回格式和 Pandas DataFrame 的特性导致的正常现象。
为什么会出现顺序“乱套”?
当您给 get_mtss() 传入单个股票代码时,返回的 DataFrame 自然只包含该股票的数据,通常是按日期顺序排列的。
但是,当您传入一个包含多个股票代码的 list 时,API 会一次性从数据库中拉取所有这些股票在指定时间段内的融资融券数据。返回的 pandas.DataFrame 是将所有数据合并在一起的二维表。数据库在返回这些批量数据时,默认的排序方式通常是优先按照日期 (date) 排序,或者按照数据库内部的索引顺序返回,而不是严格按照您传入的 list 的顺序。
因此,当 list 变长时,不同股票同一天的数据会交织在一起,看起来就像是“乱套”了。
解决方法
既然返回的是标准的 pandas.DataFrame,您完全可以使用 Pandas 强大的数据处理功能,对结果进行重新排序或分组,使其符合您的阅读和处理习惯。
方法一:使用 sort_values 重新排序
您可以让 DataFrame 优先按照股票代码 (sec_code) 排序,然后再按照日期 (date) 排序:
from jqdata import *
# 假设您的股票列表
stock_list = ['000001.XSHE', '000002.XSHE', '000099.XSHE']
# 获取数据
df = get_mtss(stock_list, start_date='2023-01-01', end_date='2023-01-10')
# 重新排序:先按股票代码排,再按日期排
df_sorted = df.sort_values(by=['sec_code', 'date']).reset_index(drop=True)
print(df_sorted)
方法二:使用 groupby 按股票分组处理
如果您需要对每只股票的数据分别进行计算,使用 groupby 是最符合 Pandas 逻辑的做法:
from jqdata import *
stock_list = ['000001.XSHE', '000002.XSHE', '000099.XSHE']
df = get_mtss(stock_list, start_date='2023-01-01', end_date='2023-01-10')
# 按股票代码分组
grouped = df.groupby('sec_code')
# 遍历每只股票的数据
for code, group_df in grouped:
print(f"\n股票 {code} 的融资融券数据:")
# 此时 group_df 就是单只股票的数据,且通常已按日期排好
print(group_df.sort_values('date'))
总结
在量化编程中,批量获取数据后使用 Pandas 进行清洗和重排(如 sort_values, set_index, groupby)是标准的操作流程。建议您在获取多标的数据后,先通过 sort_values 整理一下 DataFrame,这样就不会觉得顺序混乱了。