亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

嘗試在 Python 中匹配 Excel PERCENTRANK 公式

嘗試在 Python 中匹配 Excel PERCENTRANK 公式

皈依舞 2022-07-26 16:16:37
我正在嘗試使用 Python 來重現我在 Excel 中獲得的結果。Excel 公式之一是 2 年滾動百分比排名。數據是每周頻率。我正在尋找最新數據點的排名。Excel 公式如下所示。 =PERCENTRANK.INC('Indices'!P7:P110,'Indices'!P110, 5)使用 Excel,我得到一個值.26213使用 Python,我得到了一個.26923足夠重要的值,可以進一步改變下游的值有誰知道我如何匹配 Excel 計算和結果?這是我在 Python 中嘗試過的:#pythonrollWindow = 104example = 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 我得到.26923pythondef my_rank(x):   return pd.Series(x).rank(pct=True).iloc[-1]percentrank = example.rolling(rollWindow).apply(my_rank, raw=False)再試一次,我得到了不同的方式(不是真的).26923pythonpctrank = lambda x: pd.Series(x).rank(pct=True).iloc[-1]percentrank3 = example.rolling(window=rollWindow, center=False).apply(pctrank, raw=True)使用 SciPy.Stats 我得到.2692308pythondef set_rank(x):    return stats.percentileofscore(x,x[-1])percentrank = example.rolling(rollWindow).apply(set_rank, raw=True)感謝您的關注!
查看完整描述

2 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

我對 Excel 的 Percentrank 函數不是很熟悉,但看起來您可以使用以下方法獲得相同的結果:

def percent_rank(pd_series, value, precision):
    return np.round((pd_series < value).astype(int).sum()/(len(pd_series) -1), precision)

如果您有興趣一次獲取所有值(即每個值在您的范圍內的位置):

def percent_rank(pd_series, precision):
    return [np.round((pd_series< value).astype(int).sum()/(len(pd_series) -1), precision) for value in pd_series]

希望有幫助!


查看完整回答
反對 回復 2022-07-26
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

這是一個處理原始數組中不存在的重復項和值的版本:


def percent_rank(arr, score, sig_digits=8):

    arr = np.asarray(arr)

    arr = np.round(arr, sig_digits)

    score = np.round(score, sig_digits)

    if score in arr:

        small = (arr < score).sum()

        return small / (len(arr) - 1)

    else:

        if score < arr.min():

            return 0

        elif score > arr.max():

            return 1

        else:

            arr = np.sort(arr)

            position = np.searchsorted(arr, score)

            small = arr[position - 1]

            large = arr[position]

            small_rank = ((arr < score).sum() - 1) / (len(arr) - 1)

            large_rank = ((arr < large).sum()) / (len(arr) - 1)

            step = (score - small) / (large - small)

            rank = small_rank + step * (large_rank - small_rank)

            return rank

Excel 文檔中的示例:

公式描述結果
=PERCENTRANK.INC(A2:A11,2)2 在 A2:A11 范圍內的百分比等級(0.333,因為集合中的 3 個值小于 2,6 個大于 2;3/(3+6)=0.333)。0.333
=PERCENTRANK.INC(A2:A11,4)A2:A11 范圍內 4 的百分比等級。0.555
=PERCENTRANK.INC(A2:A11,8)A2:A11 范圍內 8 的百分比排名0.666
=PERCENTRANK.INC(A2:A11,5)在 A2:A11 范圍內排名 5 的百分比(0.583,介于 4 的 PERCENTRANK.INC 和 8 的 PERCENTRANK.INC 之間的四分之一)。0.583

與函數的輸出相匹配

分數公式結果
2百分比排名(arr,2)0.333
4百分比排名(arr,4)0.556
8百分比排名(arr,8)0.667
5百分比排名(arr,5)0.583


查看完整回答
反對 回復 2022-07-26
  • 2 回答
  • 0 關注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號