2017-08-16 68 views
1

我现在有两个数据帧并希望创建基于两个条件的第三数据帧都被满足:TRUE,如果在数据帧1的相应值已通过2刚刚打破与数据帧2的值是< = 0.2,否则为假。数据帧移功能

DF1

enter image description here

DF2

enter image description here

和代码应该创建DF3如下:

enter image description here

即conditi上仅是为TRUE 5Y上13-AUG-17 5Y具有上述2断裂,在DF2 < = 0.2的值。

这样做的目的是在整个数据框上复制已经完成的工作,而不仅仅是单个时间序列,即对于示例中的每个步骤,在数据框处执行该过程,而不是时间序列水平。

所以现在的问题是如何在数据帧,而不是列级应用下面移位功能。

df4['short entry'] = ((df4.zScore < - entryZscore) & (df4.zScore.shift(1) > - entryZscore)&(df4['hurst'] < hurstentry)) 
+0

为什么10y 13-Aug-17是错误的?在DF1为10Y 13 - 8 - 17值是2.3,其大于2. 10Y 13 - 8 - 17 DF2值为0.1,这是小于0.2。在df3中应该是真的,10y 13-Aug-17,对吧? – White

+0

我已阅读上面提到的平均回复策略。如果您的目标是在不同的持续时间,即2年,5年或10年使用均值回复。我想你可能会找到在数据帧级别上运行的方法。但是,其他人理解它可能并不容易。您可以考虑一个for循环,并将您的数据框列命名为'zscore_2y','zscore_5y'。如果需要,我的理解是正确的,我可以提供一个样本来进一步说明我的想法。 – White

+0

10y 13-aug-17是错误的,因为df1需要刚好超过2。10y 12-aug-17也是> 2,所以只有在时间t的df中的对应值大于2并且t-1 <2时才满足TRUE条件。 –

回答

1

简短的回答:

df3 = ((df1 > -entryZscore) & (df1.shift(1) < -entryZscore) & (df2 < hurstentry)) 

我不知道理解均值回归策略问题,但如果entryZscore和hurstentry是相同的所有列,你可以试试这个:

import pandas as pd 

date_index = pd.date_range('2017-08-10', '2017-08-13') 
cols = ['2y','5y','10y'] 

df1 = pd.DataFrame([[1.3,1.3,1.3],[1.4,1.4,1.4],[1.9,2.1,1.9],[1.9,1.9,1.9]], 
        columns=cols, index=date_index) 
df2 = pd.DataFrame([[0.3,0.3,0.3],[0.1,0.1,0.1],[0.1,0.1,0.1], [0.3,0.3,0.3]], 
        columns=cols, index=date_index) 

entryZscore = -2 
hurstentry = 0.2 

df3 = ((df1 > -entryZscore) & (df1.shift(1) < -entryZscore) & (df2 < hurstentry)) 

输出:

  2y  5y  10y 
2017-08-10 False False False 
2017-08-11 False False False 
2017-08-12 False True False 
2017-08-13 False False False 
0

这可能是一些有助于

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([['11',1.3,1.3,1.3],['12',1.4,1.4,1.4],['13',1.9,2.1,1.9], ['14',1.9,1.9,1.9]]) 
df1.columns = ['date','2y','5y','10y'] 
df2 = pd.DataFrame([['11',0.3,0.3,0.3],['12',0.1,0.1,0.1],['13',0.1,0.1,0.1], ['14',0.3,0.3,0.3]]) 
df2.columns = ['date','2y','5y','10y'] 

df = pd.merge(df1, df2, on='date', suffixes=['_zscore','_hurst']) 
entryZscore = -2 
hurstentry = 0.2 
for x in ['2y','5y','10y']: 
    df[x+'_short'] = ((df[x+'_zscore'] > -entryZscore) & (df[x+'_zscore'].shift(1) < -entryZscore)&(df[x+'_hurst'] < hurstentry)) 
entries = ['date'] + [x+'_short' for x in ['2y','5y','10y']] 
result = df[entries] 
print result 

输出

date 2y_short 5y_short 10y_short 
0 11 False False  False 
1 12 False False  False 
2 13 False  True  False 
3 14 False False  False 

我不建议以上做法。这似乎有点混乱。如果可能的话,你可以有三个数据框。每帧将保存单个持续时间的数据。即5年相关数据的1个数据帧,10年1个和2年1个。您可以创建一个函数来解析单个数据帧。通过这种方式,您可以复制平均回归示例中的代码。理解数学比以复杂的方式处理数据更重要。希望能帮助到你。