Python数据帧中连续上下的次数

2024-04-16 21:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个像下面这样的时间序列。你知道吗

我想计算1天内收益率为正的次数(这里简单地定义为xun-xn-1),连续2天收益率为正的次数。。。等。。。。负收益也一样。你知道吗

什么是优雅的方法?我尝试了不同的方法,使用组合diff()sum()cumsum()groupby()(等等…),但都没有成功。你知道吗

你能提些建议吗?你知道吗

DATE    SETTLE
24/05/1988  784
25/05/1988  759
26/05/1988  754
27/05/1988  768
31/05/1988  798
01/06/1988  802
02/06/1988  819
03/06/1988  849
06/06/1988  879
07/06/1988  882
08/06/1988  861
09/06/1988  886
10/06/1988  884
13/06/1988  877
14/06/1988  890
15/06/1988  920
16/06/1988  942
17/06/1988  972
20/06/1988  1002
21/06/1988  1047
22/06/1988  1055
23/06/1988  1033
24/06/1988  1030
27/06/1988  1060
28/06/1988  1015
29/06/1988  931
30/06/1988  986
01/07/1988  989
05/07/1988  959
06/07/1988  984

Tags: 方法date定义时间diff序列收益次数
2条回答

首先,将价格转换为回报:

df['daily_return'] = df.SETTLE.pct_change()

然后,计算正/负日收益天数:

df['pos_returns'] = df.daily_return.gt(0)  # or df.SETTLE.gt(df.SETTLE.shift())
df['neg_returns'] = df.daily_return.lt(0)

通过比较布尔标志和前一个标志(例如(df.pos_returns != df.pos_returns.shift())),创建标识符来对每个返回序列进行分组。取这些值的累积和来创建具有相同真/假范围的组。通过乘以标志来掩盖假值,并取正的组值。你知道吗

最后,执行value_counts()两次。第一次按日计数聚合组,第二次聚合日计数事件。你知道吗

pos_groups = (df.pos_returns != df.pos_returns.shift()).cumsum().mul(df.pos_returns)
consec_pos_return_days = pos_groups[pos_groups > 0].value_counts().value_counts()

neg_groups = (df.neg_returns != df.neg_returns.shift()).cumsum().mul(df.neg_returns)
consec_neg_return_days = neg_groups[neg_groups > 0].value_counts().value_counts()

>>> pd.concat([consec_pos_return_days, consec_neg_return_days], axis=1).fillna(0)
   pos_returns  neg_returns
1            3            2
2            1            4
7            2            0

该表显示,有3个单日正收益,1个两日正收益和2个七日正收益。你知道吗

我有连续数日的代码。。。这可能会有所帮助,然后您可以过滤连续天数函数的结果。在下面的示例中,mdo只是数据帧的包装器:

def consdays(s):
    z=pandas.Series(index=s.index)
    for (i,j) in enumerate(s.index):
        if s.iloc[i]==1:
            z.iloc[i]=z.iloc[i-1]+1
        else:
            z.iloc[i]=0
    return z


def consecutivedays(mdo):
    x=mdo.df['close']
    yp=(x>=x.shift(1))*1
    ym=(x<x.shift(1))*1
    return consdays(yp)+-1*consdays(ym)

相关问题 更多 >