这是我的数据集,其中索引为日期和价格列。我想在这里创建一个列参数(param),如下面的注释列中所示:
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
有人可以告诉我在熊猫中实现这一目标的优雅方式吗?
答案 0 :(得分:1)
您在此处搜索的内容,根据您的评论部分,我的理解是param
列实际上是我们获得Price
列的值的排名。这类似于查找作为输入的整数流中的特定值的等级。这可以使用PriorityQueue实现。您需要使用比较器创建优先级队列,该比较器将按优先级值的递增顺序将元素存储在优先级队列中。要查找排名,您只需要遍历队列并找到列中最近元素的索引。然而,这将花费O(n)时间来找到元素索引。查看以下python文档,了解如何在python中创建heapq或优先级队列:
如果要在O(logn)中执行此操作,可以使用自平衡BST,如AVL或红黑树。最近输入的元素的值的等级将是从左侧开始的索引。在最坏的情况下,这可以在O(logn)时间内完成。 python中AVL的详细信息:
答案 1 :(得分:0)
你想要的是对偏移进行分组和排名。熊猫拥有所有这些。
这是一个有效的线性解决方案:
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)
对于:
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
我创建了很多列进行解释,如果需要,可以删除它们。