看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 是一个强大的 Python 数据分析库,提供了多种方法来合并(或连接)表格。今天我们来看看如何来实现基金收益率的表格。
我们有两个相同的数据,用这两个数据相减得到超额的数据。
import pandas as pd
df1 = pd.DataFrame({'1月':[0.1,0.05,0.3],
'2月':[0.2,0.1,0.4],
'3月':[0.01,-0.1,0.3],
'4月':[0.01,-0.05,-0.2]},
index=['2021年','2022年','2023年']
)
df2 = pd.DataFrame({'1月':[0.05,0.1,0.2],
'2月':[0.1,0.05,0.3],
'3月':[0.05,0.1,0.2],
'4月':[0.05,0.05,-0.3]},
index=['2021年','2022年','2023年']
)
df3 = df1 - df2
# 基金收益率
df1
'''
1月 2月 3月 4月
2021年 0.10 0.2 0.01 0.01
2022年 0.05 0.1 -0.10 -0.05
2023年 0.30 0.4 0.30 -0.20
'''
# 基准收益率
df2
'''
1月 2月 3月 4月
2021年 0.05 0.10 0.05 0.05
2022年 0.10 0.05 0.10 0.05
2023年 0.20 0.30 0.20 -0.30
'''
# 超额收益率
df3
'''
1月 2月 3月 4月
2021年 0.05 0.10 -0.04 -0.04
2022年 -0.05 0.05 -0.20 -0.10
2023年 0.10 0.10 0.10 0.10
'''
需求为将其合并为以下所示数据,其中计算超额胜率,即超额收益率中,各行中大于0的数据,占总数据量的比重。
'''
1月 2月 3月 4月 月度胜率
2021年 基准收益率 0.05 0.1 0.05 0.05
基金收益率 0.1 0.2 0.01 0.01
超额收益率 0.05 0.1 -0.04 -0.04 50.00%
2022年 基准收益率 0.1 0.05 0.1 0.05
基金收益率 0.05 0.1 -0.1 -0.05
超额收益率 -0.05 0.05 -0.2 -0.1 25.00%
2023年 基准收益率 0.2 0.3 0.2 -0.3
基金收益率 0.3 0.4 0.3 -0.2
超额收益率 0.1 0.1 0.1 0.1 100.00%
'''
用 pd.concat 将这三个数据连接在一起,同时指定每个数据的 key,这样就形成了多索引。接着按索引进行分组,就基本得到了需求数据的结构。
再增加月度胜率列,其中只间超额收益率有数据,其他行设置为空字符串。
最后用 style 的 format 将其他列设置为百分号格式。
最终代码如下:
(
pd.concat([df1, df2, df3],
keys='基金收益率 基准收益率 超额收益率'.split()
)
.groupby(level=[1, 0])
.max()
.assign(月度胜率=lambda d:
d.apply(lambda s:
(
f'{sum(s>0)/len(s):.2%}'
if '超额收益率' in s.name
else ''
),
axis=1)
)
.style
.format('{:.2%}', subset=df1.columns)
)
# ...
这段代码的主要目的是:
这些代码用于处理基金数据,包括基金收益率、基准收益率和超额收益率,然后计算每月的最大值和月度胜率,并以格式化的方式呈现这些结果。
这样就完成了需求。
(完)
更新时间:2024-08-18 16:21:30 标签:pandas python 合并