Python:计算列中每个值有效的概率

Python:计算列中每个值有效的概率,python,pandas,statistics,probability,Python,Pandas,Statistics,Probability,我有这样一个熊猫数据框: +-----+----------+ | No | quantity | +-----+----------+ | 1 | 100.0 | | 2 | 102.3 | | 3 | 301.2 | | 4 | 100.6 | | 5 | 120.9 | | ... | ... | +-----+----------+ +-----+----------+--------+ | No | quantity |

我有这样一个熊猫数据框:

+-----+----------+
| No  | quantity |
+-----+----------+
|   1 |    100.0 |
|   2 |    102.3 |
|   3 |    301.2 |
|   4 |    100.6 |
|   5 |    120.9 |
| ... |      ... |
+-----+----------+
+-----+----------+--------+
| No  | quantity |  prob  |
+-----+----------+--------+
|   1 |    100.0 | 99,85% |
|   2 |    102.3 | 99,81% |
|   3 |    301.2 | 00,00% |
|   4 |    100.6 | 99,90% |
|   5 |    120.9 | 74,30% |
| ... |      ... | ...    |
+-----+----------+--------+
我如何计算每个值适合数据集的概率(在dataframe中,除第3项外,其他都适用)。其思想是使用标准化正态分布并计算出现某个值(或更极端值)的概率。在这种情况下,3号出现的概率几乎为零,因为它远离所有其他值

我知道如何在纸上为每个值执行此操作:

  • 计算z分数

  • 在标准正态概率表中找到相应的值

  • 如果值低于分布的平均值,则概率为1-概率

  • 所以期望的输出是这样的:

    +-----+----------+
    | No  | quantity |
    +-----+----------+
    |   1 |    100.0 |
    |   2 |    102.3 |
    |   3 |    301.2 |
    |   4 |    100.6 |
    |   5 |    120.9 |
    | ... |      ... |
    +-----+----------+
    
    +-----+----------+--------+
    | No  | quantity |  prob  |
    +-----+----------+--------+
    |   1 |    100.0 | 99,85% |
    |   2 |    102.3 | 99,81% |
    |   3 |    301.2 | 00,00% |
    |   4 |    100.6 | 99,90% |
    |   5 |    120.9 | 74,30% |
    | ... |      ... | ...    |
    +-----+----------+--------+
    
    我如何在python中实现这一点


    谢谢:)

    发现我的错误,这是我问题的答案:

    df= pd.DataFrame(columns=['No','quantity'], data=[[1,100.0],[2,102.3],[3,301.3],[4,101.3],[5,101.3],[6,120.3]])
    
    df['z'] = (df.quantity - df.quantity.mean())/df.quantity.std(ddof=0)
    mu = np.mean(df.quantity)
    sig = df.quantity.std()
    df['prob'] = 0.0
    
    for idx,row in df.iterrows():
        if row.quantity < mu:
            df.at[idx,'prob'] = 1 - (scipy.stats.norm(mu,sig).pdf(row.quantity))
        else:
            df.at[idx,'prob'] = scipy.stats.norm(mu, sig).pdf(row.quantity)
    

    对您的解决方案的一些评论:如果您已经在使用scipy,您可以使用而不是编写自己的zscore计算,并且无需导入numpy来计算系列的平均值:

    df= pd.DataFrame(columns=['No','quantity'], data=[[1,100.0],[2,102.3],[3,301.3],[4,101.3],[5,101.3],[6,120.3]])
    mu=df.quantity.mean()
    sig=df.quantity.std()
    df['z']=scipy.stats.mstats.zscore(df.quantity)
    df['prob'] = 0.0
    
    for idx,row in df.iterrows():
        if row.quantity < mu:
            df.at[idx,'prob'] = 1 - (scipy.stats.norm(mu,sig).pdf(row.quantity))
        else:
            df.at[idx,'prob'] = scipy.stats.norm(mu, sig).pdf(row.quantity)
    

    标准差的数量不是一个更有用的衡量标准吗?你能告诉我们你已经尝试了什么吗?谢谢你的建议。我写了自己的z分数计算,因为我想用中位数(或模式)代替平均值。在原始数据帧中,存在大量异常值,它们以负面方式影响结果。你觉得怎么样?:)@MaMo你介意分享你的代码吗?