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

基于外部DataFrame指定顺序对Pandas DataFrame按每50个Code分组构建投资组合并计算日期维度平均收益率

实现按指定顺序分组并计算投资组合平均收益的方案

我来帮你一步步实现需求,下面是完整的代码和详细解释,完全匹配你提出的三个要求:

步骤1:导入库并读取数据

首先导入需要的工具库,然后读取你的两个CSV文件:

import pandas as pd
import numpy as np

# 读取原始数据
db = pd.read_csv('17base.csv')
order = pd.read_csv('order.csv')

步骤2:按照指定顺序排序code

要让db中的code严格遵循order里的顺序,我们可以把code转换成有序类别(Categorical),这样排序时会自动沿用order的顺序,而不是默认的数字/字母排序:

# 将db的code设置为有序类别,类别顺序完全匹配order中的code列表
db['code'] = pd.Categorical(db['code'], categories=order['code'].tolist(), ordered=True)
# 按照code进行排序,此时会严格遵循order的顺序
db_sorted = db.sort_values('code')

步骤3:为每个code分配投资组合编号

接下来给每个code分配对应的组合编号,每50个为一组。我们先在order中生成组合号,再合并到排序后的db中:

# 计算每个code的组合编号:用整数除法实现每50个一组(0,0,...,0,1,1,...,1...)
order['portfolio'] = np.arange(len(order)) // 50
# 将组合编号合并到排序后的db数据中
db_with_portfolio = db_sorted.merge(order[['code', 'portfolio']], on='code', how='left')

步骤4:计算每个组合在对应日期的平均r值

最后按照投资组合编号和Date分组,计算每组的r平均值,得到最终结果:

# 按组合和日期分组,计算r的平均值
result = db_with_portfolio.groupby(['portfolio', 'Date'])['r'].mean().reset_index()
# 给平均收益列重命名为更直观的名字
result.rename(columns={'r': 'avg_r'}, inplace=True)

验证结果

你可以通过print(result.head())查看结果,输出会类似这样:

portfolio     Date     avg_r
0          0  2017-1  0.023456
1          0  2017-2  0.018901
2          0  2017-3  0.031245
3          1  2017-1  0.009876
4          1  2017-2  0.021098

这样就完全满足了你的三个需求:

  • 严格按照order中的code顺序排序
  • 自动每50个code划分为一个投资组合
  • 按日期计算每个组合的平均r值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:52:45