pandas Excel的PERCENTILE.EXC的Python等价物

uinbv5nw  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(97)

我正在使用Pandas计算一些金融风险分析,包括风险价值。简而言之,为了计算风险价值(VaR),你需要一个模拟投资组合价值变化的时间序列,然后计算一个特定的尾部百分比损失。例如,95% VaR是该时间序列中的第5个百分位数。
我在Pandas数据框中有我的时间序列,目前正在使用pd.quantile()函数来计算百分位数。我的问题是,VaR的典型市场惯例是使用排除百分比(即:95%VaR解释为:有95%的机会您的投资组合不会损失超过计算出的数字)-类似于MS Excel PERECENTILE.EXC()的工作方式。Pandas quantile()的工作方式类似于Excel的PERCENTILE.INC()的工作方式-它包括指定的百分位数。我已经搜索了几个python数学软件包以及这个论坛,寻找一个python解决方案,它使用与Excel中的PERCENTILE.EXC()相同的方法,但没有运气。我希望有人能给我个建议
下面是示例代码。

import pandas as pd
import numpy as np

test_pd = pd.Series([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])
test_np = np.array([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])

print 'pandas: ' + str(test_pd.quantile(.05))
print 'numpy: '+ str(np.percentile(test_np,5))

我要找的答案是-77.4
谢谢
莱恩

but5z9lq

but5z9lq1#

它不会像Pandas自己的百分位那么有效,但它应该可以工作:

def quantile_exc(ser, q):
    ser_sorted = ser.sort_values()
    rank = q * (len(ser) + 1) - 1
    assert rank > 0, 'quantile is too small'
    rank_l = int(rank)
    return ser_sorted.iat[rank_l] + (ser_sorted.iat[rank_l + 1] - 
                                     ser_sorted.iat[rank_l]) * (rank - rank_l)

ser = pd.Series([15,14,18,-2,6,-78,31,21,98,-54,-2,-36,5,2,46,-72,3,-2,7,9,34])

quantile_exc(ser, 0.05)
Out: -77.400000000000006

quantile_exc(ser, 0.1)
Out: -68.399999999999991

quantile_exc(ser, 0.3)
Out: -2.0

请注意,对于小百分位数,Excel失败;它不是一个bug。这是因为低于最小值的等级不适合插值。因此,您可能需要检查quantile_exc函数中的rank是否> 0(参见Assert部分)。

cu6pst1q

cu6pst1q2#

编辑:我刚看到你的编辑。我认为你在犯一个错误。值-77.4实际上是数据的99.5%。试试test_pd.quantile(.005)我相信你一定是在Excel中指定百分位数时犯了一个错误。
编辑2:我刚刚在Excel中自己测试了一下。对于第50个百分位数,我在Excel和Numpy/Pandas中都得到了正确的值。然而,对于第五个百分位数,我在Pandas/Numpy中得到-72,在Excel中得到-74.6。但Excel在这里是错误的:很明显-74.6是0.5个百分点,而不是第5个...
最终编辑:经过一些测试,Excel似乎在PERCENTILE.EXC()函数的k值非常小的情况下表现不稳定。实际上,使用任何k < 0.05的函数都会返回错误,因此0.05必须是函数无法正常工作的阈值。我不知道为什么Excel在被要求排除第5个百分位数时选择返回第0.5个百分位数(逻辑行为将返回第4.9个百分位数,或第4.99个...)。然而,Numpy、Pandas和Excel对于其他k值都返回相同的值。例如PERCENTILE.EXC(0.5) = 6test_pd.quantile(0.5) = 6。我想这一教训是我们需要警惕Excel的行为;).
我对你问题的理解是:你想知道对应于你的数据的第k个百分位数的值,这个第k个百分位数被排除在外。但是,pd.quantile()返回与您的第k个百分位数对应的值,包括第k个百分位数。
我不认为pd.quantile()返回包含的第k个百分位数是一个问题。事实上,假设你希望所有股票的风险价值严格高于第5个百分点,你会这样做:

mask = data["VaR"] < pd.quantile(data["VaR"], 0.05)
data_filt = data[mask]

因为您使用了“小于”(<)运算符,所以与第5个百分位数完全对应的值将被排除,类似于Excel的PERCENTILE.EXC()函数。
告诉我这是不是你要找的东西。

3duebb1j

3duebb1j3#

在最初的问题被问到几年后,我不得不构建一个pandas脚本来复制/简化/检查复杂的数组公式。以下是我的想法
假设你想要百分之九十的
EXC是第0.9(n+1)个值
PERCENTILE.INC是第0.9(n-1)+1个值
PERCENTILE.EXC将适用于9个或更多条目。默认情况下,Pandas将使用PERCENTILE.INC等效文件,即df.分位数(0.9)。
如果你想复制这两个函数,使用numpy
np.百分位数(x,90,method ='linear')--->百分位数增加
np.百分位数(x,90,method ='weibull')--->百分位数
更改号码以满足您的需要。
问候

相关问题