python - 在 Pandas 中使用 Apply 方法的 Groupby:分组值的百分比和
问题描述
我正在尝试开发一个程序来将每日数据转换为每月或每年的数据等等。我有一个带有日期时间索引和价格变化百分比的 DataFrame:
% Percentage
Date
2015-06-02 0.78
2015-06-10 0.32
2015-06-11 0.34
2015-06-12 -0.06
2015-06-15 -0.41
...
我按某个频率成功分组。然后我测试了:
df.groupby('Date').sum()
df.groupby('Date').cumsum()
如果是这种情况,它会工作得很好,但问题是我不能将它的百分比相加 (1+x0) * (1+x1)...-1。然后我尝试了:
def myfunc(values):
p = 0
for val in values:
p = (1+p)*(1+val)-1
return p
df.groupby('Date').apply(myfunc)
我不明白 apply () 是如何工作的。它似乎将我的功能应用于所有数据,而不仅仅是分组项目。
解决方案
您apply
正在单独应用于所有行,因为您按date
列分组。您的日期列看起来每行都有唯一值,因此每个组中只有一行。您需要使用 aGrouper
按月分组,然后使用cumprod
并获取每个组的最后一个值:
# make sure Date is a datetime
df["Date"] = pd.to_datetime(df["Date"])
# add one to percentages
df["% Percentage"] += 1
# use cumprod on each month group, take the last value, and subtract 1
df.groupby(pd.Grouper(key="Date", freq="M"))["% Percentage"].apply(lambda g: g.cumprod().iloc[-1] - 1)
但是请注意,这会应用百分比增长,就好像您的行之间的步数相同,但看起来有时是 8 天,有时是 1 天。您可能需要根据您想要的结果进行一些清理。
推荐阅读
- android - 如何确定用户是否从 google play store 订阅中重新订阅过期订阅
- r - R降价,控制台输出为内联并在预览选项卡中绘图
- angular - 从链接 Angular 12 中检索值
- javascript - 如何修复子字符串在 vue.js 3 中不起作用?
- php - 强制重定向登录用户
- java - 如何从 Mono 获取 CommitmentConfiguration id
- sql - 将 nvl 合并为单个语句
- mongodb - MongoDB 仅在嵌套属性上触发更新
- youtube - YOUTUBE - 用于获取当前观看视频的 API
- ios - 如何将数据从 viewcontroller.h 的子视图传递到 appdelegate.swift 中的 FlutterResult