我有一个包含打开/关闭、蜡烛颜色和连续蜡烛数量的数据框。
date open close color run
00:01:00 100 102 g 1
00:02:00 102 104 g 2
00:03:00 104 106 g 3
00:04:00 106 105 r 1
00:05:00 105 101 r 2
00:06:00 101 102 g 1
00:06:00 102 103 g 2
Run Code Online (Sandbox Code Playgroud)
我正在尝试计算运行中第一根蜡烛的开盘价与运行中最后一根蜡烛的收盘价之间的差异的绝对值,并将差异应用于每一行。结果看起来像
date open close color run run_length
00:01:00 100 102 g 1 2 # abs(100 - 102)
00:02:00 102 104 g 2 4 # abs(100 - 104)
00:03:00 104 106 g 3 6 # abs(100 - 106)
00:04:00 106 105 r 1 1 # abs(106 - 105)
00:05:00 105 101 r 2 5 # abs(106 - 101)
00:06:00 101 102 g 1 1 # abs(101 - 102)
00:06:00 102 103 g 2 2 # abs(101 - 103)
Run Code Online (Sandbox Code Playgroud)
我已经阅读了另外两篇接近但不太了解我正在寻找的解决方案的帖子:
我正在使用df.groupby((df['color'] != df['color'].shift()).cumsum())蜡烛的颜色对行进行分组(这就是我计算颜色和运行计数的方式),我可以使用该组的第一个和最后一个值,.agg(['first', 'last']).stack()但这不允许我应用原始数据帧每行的差异。
您在寻找吗groupby?为了更加稳健,请按照评论中@Wen的建议,执行groupby使用cumsum技巧:
df['run_length'] = df.groupby(
df['color'].ne(df['color'].shift()).cumsum()
).open.transform('first').sub(df.close).abs()
df
date open close color run run_length
0 00:01:00 100 102 g 1 2
1 00:02:00 102 104 g 2 4
2 00:03:00 104 106 g 3 6
3 00:04:00 106 105 r 1 1
4 00:05:00 105 101 r 2 5
5 00:06:00 101 102 g 1 1
6 00:06:00 102 103 g 2 2
Run Code Online (Sandbox Code Playgroud)