尝试在Python中匹配Excel PERCENTRANK公式

尝试在Python中匹配Excel PERCENTRANK公式,python,excel,pandas,scipy,Python,Excel,Pandas,Scipy,我正在尝试使用Python重现在Excel中得到的结果。Excel公式之一是2年滚动百分比排名。数据是每周频率。我正在寻找最新数据点的排名。 Excel公式如下所示。 =PERCENTRANK.INC('index'!P7:P110,'index'!P110,5) 使用Excel,我得到的值为.26213 使用Python,我得到一个.26923的值,这个值足够大,可以在下游进一步更改值 有人知道我如何匹配Excel计算和结果吗 这是我在Python中尝试过的: #python rollWind

我正在尝试使用Python重现在Excel中得到的结果。Excel公式之一是2年滚动百分比排名。数据是每周频率。我正在寻找最新数据点的排名。 Excel公式如下所示。
=PERCENTRANK.INC('index'!P7:P110,'index'!P110,5)

使用Excel,我得到的值为
.26213

使用Python,我得到一个
.26923
的值,这个值足够大,可以在下游进一步更改值

有人知道我如何匹配Excel计算和结果吗

这是我在Python中尝试过的:

#python
rollWindow = 104

example = pd.Series([100.0268, 98.6107, 96.8536, 96.9045, 95.7169, 95.0132, 95.716, 95.7043, 95.6948, 96.9666, 97.6367, 97.4099, 96.3846, 95.5558, 95.2478, 94.5487, 95.295, 94.2901, 94.3517, 95.6225, 94.81, 93.915, 91.6883, 91.5727, 91.6745, 90.3186, 89.9786, 88.6776, 86.9716, 85.4051, 86.3174, 86.2327, 87.2157, 85.8357, 87.0657, 86.9309, 84.5083, 84.0628, 81.5965, 81.7031, 79.3157, 80.8909, 80.5395, 81.56, 80.5344, 82.2279, 81.3875, 80.6736, 82.5171, 83.4307, 82.1976, 80.809, 79.7344, 79.5829, 78.7555, 79.2864, 80.4945, 80.0812, 79.9429, 80.97, 82.1083, 82.1985, 83.0025, 82.1122, 83.9145, 84.4257, 82.2824, 81.596, 81.1486, 81.0595, 80.0349, 80.6402, 81.555, 79.7871, 78.9343, 79.3772, 78.0532, 76.942, 75.5564, 74.6491, 74.6702, 73.9801, 73.7626, 72.6968, 73.4371, 72.5184, 73.6416, 72.7711, 73.1224, 75.8298, 75.5966, 73.3623, 73.4183, 74.033, 73.7934, 74.6728, 76.1003, 76.5892, 76.2145, 77.1619, 77.9082, 78.201, 78.1049, 78.2039])
'''

使用Pandas.rank我得到
.26923

python
def my_rank(x):
   return pd.Series(x).rank(pct=True).iloc[-1]
percentrank = example.rolling(rollWindow).apply(my_rank, raw=False)
python
pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]
percentrank3 = example.rolling(window=rollWindow, center=False).apply(pctrank, raw=True)
再试一次,以另一种方式(不是真的)得到
.26923

python
def my_rank(x):
   return pd.Series(x).rank(pct=True).iloc[-1]
percentrank = example.rolling(rollWindow).apply(my_rank, raw=False)
python
pctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]
percentrank3 = example.rolling(window=rollWindow, center=False).apply(pctrank, raw=True)
使用SciPy.Stats我得到
.2692308

python
def set_rank(x):
    return stats.percentileofscore(x,x[-1])
percentrank = example.rolling(rollWindow).apply(set_rank, raw=True)

谢谢你的关注

我对Excel的Percentrank函数不是很熟悉,但看起来您可以使用以下方法获得相同的结果:

def percent_rank(pd_series, value, precision):
    return np.round((pd_series < value).astype(int).sum()/(len(pd_series) -1), precision) 
def百分比秩(pd_系列、值、精度):
返回np.round((pd_系列
如果您对一次获取所有值感兴趣(即每个值在您的范围内的位置):

def百分比等级(pd系列,精度):
对于pd_系列中的值,返回[np.round((pd_系列<值).astype(int).sum()/(len(pd_系列)-1),精度]

希望有帮助

我对Excel的Percentrank函数不是很熟悉,但看起来您可以使用以下方法获得相同的结果:

def percent_rank(pd_series, value, precision):
    return np.round((pd_series < value).astype(int).sum()/(len(pd_series) -1), precision) 
def百分比秩(pd_系列、值、精度):
返回np.round((pd_系列
如果您对一次获取所有值感兴趣(即每个值在您的范围内的位置):

def百分比等级(pd系列,精度):
对于pd_系列中的值,返回[np.round((pd_系列<值).astype(int).sum()/(len(pd_系列)-1),精度]

希望有帮助

哇,就是这样!我替换了重新运行的函数,它完全匹配。非常感谢分享您的代码!哇,就是这样!我替换了重新运行的函数,它完全匹配。非常感谢分享您的代码!