You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从多币种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存在两个问题:

  1. 未定义positions字典和value变量,会触发NameError;
  2. 未正确提取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)

代码说明

  1. 遍历res['result']列表:result是列表结构,每个元素是包含data和is_valid的字典;
  2. 过滤逻辑:仅保留position_value > 0的持仓数据;
  3. 字段提取:按需筛选symbol、side、unrealised_pnl等字段,可根据需求增删;
  4. DataFrame转换:将过滤后的列表直接传入pd.DataFrame()即可生成结构化表格。

内容的提问来源于stack exchange,提问作者rusty_research

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:35:28