Pandas在前一行中连续出现的次数

时间:2018-01-15 08:45:14

标签: python pandas data-science

我有OHLC数据。蜡烛可以是“绿色”(如果收盘价高于开盘价)或“红色”(如果收盘价高于收盘价)。格式为:

  open close candletype
0  542 543 GREEN
1  543 544 GREEN 
2  544 545 GREEN
3  545 546 GREEN
4  546 547 GREEN
5  547 542 RED
6  542 543 GREEN

我想要的是计算前n行的连续绿色或红色蜡烛的数量。让我们说我想要识别前面有3个绿色蜡烛的行。

所需的输出是:

  open close candletype  pattern
0  542 543 GREEN  Toofewrows
1  543 544 GREEN  Toofewrows
2  544 545 GREEN  Toofewrows
3  545 546 GREEN  3-GREEN-CANDLES-IN-A-ROW
4  546 547 GREEN  3-GREEN-CANDLES-IN-A-ROW
5  547 542 RED    3-GREEN-CANDLES-IN-A-ROW
6  542 543 GREEN  No pattern

我知道如何通过提取行号来获得解决方案,将自定义函数应用于具有该行号的candletype系列,并查看该自定义函数中的n个先前行,创建n项列表并检查isAll(' GREEN')但如果有一个优雅的LINER应用解决方案,我会感到奇怪吗?

3 个答案:

答案 0 :(得分:1)

您可以将lambda函数应用于滚动窗口。见Applying lambda function to a pandas rolling window series

您可以对它们进行分类或将它们自己映射到某些数字:

df = pd.read_clipboard()
df['code'] = df.candletype.astype('category').cat.codes

这导致以下DataFrame:

    open    close   candletype  code
0   542 543 GREEN   0
1   543 544 GREEN   0
2   544 545 GREEN   0
3   545 546 GREEN   0
4   546 547 GREEN   0
5   547 542 RED 1
6   542 543 GREEN   0

现在只需应用df['code'].rolling(3).apply(lambda x: all(x==0)).shift()即可 0

     NaN
1    NaN
2    NaN
3    1.0
4    1.0
5    1.0
6    0.0

按预期/需要填写nans和零。

这既不是oneliner,也可能比字符串比较更漂亮。希望它能帮到你!

答案 1 :(得分:0)

滚动窗口对数字而不是字符串起作用,因此分解并应用和使用set来检查相等性,即

df['new'] = pd.Series(df['candletype'].factorize()[0]).rolling(window=4).apply(lambda x : set(x[:-1]) == {0})

df['new'].replace({1:'Consective 3 Green',0:'No Pattern'})

0                   NaN
1                   NaN
2                   NaN
3    Consective 3 Green
4    Consective 3 Green
5    Consective 3 Green
6            No Pattern
Name: new, dtype: object

除了滚动应用,您也可以使用拉链来进行此操作,即

def get_list(x,m) : 
    x = zip(*(x[i:] for i in range(m)))
    return ['3 Greens' if set(i[:-1]) == {'GREEN'} else 'no pattern' for i in x]

df['new'] = pd.Series(get_list(df['candletype'],4), index=df.index[4 - 1:])

   open  close candletype         new
0   542    543      GREEN         NaN
1   543    544      GREEN         NaN
2   544    545      GREEN         NaN
3   545    546      GREEN    3 Greens
4   546    547      GREEN    3 Greens
5   547    542        RED    3 Greens
6   542    543      GREEN  no pattern

答案 2 :(得分:0)

此单行可以计算您的系列中连续出现的次数。然而,它有点棘手,因此不容易为其他用户或未来的用户阅读!在this post中已经很好地解释了这一点。

df = pd.read_clipboard()
df['pattern'] = df.groupby((df.candletype != df.candletype.shift()).cumsum()).cumcount()
df
>>>    open  close candletype  pattern
0   542    543      GREEN        0
1   543    544      GREEN        1
2   544    545      GREEN        2
3   545    546      GREEN        3
4   546    547      GREEN        4
5   547    542        RED        0
6   542    543      GREEN        0

这不完全是您提供的输出,但在这里您可以获得连续值的确切数量。然后,您可以将任何化妆品详细信息应用于此系列(通过Toofewrows等替换低于阈值的值。)