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

资产排名分类需求:按每日排名为资产添加long/short仓位列

按每日维度标记资产仓位(short/long)

问题描述

给定一份包含多日期、每日不同资产篮子的排名表,需新增position列,规则为:

  • 每日排名最低(rank值最小)的资产标记为short
  • 每日排名最高(rank值最大)的资产标记为long
  • 其余资产标记为-

原始数据

asset rank       date
1     A    1 2022-11-04
2     B    2 2022-11-04
3     C    3 2022-11-04
4     D    4 2022-11-04
5     K    1 2022-11-03
6     A    2 2022-11-03
7     T    3 2022-11-03
8     M    4 2022-11-03
9     J    5 2022-11-03

期望结果

asset rank       date position
1     A    1 2022-11-04 short
2     B    2 2022-11-04 -
3     C    3 2022-11-04 -
4     D    4 2022-11-04 long
5     K    1 2022-11-03 short
6     A    2 2022-11-03 -
7     T    3 2022-11-03 -
8     M    4 2022-11-03 -
9     J    5 2022-11-03 long

解决方案(Python pandas)

通过分组计算每日的极值排名,再用条件判断生成目标列:

import pandas as pd

# 构造原始数据
data = {
    'asset': ['A', 'B', 'C', 'D', 'K', 'A', 'T', 'M', 'J'],
    'rank': [1, 2, 3, 4, 1, 2, 3, 4, 5],
    'date': ['2022-11-04']*4 + ['2022-11-03']*5
}
df = pd.DataFrame(data)

# 按日期分组,计算每日最小/最大rank
rank_stats = df.groupby('date')['rank'].agg(['min', 'max']).reset_index()
df = df.merge(rank_stats, on='date')

# 生成position列
df['position'] = df.apply(
    lambda row: 'short' if row['rank'] == row['min'] 
                else 'long' if row['rank'] == row['max'] 
                else '-',
    axis=1
)

# 还原原始顺序并输出
df = df[['asset', 'rank', 'date', 'position']].sort_values('date', ascending=False).reset_index(drop=True)
print(df.to_string(index=False))

解决方案(SQL)

如果数据存储在数据库中,可通过窗口函数直接计算每日极值:

SELECT 
    asset,
    rank,
    date,
    CASE
        WHEN rank = MIN(rank) OVER (PARTITION BY date) THEN 'short'
        WHEN rank = MAX(rank) OVER (PARTITION BY date) THEN 'long'
        ELSE '-'
    END AS position
FROM your_table
ORDER BY date DESC, rank;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:00:24