我有一个像这样的pandas数据框:
+-----+----------+
| No | quantity |
+-----+----------+
| 1 | 100.0 |
| 2 | 102.3 |
| 3 | 301.2 |
| 4 | 100.6 |
| 5 | 120.9 |
| ... | ... |
+-----+----------+
如何计算它适合数据集的每个值的概率(除了No.3之外,在数据帧中除此之外都是如此)。这个想法是使用标准化的正态分布并计算出一个值(或更极端的值)的概率。在这种情况下,No.3发生的概率几乎为零,因为它远离所有其他值。
我知道如何在纸上为每个值执行此操作:
计算z-score
在标准普通概率表
如果值低于分布的平均值,则概率为1-probability
所以期望的输出是这样的:
+-----+----------+--------+
| 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中实现?
谢谢:)
答案 0 :(得分:2)
对你的解决方案的一些评论:如果你已经使用了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))
答案 1 :(得分:-1)
发现我的错误,这是我的问题的答案:
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