基于外部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
相关产品推荐
相关产品推荐

