接收可变长度参数的条件概率函数

xiaoxingxing python 189

原文标题conditinal probabilty function that receieves variable length arguments

我有这个数据框 df :

    A  B  C
0   0  1  0
1   0  1  1
2   0  1  1
3   1  0  1
4   0  0  0
5   1  0  0
6   0  0  0
7   0  0  1
8   1  0  0
9   0  0  0
10  1  0  1
11  1  0  1
12  0  1  1
13  1  0  0
14  1  0  0
15  0  1  0
16  1  1  0
17  0  0  1
18  1  0  1
19  1  0  0
20  1  0  1
21  1  1  0
22  1  1  1
23  1  1  1
24  1  0  0
25  1  1  0
26  0  0  1
27  0  1  1
28  0  1  0
29  1  1  0
30  1  0  1
31  0  1  0
32  0  0  1
33  1  1  1
34  0  1  0
35  1  1  0
36  0  1  0
37  0  0  1
38  0  1  1
39  0  1  1

我得到了联合概率 P(A,B,C) :

grp = df.apply(tuple, axis=1)
PrD=pd.concat([df.groupby(grp).first(),
           grp.groupby(grp).count().div(len(df)).rename("Probs")],
          axis=1).reset_index(drop=True)
print (PrD)

它输出联合概率 P(A,B,C)

   A  B  C  Probs
0  0  0  0  0.075
1  0  0  1  0.125
2  0  1  0  0.150
3  0  1  1  0.150
4  1  0  0  0.150
5  1  0  1  0.150
6  1  1  0  0.125
7  1  1  1  0.075

我正在尝试编写一个函数,它接收 PrD 的列名子集并计算遵循规则 P(A|B)= P(A,B)/P(B) 的条件概率,如果它接收到 3 个变量: P(A|B,C)=P(A,B,C)/P(B,C) 如果它接收到 4 个变量: P(A|B,C,D) =P(A,B,C,D )/P(B,C,D) 等等。例如,如果函数接收到 P(A=0|B=0),则输出应通过(0.075+0.125)/(0.075+0.125+0.150+0.150) = 0.2计算,其中分子是当 A 和 B = 0 时分母是 B =0 并且如果它接收到一个变量 A=0 例如,它返回 (0.075+0.125+0.150+0.150 ) 仅在 A=0 我尝试过的行loc and query但它们只接收一个变量而不是多个变量我想要一个函数根据接收到的任何数量的变量进行计算

原文链接:https://stackoverflow.com//questions/71685819/conditinal-probabilty-function-that-receieves-variable-length-arguments

回复

我来回复
  • Code Different的头像
    Code Different 评论

    你在电脑上做数学,这意味着应该做一些不同的事情。

    您不需要建立联合概率表等。您可以计算A = 0A and B = 0有多少行并将两者相除:

    def prob(df, a, *cols):
        """Return the probability that all columns in `cols` are 0 given column `a` is 0
        """
        if len(cols) == 0:
            return df[a].eq(0).sum() / len(df)
        else:
            return df[[a] + list(cols)].eq(0).all(axis=1).sum() / df[list(cols)].eq(0).sum()
    

    用法:

    prob(df, "A", "B")      # 0.4
    prob(df, "A", "B", "C") # 0.15
    
    2年前 0条评论