从 pandas groupby 获取 pct_change 的最后一个示例是否适用?

Get last example of pct_change from pandas groupby apply?

我正在使用 yfinance 的财务数据。

df = yf.download("AAPL MSFT", period="60D", interval="5m")

数据如下所示:

                                 AAPL        MSFT
Datetime                                         
2021-09-17 09:30:00-04:00  147.880005  303.049103
2021-09-17 09:35:00-04:00  147.669998  302.510010
2021-09-17 09:40:00-04:00  147.470001  303.000000
2021-09-17 09:45:00-04:00  147.320007  302.739990
2021-09-17 09:50:00-04:00  147.179993  301.869995
2021-12-10 15:35:00-05:00  178.179993  341.500000
2021-12-10 15:40:00-05:00  178.339996  341.437012
2021-12-10 15:45:00-05:00  178.460007  341.049988
2021-12-10 15:50:00-05:00  179.059998  342.220001
2021-12-10 15:55:00-05:00  179.500000  342.230011

我想计算每日(营业日)百分比变化。

df.groupby(by=pd.Grouper(freq="B")).apply(lambda x: x.pct_change(periods=len(x)-1).iloc[-1,:])

不用选择最后一个例子用iloc也能正常工作。当我使用 iloc 获取 pct_change 的最后一个示例(对我来说唯一相关的示例)时,我收到此错误:

IndexError: single positional indexer is out-of-bounds

即使对象是带有示例的数据框。

也许你应该使用 dropna 而不是 iloc

pct_change = lambda x: x.pct_change(periods=len(x)-1)
out = df.groupby(by=pd.Grouper(freq="B")).apply(pct_change).dropna()
print(out)

# Output:
                               AAPL      MSFT
Datetime                                     
2021-09-17 15:55:00-04:00 -0.012510 -0.010655
2021-09-20 15:55:00-04:00 -0.009423 -0.007445
2021-09-21 15:55:00-04:00  0.000320  0.000577
...
2021-12-08 15:55:00-05:00  0.021300  0.003535
2021-12-09 15:55:00-05:00 -0.010876 -0.007657
2021-12-10 15:55:00-05:00  0.019597  0.013745