数据框移位功能

时间:2017-08-16 09:36:16

标签: python pandas

我目前有两个数据帧,并希望根据满足的两个条件创建第三个数据帧:如果数据帧1中的相应值刚刚超过2并且数据帧2的值是< =则为TRUE 0.2,否则为FALSE。

DF1

enter image description here

DF2

enter image description here

代码应该按如下方式创建df3:

enter image description here

,即13-aug-17的5y条件仅为5,因为5y已超过2且df2中的值<= 0.2。

这样做的目的是复制在此处mean reversion strategy完成的整个数据框,而不仅仅是单个时间序列,即对于示例中的每个步骤,执行数据框,而不是时间序列级别。

所以问题是如何在数据框而不是列级应用下面的移位函数。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可能会有所帮助

SELECT t1.*, MAX(t2.id) as max_t2id
FROM table1 t1 JOIN
     table2 t2
     ON t1.id = t2.idTable1
GROUP BY t1.id;

输出为

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

我不推荐以上方法。看起来有点乱。如果可能,您可以有三个数据框。每个帧将保存单个持续时间的数据。即1年5年相关数据的数据框架,1年10年和1年2年。您可以创建一个解析单个数据框的函数。这样,您就可以从均值回归样本中复制代码。理解数学比以复杂方式处理数据更为重要。希望它有所帮助。