Python 如何基于来自其他数据帧的开始和结束信号创建熊猫数据帧?

Python 如何基于来自其他数据帧的开始和结束信号创建熊猫数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,那么从本质上讲,我应该如何接受A(进入信号)和B(退出信号)以及C(交易信号) 请注意,A是进入信号,B是退出信号。 因此: 所以基本上,a中的1作为C“开”的信号,B中的1作为C“关”的信号。如果C已经打开(C的前一个元素是1),那么a中的1什么也不做,因为C已经打开了。类似地,如果C已经关闭(C的前一个元素是0),那么B中的1什么也不做,因为C已经关闭。基本上,A有一个进入交易的信号列表,B有一个何时退出的信号列表,但你只能在你不在交易时进入,只有在你在交易时才能退出,所以C是你是否在交易的

那么从本质上讲,我应该如何接受A(进入信号)和B(退出信号)以及C(交易信号)

请注意,A是进入信号,B是退出信号。 因此:

所以基本上,a中的1作为C“开”的信号,B中的1作为C“关”的信号。如果C已经打开(C的前一个元素是1),那么a中的1什么也不做,因为C已经打开了。类似地,如果C已经关闭(C的前一个元素是0),那么B中的1什么也不做,因为C已经关闭。基本上,A有一个进入交易的信号列表,B有一个何时退出的信号列表,但你只能在你不在交易时进入,只有在你在交易时才能退出,所以C是你是否在交易的列表

我尝试实施您的解决方案,如下所示:

def generate_signals(self):
      signals = pandas.DataFrame(index=self.data.index)
      signals['Date'] = self.data['Date']
      signals['Close'] = self.data['Close']
      signals['fast_MA'] = pandas.stats.moments.ewma(self.data['Close'],
                                                     span=self.short_window)
      signals['slow_MA'] = pandas.stats.moments.ewma(self.data['Close'],
                                                     span=self.long_window)
      signalinfo = pandas.DataFrame(index=signals.index)
      signalinfo['entry_signals'] = numpy.where(signals['fast_MA'] >
                                                signals['slow_MA'], 1.0, 0.0)
      signals['stop'] = (data['Open'].shift(-1)
                         [(signalinfo['entry_signals'] == 1.0)
                          & (signalinfo['entry_signals']
                             .shift(1) == 0.0)])
      signals['stop'] = signals['stop'].fillna(0.0)
      signals['stop'] = signals['stop'].apply(lambda x: .97 * x)
      signals['stop'] = (signals['stop']
                         .replace(to_replace=0.0, method='ffill'))
      signalinfo['exit_signals'] = numpy.where(signals['Close'] <=
                                               signals['stop'], 1.0, 0.0)

      #process entry and exit signals to form trade signals
      signalinfo['Close'] = self.data['Close']
      mask = signalinfo.copy().astype(bool)
      signalinfo.entry_signals[mask.entry_signals] = signalinfo.index
      signalinfo.exit_signals[mask.exit_signals] = signalinfo.index
      signalinfo = signalinfo[mask].ffill().fillna(0)
      signalinfo['signal'] = (signalinfo['exit_signals']
                              < signalinfo['entry_signals']).astype(int)
      signalinfo['entry_signals'] = numpy.where(signals['fast_MA'] >
                                                signals['slow_MA'], 1.0, 0.0)
      signalinfo['exit_signals'] = numpy.where(signals['Close'] <=
                                               signals['stop'], 1.0, 0.0)
      signals['signal'][:self.long_window] = 0.0
      print signalinfo.head(50)
      print signalinfo.tail(50)
      return signals
def生成_信号(自):
信号=pandas.DataFrame(索引=self.data.index)
信号['Date']=self.data['Date']
信号['Close']=self.data['Close']
信号['fast_-MA']=pandas.stats.moments.ewma(self.data['Close'],
span=自紧式(短窗口)
信号['slow_MA']=pandas.stats.moments.ewma(self.data['Close']),
span=自身长窗口)
signalinfo=pandas.DataFrame(index=signals.index)
信号信息['entry\u signals']=numpy.where(信号['fast\u MA']>
信号['slow_MA',1.0,0.0)
信号['stop']=(数据['Open'].shift(-1)
[(信号信息['entry_signals']==1.0)
&(信号信息['entry_signals']
.移位(1)==0.0)])
信号['stop']=信号['stop'].fillna(0.0)
信号['stop']=信号['stop']。应用(λx:.97*x)
信号['stop']=(信号['stop']
.replace(to_replace=0.0,method='ffill'))
signalinfo['exit_signals']=numpy.where(信号['Close']
信号['slow_MA',1.0,0.0)

signalinfo['exit_signals']=numpy.where(signals['Close']我没有测试下面的代码,但是它可以得到示例中您想要的,您能用更多数据测试它吗

基本思想是用索引值填充A和B中的每个
1
,然后我们可以比较哪一个较大,较大的是活动的:

import pandas as pd
import numpy as np
df = pd.read_csv("signal.csv", delim_whitespace=True)

mask = df.copy().astype(bool)
df.A[mask.A] = df.index
df.B[mask.B] = df.index
df = df[mask].ffill()
C = df.B < df.A
C.where(C).ffill(limit=1).fillna(0)

事实上,你能发布迭代版本吗?我本来以为我完全理解你想要什么,但当我去实现它时,我意识到我没有。
import pandas as pd
import numpy as np
df = pd.read_csv("signal.csv", delim_whitespace=True)

mask = df.copy().astype(bool)
df.A[mask.A] = df.index
df.B[mask.B] = df.index
df = df[mask].ffill()
C = df.B < df.A
C.where(C).ffill(limit=1).fillna(0)
0    0
1    1
2    1
3    1
4    0
5    1
6    1
7    0
8    1
9    1
dtype: float64