熊猫滚动百分位等级

时间:2016-08-09 16:57:57

标签: python pandas apply rank percentile

我正在尝试按滚动窗口中的列计算数据的百分位数。

Android SDK Manager widget

我尝试使用.rolling和.apply,但我遗漏了一些东西。

Android SDK Manager widget

对于A栏,最终值将是2000-01-11至2000-01-20期间长度= 10窗口内的百分等级-0.909525。有什么想法吗?

3 个答案:

答案 0 :(得分:6)

你的lambda收到一个numpy数组,它没有.rank方法 - 它是pandas的SeriesDataFrame。您可以将其更改为

pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]

或者你可以使用this SO answer

的纯粹numpy
def 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]))