滚动操作中的自定义聚合

问题描述

假设我有一个这样的数据集:

df.head()=

             Open     High      Low    Close        
2017-11-12  132.960  133.340  132.940  133.105
2017-11-13  133.110  133.255  132.710  132.755
2017-11-14  132.755  132.985  132.640  132.735 
2017-11-15  132.730  132.790  132.575  132.685
2017-11-16  132.685  132.785  132.625  132.755

我想找到我应该以开盘价购买的日期(假设时间可以调回),恰好在30天后以收盘价出售。

这是我所做的:

df_open = df[['Open']]
df_close = df[['Close']].shift(-30)
df_close = df_close.rename(columns={'Close':'Close_30days_Later'})
df_merged = pd.merge(df_open,df_close,on='Date')
df_merged['Profit'] = df_merged['Close_30days_Later'] - df_merged['Open']
print(f"The highest profit occurs if we go back onto {df_merged['Profit'].idxmax().strftime('%A %B %d,%Y')} to get the profit equals {df_merged.loc[btc_merged['Profit'].idxmax()]['Profit']:.2f}")

我很确定这可以为任何库存数据提供正确的答案。但是,实践问题迫使我必须在此起始代码中使用rolling操作。

def func(df):
    # DELETE `pass` below and replace it with your code
    pass

rolling_df = df.rolling("30d")

还有我应该遵循的指示。

  1. 编写一个实现您的策略的熊猫函数
  2. 将其传递给Rolling_df的agg方法
  3. 从结果中提取“打开”列。
  4. 在该列中找到与最大值相关的日期。

我尝试了以下操作:

def func(df):
    df['Open'] = df['Close'].shift(-30) - df['Open']
    return df.max()

func用作函数,即func(df)时,它将返回最大值,就像我上面做的方法一样。我认为当在agg方法中作为参数传递时,它应该工作。当我这样做时,发生KeyError:“关闭”。我尝试使用iloc更改列,其中“打开”为iloc[:,0],而“关闭”为iloc[:,3],但这也不起作用。

在指定滚动操作使用的列名称时似乎存在一些问题。(实际上,在自定义agg中指定列的名称确实可以在其他设置中工作,例如groupby,但稍稍有点不同的环境。)

有人有什么建议吗?

非常感谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)