连续绿日

2024-04-19 10:58:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在某个日期之前从数据框中找到连续绿色收盘价的数量

输入:

  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

下面是示例数据帧的代码

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)

Tags: 数据代码import示例pandasclose数量date
1条回答
网友
1楼 · 发布于 2024-04-19 10:58:20

如果你想知道最长连胜的长度,@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]

Edit2: 为什么是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

因为内部True是一个1False一个0我们已经有了所需的零和一数组

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

相关问题 更多 >