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

2024-05-09 08:28:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个pandas数据帧:

+-----+----------+
| No  | quantity |
+-----+----------+
|   1 |    100.0 |
|   2 |    102.3 |
|   3 |    301.2 |
|   4 |    100.6 |
|   5 |    120.9 |
| ... |      ... |
+-----+----------+

我如何计算每个值在数据集中的概率(在数据帧中,除了第3个数据帧之外,其他的都是这样)。这个想法是使用标准正态分布,计算一个值(或更极端的)发生的概率。在这种情况下,3号发生的概率几乎为零,因为它与所有其他值相差甚远。在

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

  1. 计算z分数

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

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

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

^{pr2}$

如何在python中实现这一点?在

谢谢:)


Tags: 数据nopandas标准情况概率分数quantity
2条回答

找到我的错误,这是我问题的答案:

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)

输出为:

^{pr2}$

关于您的解决方案的一些意见:如果您已经在使用scipy,那么您可以使用scipy.stats.mstats.zscore而不是编写自己的zscore计算,并且不需要导入numpy来计算pandas系列的平均值:

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)

您还可以使用apply避免在数据帧上进行迭代:

^{pr2}$

相关问题 更多 >