首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算大熊猫的高低值

计算大熊猫的高低值
EN

Stack Overflow用户
提问于 2017-07-11 21:16:15
回答 2查看 678关注 0票数 1

这是我的数据集,索引作为日期和价格列。我想在这里创建一个列参数(Param),如注释列中所示:

代码语言:javascript
复制
 Index          Price   |   param            Comments (P is Price)
1989-01-24      68.800      0               P <  P-1 (P-1 doesnt exist so 0)
                                            param = 0 , 

1989-01-25      68.620     -2               P < P-1 check P<P-2(P-2 doesnt 
                                            exist so P is a 2 day low and 
                                            param = -2 

1989-01-26      68.930      3               P > P-1, P>P-2, P-3(doesnt exist
                                            So P is a 3 day high, param =3 


1989-01-27      68.9900     4               P > P-1 > P-2 > P -3 and hence a 
                                            4 day high, param = 4                                            

1989-01-30      69.11       5               P > P-1> P-2 > P-3 > P-4 and 
                                            hence a 5 day high, param = 5

1989-01-31      69.070     -2               P < P-1 > P-2 and hence a 2 day 
                                            low, param = -2 

谁能告诉我一个在熊猫身上实现这个目标的优雅方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-11 23:16:00

您在这里搜索的内容,根据您的注释部分,我的理解是,param列实际上是我们得到的Price列的值的级别。这类似于在作为输入的整数流中查找特定值的秩。这可以使用PriorityQueue来实现。您需要使用比较器创建一个优先级队列,该比较器将按其值的递增顺序存储优先级队列中的元素。要查找排名,只需在队列中迭代,并在列中找到最近元素的索引。然而,这需要O(n)时间来查找元素索引。请在python下面查看有关如何在python中创建heapq或优先级队列的文档:

巨蟒中的HeapQ

如果您想在O(logn)中这样做,您可以使用自平衡BST,如AVL或红色黑树。然后,最近输入的元素的值的等级将是其左侧的索引。在最坏的情况下,这可以在O(logn)时间内完成。python中AVL的详细信息:

使用python的AVL树

票数 1
EN

Stack Overflow用户

发布于 2017-07-12 17:02:35

你想要的是用偏移进行分组和排序。所有这些都包括熊猫。

这里有一个有效的线性解决方案:

代码语言:javascript
复制
df=pd.DataFrame({'price':rand(15)})
df['ascending']=df.price<df.price.shift()
df['slope']=(-1)**df.ascending
df['group']=df.ascending.diff().abs().cumsum()
df['pseudorank']=df.slope.cumsum()
offset=df.groupby('group',sort=False).pseudorank.first()
df['param']=(df.pseudorank-df.join(offset,'group',lsuffix='old').pseudorank+2*df.slope)
df.param=df.param.fillna(0).astype(int)

适用于:

代码语言:javascript
复制
       price ascending  slope group  pseudorank  param
0   0.160806     False      1   NaN           1      0
1   0.068664      True     -1     1           0     -2
2   0.663227     False      1     2           1      2
3   0.273134      True     -1     3           0     -2
4   0.610329     False      1     4           1      2
5   0.595016      True     -1     5           0     -2
6   0.975163     False      1     6           1      2
7   0.692874      True     -1     7           0     -2
8   0.682642      True     -1     7          -1     -3
9   0.337418      True     -1     7          -2     -4
10  0.307546      True     -1     7          -3     -5
11  0.462594     False      1     8          -2      2
12  0.304216      True     -1     9          -3     -2
13  0.189434      True     -1     9          -4     -3
14  0.865468     False      1    10          -3      2

我创建了很多列来解释,如果你愿意的话,你可以删除它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45044601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档