资产排名分类需求:按每日排名为资产添加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
相关产品推荐
相关产品推荐

