如何从大熊猫数据帧函数调用内回看以前的行?(How to look back at previous

2019-08-07 05:27发布

我研究/回测交易系统。

我有一个包含OHLC数据的数据帧熊猫和增加了一些计算的列 ,其确定我将使用作为信号来启动位置价图案。

现在我想补充另一塔,将跟踪当前的净头寸。 我一直在使用df.apply(),但通过数据框本身作为参数,而不是行对象,因为后者试图我似乎无法回头看看以前的行以确定它们是否造成了任何价格模式:

open_campaigns = []
Campaign = namedtuple('Campaign', 'open position stop')

def calc_position(df):
  # sum of current positions + any new positions

  if entered_long(df):
    open_campaigns.add(
        Campaign(
            calc_long_open(df.High.shift(1)), 
            calc_position_size(df), 
            calc_long_isl(df)
        )
    )

  return sum(campaign.position for campaign in open_campaigns)

def entered_long(df):
  return buy_pattern(df) & (df.High > df.High.shift(1))

df["Position"] = df.apply(lambda row: calc_position(df), axis=1)

然而,这将返回以下错误:

ValueError: ('The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()', u'occurred at index 1997-07-16 08:00:00')

滚动窗口的功能似乎是天作之合,但据我所知,他们只作用于单一的时间序列或列,这样就不会工作,要么因为我需要在多个时间点访问多个列的值。

我其实应该怎样做呢?

Answer 1:

这个问题的根源在于NumPy的。

def entered_long(df):
  return buy_pattern(df) & (df.High > df.High.shift(1))

entered_long被返回一个数组状物体。 NumPy的拒绝猜测如果数组是真还是假:

In [48]: x = np.array([ True,  True,  True], dtype=bool)

In [49]: bool(x)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

为了解决这个问题,使用anyall指定你的意思是一个数组为True:

def calc_position(df):
  # sum of current positions + any new positions

  if entered_long(df).any():  # or .all()

any()如果任何项目的方法将返回true entered_long(df)是正确的。 在all()如果在所有项目方法将返回true entered_long(df)是正确的。



文章来源: How to look back at previous rows from within Pandas dataframe function call?