Python:计算列中每个值的有效概率[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:计算列中每个值的有效概率[关闭]相关的知识,希望对你有一定的参考价值。

我有一个像这样的pandas数据帧:

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

如何计算它适合数据集的每个值的概率(除了No.3之外,在数据帧中除此之外都是如此)。这个想法是使用标准化的正态分布并计算出一个值(或更极端的值)的概率。在这种情况下,No.3发生的概率几乎为零,因为它远离所有其他值。

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

  1. 计算z得分
  2. 在标准正常概率表中找到相应的值
  3. 如果值低于分布的平均值,则概率为1概率

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

+-----+----------+--------+
| 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中实现呢?

谢谢 :)

答案

关于你的解决方案的一些评论:如果你已经使用了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避免对数据框进行迭代:

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']=df['quantity'].apply(lambda x: scipy.stats.norm(mu,sig).pdf(x) if x > mu else 1 - scipy.stats.norm(mu,sig).pdf(x))
另一答案

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

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)

输出是:

   No  quantity         z      prob
0   1     100.0 -0.513775  0.995560
1   2     102.3 -0.482472  0.995502
2   3     301.3  2.225906  0.000629
3   4     101.3 -0.496082  0.995527
4   5     101.3 -0.496082  0.995527
5   6     120.3 -0.237493  0.995159

以上是关于Python:计算列中每个值的有效概率[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

查询与 Hive QL 中另一列中的每个值关联的最短字符串值的更有效方法

用于计算同一列的值百分比的 SQL [关闭]

熊猫计算列中每个值的出现次数

计算熊猫列中每个唯一值的数量[重复]

有没有一种更有效的方法来枚举python或R中离散随机变量的每个可能结果的概率?

如何有效地计算另一列中每个元素的较大元素的数量?