在R中将返回值绝对值转换为年度占比百分比的处理方法问询
实现方案
以下是不同场景下的高效实现方法,1万行数据量级下所有方案耗时均在毫秒级:
Python(pandas实现)
适合数据存储在本地文件(csv/excel/文本等)的场景:
import pandas as pd # 读取数据,空格分隔的文本用sep='\s+',csv直接用默认sep即可 df = pd.read_csv('你的数据文件路径', sep='\s+') # 按年份分组计算每年绝对值总回报 df['year_total'] = df.groupby('Year')['Return'].transform(lambda x: x.abs().sum()) # 计算占比并转百分比格式,需要保留n位小数就把.0f改成.nf df['Return'] = df['Return'].abs() / df['year_total'] * 100 df['Return'] = df['Return'].apply(lambda x: f"{x:.0f}%") # 删除临时列并导出结果 df = df.drop('year_total', axis=1) df.to_csv('结果输出路径', index=False)
R语言实现
library(dplyr) # 读取数据 df <- read.table("你的数据文件路径", header = TRUE) # 分组计算占比 df <- df %>% group_by(Year) %>% mutate(year_total = sum(abs(Return)), Return = paste0(round(abs(Return)/year_total * 100, 0), "%")) %>% select(-year_total) # 导出结果 write.csv(df, "结果输出路径", row.names = FALSE)
SQL实现
如果数据存储在关系型数据库中,直接用SQL查询处理无需导出到本地,效率更高:
SELECT Year, Type, -- 需要保留n位小数就把ROUND的第二个参数0改成n CONCAT(ROUND(ABS(Return) / SUM(ABS(Return)) OVER (PARTITION BY Year) * 100, 0), '%') AS Return FROM 你的表名;
内容的提问来源于stack exchange,提问作者PCRL
相关产品推荐
相关产品推荐

