如何对Pandas实施第三纳尔逊法则?

uqjltbpv  于 2022-12-09  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在尝试使用Pandas实现Nelson's rules。其中一个让我很伤心,具体来说是第3个:

使用一些示例数据:
data = pd.DataFrame({"values":[1,2,3,4,5,6,7,5,6,5,3]})
| | 价值观|
| - -|- -|
| 第0页|一个|
| 一个|2个|
| 2个|三个|
| 三个|四个|
| 四个|五个|
| 五个|六个|
| 六个|七个|
| 七个|五个|
| 八个|六个|
| 九个|五个|
| 10个|三个|
我的第一种方法是使用滚动窗口来检查它们是否在diff()>0范围内/随diff()>0减少,并使用此方法来确定规则的“命中”:
(data.diff()>0).rolling(6).sum()==6
这会正确识别结束值(1=True,0=False):
| | 价值观|正确/期望|
| - -|- -|- -|
| 第0页|第0页|第0页|
| 一个|第0页|一个|
| 2个|第0页|一个|
| 三个|第0页|一个|
| 四个|第0页|一个|
| 五个|第0页|一个|
| 六个|一个|一个|
| 七个|第0页|第0页|
| 八个|第0页|第0页|
| 九个|第0页|第0页|
| 10个|第0页|第0页|
由于滚动是一种向后看的方式,所以这会遗漏第一个点(这是运行的一部分)。鉴于此规则要求一行中有6个点,我实际上需要对一个给定的点计算它可能落入的6个窗口,然后如果它是点连续进入/减少的任何窗口的一部分,则将其标记为真。
我可以想到如何使用iterrows()apply的一些自定义Python代码来实现这一点。
如何才能做到这一点?

66bbxpm5

66bbxpm51#

With the following toy dataframe (an extended version of yours):

import pandas as pd

df = pd.DataFrame({"values": [1, 2, 3, 4, 5, 6, 7, 5, 6, 5, 3, 11, 12, 13, 14, 15, 16, 4, 3, 8, 9, 10, 2]})

Here is one way to do it with Pandas rolling and interpolate :

# Find consecutive values
df["check"] = (df.diff() > 0).rolling(6).sum()
df["check"] = df["check"].mask(df["check"] < 6).mask(df["check"] >= 6, 1)

# Mark values
df = df.interpolate(limit_direction="backward", limit=5).fillna(0)

Then:

print(df)
# Output
    values  check
0        1      0
1        2      1
2        3      1
3        4      1
4        5      1
5        6      1
6        7      1
7        5      0
8        6      0
9        5      0
10       3      0
11      11      1
12      12      1
13      13      1
14      14      1
15      15      1
16      16      1
17       4      0
18       3      0
19       8      0
20       9      0
21      10      0
22       2      0

相关问题