我正在尝试按滚动窗口中的列计算数据的百分位数。
Android SDK Manager widget
我尝试使用.rolling和.apply,但我遗漏了一些东西。
Android SDK Manager widget
对于A栏,最终值将是2000-01-11至2000-01-20期间长度= 10窗口内的百分等级-0.909525。有什么想法吗?
答案 0 :(得分:6)
你的lambda收到一个numpy数组,它没有.rank
方法 - 它是pandas的Series
和DataFrame
。您可以将其更改为
pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]
或者你可以使用this SO answer:
的纯粹numpydef pctrank(x):
n = len(x)
temp = x.argsort()
ranks = np.empty(n)
ranks[temp] = (np.arange(n) + 1) / n
return ranks[-1]
答案 1 :(得分:1)
如果只需要最后一个观测值的等级,那么在滚动应用的情况下,您可以使用:
def pctrank(x):
i = x.argsort().argmax() + 1
n = len(x)
return i/n
时间大约是速度的两倍
答案 2 :(得分:0)
最简单的选择是执行以下操作: 从scipy进口统计 200是窗口大小
数据集[名称] =数据集[名称] .rolling(200).apply(lambda x:stats.percentileofscore(x,x [-1]))