gpt4 book ai didi

python - 通过 Groupby 将函数应用于 MultiIndex DataFrame

转载 作者:行者123 更新时间:2023-12-01 06:24:04 26 4
gpt4 key购买 nike

我想对这个 multiIndex Dataframe 进行 groupby('Ticker') ,然后应用一个为每个股票返回一个 Series 的函数,并将结果添加到 df 上的新列中。

def Indicator(dataf):

df = dataf.copy()
df['TR1'] = df.High.sub(df.Low)
df['TR2'] = abs(df.High.sub(df.Close.shift(1)))
df['TR3'] = abs(df.Low.sub(df.Close.shift(1)))
df['TR'] = df[['TR1', 'TR2', 'TR3']].max(axis=1)
df['TR_mean'] = df['TR'].resample('M').mean().shift(1).resample('D').fillna('bfill')
df['Vol_mean'] = df['Volume'].resample('M').mean().shift(1).resample('D').fillna('bfill')
indicator = (df.TR.div(df.TR_mean)).div(df.Volume.div(df.Vol_mean))

return indicator

我尝试这样的事情:

tickers.groupby('Ticker').apply(Indicator)

但我收到此错误:仅对 DatetimeIndex、TimedeltaIndex 或 periodIndex 有效,但获得了“MultiIndex”的实例

数据框:

                        Close           High         Low               Open         Volume
Date Ticker
2010-01-04 AAPL 6048.299805 6048.299805 5974.430176 5975.520020 1.043444e+08
GOOG 1132.989990 1133.869995 1116.560059 1116.560059 3.991400e+09
TSM 10654.79003 10694.49023 10608.13948 10609.33984 1.044000e+05
2010-01-05 AAPL 6031.859863 6058.020020 6015.669922 6043.939941 1.175721e+08
GOOG 1132.989990 1133.869995 1116.560059 1116.560059 3.991400e+09
TSM 10654.79003 10694.49023 10608.13948 10609.33984 1.044000e+05

最佳答案

为了修复该错误,您只需在 Indicator 函数中的 copy 操作之后添加以下行:

df.index = df.index.get_level_values(0)

问题确实是由于您将 MultiIndex 而不是 DateTime 索引传递给 resample函数中的方法(这是一个处理时间序列的函数)。额外的行所做的基本上是用索引的 DateTime 部分替换 MultiIndex。结果如下:

>>> df_orig
Close High Low Open Volume
Date Ticker
2010-01-04 AAPL 6048.299805 6048.299805 5974.430176 5975.520020 1.043444e+08
GOOGL 1132.989990 1133.869995 1116.560059 1116.560059 3.991400e+09
TSM 10654.790030 10694.490230 10608.139480 10609.339840 1.044000e+05
2010-01-05 AAPL 6031.859863 6058.020020 6015.669922 6043.939941 1.175721e+08
GOOGL 1132.989990 1133.869995 1116.560059 1116.560059 3.991400e+09
TSM 10654.790030 10694.490230 10608.139480 10609.339840 1.044000e+05

>>> df_orig.info()
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 6 entries, (2010-01-04 00:00:00, AAPL) to (2010-01-05 00:00:00, TSM)
Data columns (total 5 columns):
Close 6 non-null float64
High 6 non-null float64
Low 6 non-null float64
Open 6 non-null float64
Volume 6 non-null float64
dtypes: float64(5)
memory usage: 410.0+ bytes

>>> df_orig.groupby("Ticker").apply(Indicator)
Date 2010-01-04 2010-01-05
Ticker
AAPL NaN NaN
GOOGL NaN NaN
TSM NaN NaN

当然,您也可以删除 groupby-apply 部分之前的 Ticker 列,如下所示:

ticker_idx = df_orig.index.get_level_values(1)
df_orig.reset_index(1, drop=True).groupby(ticker_idx).apply(Indicator)

这样您就不需要在函数中添加额外的行。

此外,由于 groupby-apply 操作,我得到了一堆 NaN ,但通过查看函数的代码,我认为这是由于函数期望更多数据的事实然后2天。让我知道这是否正确。

关于python - 通过 Groupby 将函数应用于 MultiIndex DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60248148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com