【问题标题】:Data frame shift functionality数据帧移位功能
【发布时间】:2017-08-16 20:47:43
【问题描述】:

我目前有两个数据框,并希望根据两个条件都满足创建第三个数据框:如果数据框 1 中的相应值刚刚突破 2 并且数据框 2 的值

df1

df2

并且代码应该如下创建df3:

即条件仅在 17 年 8 月 13 日的 5y 为 TRUE,因为 5y 已突破 2 且 df2 中的值

这样做的目的是在整个数据帧上复制mean reversion strategy 在此处所做的工作,而不仅仅是针对单个时间序列,即示例中的每个步骤都在数据帧上执行处理,而不是时间序列级别。

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

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

【问题讨论】:

  • 为什么 10y 13-Aug-17 是假的? df1 中 10y 13-Aug-17 的值为 2.3,大于 2。df2 中 10y 13-Aug-17 的值为 0.1,小于 0.2。 17 年 8 月 13 日 10 年的 df3 中应该是真的,对吧?
  • 我已经阅读了您上面提到的均值回归策略。如果您的目标是使用不同持续时间的均值回归,即 2 年、5 年或 10 年。我认为您也许能够找到在数据帧级别上进行操作的方法。但是,其他人可能并不容易理解它。您可以考虑使用 for 循环并将数据框列命名为 'zscore_2y', 'zscore_5y' 。如果需要并且我的理解是正确的,我可以提供一个示例来进一步说明我的想法。
  • 10y 13-aug-17 为假,因为 df1 需要刚刚突破 2。10y 12-aug-17 也是 >2,所以只有当 df 中的对应值时才满足 TRUE 条件在时间 t > 2 并且 t-1

标签: python pandas


【解决方案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

【讨论】:

    【解决方案2】:

    这可能会有所帮助

    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
    

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

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 1970-01-01
      • 2021-12-25
      • 2019-01-06
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2022-01-17
      相关资源
      最近更新 更多