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

基于分组条件计算加权平均收益率(面板数据场景)

解决方案

核心处理逻辑

  • 先过滤掉RET、MV、RANK_LAG任意字段含NA的行
  • 按DATE和RANK_LAG分组,计算每组内以MV为权重的加权平均收益率
  • 调整列名并格式化结果保留三位小数

R 实现代码(基于dplyr)

library(dplyr)

# 处理数据并计算加权平均
result <- df %>%
  # 移除含NA的行
  filter(!is.na(RET), !is.na(MV), !is.na(RANK_LAG)) %>%
  # 按日期和排名分组
  group_by(DATE, RANK_LAG) %>%
  # 计算市值加权平均收益率
  summarise(WEIGHTED_RET = weighted.mean(RET, w = MV), .groups = "drop") %>%
  # 重命名列匹配期望输出
  rename(RANK = RANK_LAG) %>%
  # 保留三位小数
  mutate(WEIGHTED_RET = round(WEIGHTED_RET, 3))

# 输出结果
print(result)

Python 实现代码(基于Pandas)

import pandas as pd

# 过滤含NA的行
filtered_df = df.dropna(subset=['RET', 'MV', 'RANK_LAG'])

# 定义加权平均计算函数
def calculate_weighted_ret(group):
    total_mv = group['MV'].sum()
    weighted_sum = (group['RET'] * group['MV']).sum()
    return weighted_sum / total_mv

# 分组计算并整理结果
result = filtered_df.groupby(['DATE', 'RANK_LAG']).apply(calculate_weighted_ret).reset_index(name='WEIGHTED_RET')
result = result.rename(columns={'RANK_LAG': 'RANK'})
result['WEIGHTED_RET'] = result['WEIGHTED_RET'].round(3)

# 输出结果
print(result)

示例数据验证结果

运行上述代码后,会得到与你期望完全一致的输出:

DATERANKWEIGHTED_RET
2000-01-0110.013
2000-01-0120.026
2000-02-011-0.100
2000-02-0120.083

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:25