我试图从一个数据框中找出某个日期之前连续的绿色收盘价的数量。
输入:
Ticker Date Close
0 AAPL 20200501 1.5
1 AAPL 20200502 1.2
2 AAPL 20200503 1.3
3 AAPL 20200504 1.3
4 AAPL 20200505 1.4
5 AAPL 20200506 1.5
在本例中,我想知道20200507连续几天高于前一天收盘价的收盘价
预期输出:
2
下面是示例 Dataframe 的代码
import pandas as pd
df1 = pd.DataFrame({'Ticker': ['AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL', 'AAPL'],
'Date': [20200501, 20200502, 20200503, 20200504, 20200505, 20200506],
'Close': [1.5, 1.2, 1.3, 1.3, 1.4, 1.5]})
print(df1)
2条答案
按热度按时间ars1skjm1#
@Quang Hoang Answer如果你想得到最长的连续时间的长度,可以使用。如果你想得到连续几天的当前连续时间的长度,可以使用以下方法:
**编辑:**如果您有日期在
20200507
之后的行,您可以这样修改:**编辑2:**为什么使用
df['Close'].diff() <= 0
而不是df['Close'].diff() > 0
?这就是我们想要达到的效果:
有3连胜在这里发挥,第一个结束后,1。天,第二个结束后,第三天(指数2-3)和最后连胜去所有的方式结束。
为了实现这一点,我们需要一个在每次连输时都会上升的数字。我们可以在一个由
0s
和1s
组成的数组上使用.cumsum
来实现这一行为。每次连输时,日期都应该标记为1
。我们如何测试一条条纹是否断裂?通过与
df['Close'].diff() > 0
相反的操作,即df['Close'].diff() <= 0
,得到以下结果:因为内部
True
是1
,False
是0
,所以我们已经有了所需的0和1数组。现在我们可以应用
.cumsum
并得到最后一个条纹的长度。因为True
已经被当作1
处理,所以我们可以省略步骤.astype(int)
并直接调用(df['Close'].diff() <= 0).cumsum()
。jfgube3f2#
输出: