python 连续的绿色日子

pgpifvop  于 2023-03-06  发布在  Python
关注(0)|答案(2)|浏览(123)

我试图从一个数据框中找出某个日期之前连续的绿色收盘价的数量。
输入:

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)
ars1skjm

ars1skjm1#

@Quang Hoang Answer如果你想得到最长的连续时间的长度,可以使用。如果你想得到连续几天的当前连续时间的长度,可以使用以下方法:

df = pd.DataFrame({'Close' : [1.5, 1.2, 1.3, 1.3, 1.4, 1.5]})

streaks = (df['Close'].diff() <= 0).cumsum()
res = sum(streaks == streaks.iloc[-1]) - 1

**编辑:**如果您有日期在20200507之后的行,您可以这样修改:

df_subview = df[df['Date'] < 20200507]

**编辑2:**为什么使用df['Close'].diff() <= 0而不是df['Close'].diff() > 0

这就是我们想要达到的效果:

>>> streaks
0    0
1    1
2    1
3    2
4    2
5    2

有3连胜在这里发挥,第一个结束后,1。天,第二个结束后,第三天(指数2-3)和最后连胜去所有的方式结束。
为了实现这一点,我们需要一个在每次连输时都会上升的数字。我们可以在一个由0s1s组成的数组上使用.cumsum来实现这一行为。每次连输时,日期都应该标记为1
我们如何测试一条条纹是否断裂?通过与df['Close'].diff() > 0相反的操作,即df['Close'].diff() <= 0,得到以下结果:

>>> df['Close'].diff() <= 0
0    False
1     True
2    False
3     True
4    False
5    False
Name: Close, dtype: bool

因为内部True1False0,所以我们已经有了所需的0和1数组。

>>> (df['Close'].diff() <= 0).astype(int)
0    0
1    1
2    0
3    1
4    0
5    0
Name: Close, dtype: int64

现在我们可以应用.cumsum并得到最后一个条纹的长度。因为True已经被当作1处理,所以我们可以省略步骤.astype(int)并直接调用(df['Close'].diff() <= 0).cumsum()

jfgube3f

jfgube3f2#

df1['Close'].diff().gt(0)[::-1].cumprod().sum()

输出:

2

相关问题