我有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应用解决方案,我会感到奇怪吗?
答案 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
等替换低于阈值的值。)