我正在尝试开发一个程序,将每日数据转换为每月或每年的数据,依此类推。 我有一个带有日期时间索引和价格变动%的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()是如何工作的。似乎将我的功能应用于所有数据,而不仅仅是应用于分组的项目。
答案 0 :(得分:0)
您的apply
将分别应用于所有行,因为您要按date
列进行分组。您的日期列看起来每一行都有唯一的值,因此每一组中只有一行。您需要使用Grouper
来按月分组,然后使用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天。您可能需要对所需的结果进行一些清理。