从多币种API响应筛选持仓价值>0的币种并整理数据
问题描述
需求:仅返回position_value>0的币种列表,提取对应币种的side、unrealised_pnl等数据并转为Pandas DataFrame格式。
现状:
- 可正常获取完整API JSON响应,但访问
['result']['data']时触发TypeError: list indices must be integers or slices, not str错误; - 尝试用for循环处理未成功,现有代码及API响应示例如下:
现有代码1
def get_positions(): res = session_auth_unlocked.my_position()['result'] return res print(get_positions())
现有代码2
def get_positions(): res = session_auth_unlocked.my_position() for item in res['result']['data']: if value > 0: positions[item['symbol']] = value return positions print(get_positions())
API响应示例
{ "ret_code": 0, "ret_msg": "OK", "ext_code": "", "ext_info": "", "result": [ { "data": { "user_id": 533285, "symbol": "10000NFTUSDT", "side": "Sell", "size": 0, "position_value": 0, "entry_price": 0, "liq_price": 0, "bust_price": 0, "leverage": 10, "auto_add_margin": 0, "is_isolated": false, "position_margin": 0, "occ_closing_fee": 0, "realised_pnl": 0, "cum_realised_pnl": 0, "free_qty": 0, "tp_sl_mode": "Full", "unrealised_pnl": 0, "deleverage_indicator": 0, "risk_id": 1, "stop_loss": 0, "take_profit": 0, "trailing_stop": 0, "position_idx": 2, "mode": "BothSide" }, "is_valid": true }, ... { "data": { "user_id": 533285, "symbol": "10000NFTUSDT", "side": "Buy", "size": 0, "position_value": 0, "entry_price": 0, "liq_price": 0, "bust_price": 0, "leverage": 10, "auto_add_margin": 0, "is_isolated": false, "position_margin": 0, "occ_closing_fee": 0, "realised_pnl": 0, "cum_realised_pnl": 0, "free_qty": 0, "tp_sl_mode": "Full", "unrealised_pnl": 0, "deleverage_indicator": 0, "risk_id": 1, "stop_loss": 0, "take_profit": 0, "trailing_stop": 0, "position_idx": 1, "mode": "BothSide" }, "is_valid": true } ], "time_now": "1604302080.356538", "rate_limit_status": 119, "rate_limit_reset_ms": 1604302080353, "rate_limit": 120}
解决方案
错误原因
从API响应能看到,result是列表类型而非字典,因此不能直接用res['result']['data']访问——必须先遍历result列表中的每个元素,再获取元素内的data字典。
另外现有代码2存在两个问题:
- 未定义
positions字典和value变量,会触发NameError; - 未正确提取
position_value作为判断条件。
修正后的代码
import pandas as pd def get_positions(): # 获取完整API响应 res = session_auth_unlocked.my_position() # 初始化存储有效持仓的列表 valid_positions = [] # 遍历result列表中的每个持仓项 for item in res['result']: # 获取当前持仓的详细数据 position_data = item['data'] # 判断position_value是否大于0 if position_data['position_value'] > 0: # 提取需要的字段(可按需调整) filtered_data = { 'symbol': position_data['symbol'], 'side': position_data['side'], 'unrealised_pnl': position_data['unrealised_pnl'], 'position_value': position_data['position_value'], 'entry_price': position_data['entry_price'], 'leverage': position_data['leverage'] } valid_positions.append(filtered_data) # 转换为Pandas DataFrame return pd.DataFrame(valid_positions) # 调用函数并打印结果 positions_df = get_positions() print(positions_df)
代码说明
- 遍历
res['result']列表:result是列表结构,每个元素是包含data和is_valid的字典; - 过滤逻辑:仅保留
position_value > 0的持仓数据; - 字段提取:按需筛选
symbol、side、unrealised_pnl等字段,可根据需求增删; - DataFrame转换:将过滤后的列表直接传入
pd.DataFrame()即可生成结构化表格。
内容的提问来源于stack exchange,提问作者rusty_research
相关产品推荐
相关产品推荐

