将多个参数的函数应用于 pandas groupby 对象

3
以下是我的数据框的样子:
  symbol      time    open    high     low   close
0   AAPL  09:35:00  219.19  219.67  218.38  218.64
1   AAPL  09:40:00  218.63  219.55  218.62  218.93
2   AAPL  09:45:00  218.91  219.09  218.27  218.44
3   AAPL  09:50:00  218.44  218.90  218.01  218.65
4   AAPL  09:55:00  218.67  218.79  218.08  218.59
5   AAPL  10:00:00  218.59  219.20  218.16  219.01

我正在尝试应用来自talib包的函数,该函数需要两个参数:highlow。以下是我的尝试,但它返回所有的NaN

import pandas as pd
import numpy as np
import talib as ta

def f(x):    
   return ta.SAR(df.high, df.low, acceleration=0.05, maximum=0.2)

df['PSAR1'] = df.groupby(['symbol']).apply(f)

然而,如果没有groupby子句,该函数可以正常工作,并返回以下数字:

df['PSAR2'] = ta.SAR(df.high,df.low, acceleration=0.05, maximum=0.2)

    symbol  time         open   high    low    close    PSAR1   PSAR2
0   AAPL     09:35:00   219.190 219.670 218.380 218.640 NaN     NaN
1   AAPL     09:40:00   218.630 219.550 218.620 218.930 NaN 218.380000
2   AAPL     09:45:00   218.910 219.090 218.270 218.440 NaN 219.550000
3   AAPL     09:50:00   218.440 218.900 218.010 218.650 NaN 219.550000
4   AAPL     09:55:00   218.670 218.790 218.080 218.590 NaN 219.396000
5   AAPL     10:00:00   218.590 219.200 218.160 219.010 NaN 219.257400

我在使用多个参数和groupby时,apply出了问题,不知道错在哪里。
编辑: 在@bsmith89的帮助下,以下方法可行。
def f(df):    
   return pd.DataFrame(ta.SAR(df.high, df.low, acceleration=0.05, maximum=0.2),columns= ['PSAR'])
y = df.groupby(['symbol']).apply(f)

df['PSAR'] = y.PSAR.reset_index(drop=True)
1个回答

3
你的函数是以 x 作为参数编写的,但在操作时却使用了 df。我没有测试过,但尝试重写如下:
def f(df):    
   return ta.SAR(df.high, df.low, acceleration=0.05, maximum=0.2)

谢谢你注意到了这个问题。我原以为你的解决方案可以解决它 :) ,但是我仍然看到NaN。 - gibbz00
当我在解决“groupby”方案问题时,我喜欢查看使用单个组运行函数时返回的内容,例如:f(df.groupby('symbol').get_group('AAPL')) - bsmith89
最后是什么起作用了?我不确定我是否真正回答了你的问题,但我很乐意更新我的答案来帮助其他遇到同样问题的人。 - bsmith89
编辑了帖子以展示解决方案。感谢您的帮助。 - gibbz00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接