我正在尝试使用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代码来实现这一点。
如何才能做到这一点?
1条答案
按热度按时间66bbxpm51#
With the following toy dataframe (an extended version of yours):
Here is one way to do it with Pandas rolling and interpolate :
Then: