Python 相当于 Excel 的 PERCENTILE.EXC

标签 python pandas statistics quantile

我正在使用 Pandas 计算一些财务风险分析,包括风险值(value)。简而言之,要计算风险值(value) (VaR),您需要一系列时间序列的模拟投资组合值(value)变化,然后计算特定的尾部百分位数损失。例如,95% VaR 是该时间序列中的第 5 个百分位数。

我在 Pandas 数据框中有我的时间序列,目前正在使用 pd.quantile() 函数来计算百分位数。 I () 作品。 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

谢谢,

瑞安

最佳答案

它不会像 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 对于较小的百分位数会失败;这不是错误。这是因为低于最小值的等级不适合插值。因此,您可能想在 quantile_exc 函数中检查 rank 是否 > 0(请参阅断言部分)。

关于Python 相当于 Excel 的 PERCENTILE.EXC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596100/

相关文章:

python - python中的多个TCP连接

python - 如何在python中比较2个json

python - 将当前行值与前一行值进行比较

perl - 如果我有 t 统计量和 d.f.,我如何计算 p 值? (在 Perl 中)?

python - Python 中的 Julia 映射切片功能等效

python - 使用 Pandas 合并excel表格

没有真实性验证的python ssh

python - 对 CSV Python 的嵌套 JSON 响应

python - 我在 pandas DataFrame 中有字符串索引,如何通过 startswith 选择?

R中的RMSE(均方根偏差)计算