看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
这是一个经典的概率问题:天气预报说,在今后的三天中,每一天下雨的概率均为40%,请问这三天中恰有两天下雨的概率是多少?这个问题不能用古典概型来求解,因为恰有一天下雨和恰有两天下雨的可能性不一样,不符合古典概型的要求。那么怎么用 Python 来模拟这种 40% 的概率和三天中两天下雨的情况呢?可以用代码随机产生 0 ~ 9 之间的整数随机数,用 1、2、3、4 表示下雨,用 5、6、7、8、9、0 表示不下雨。
由于以三天为一组,所以我们每次生成一个三位的数字串。用 NumPy 生成随机值(控制在三位数字),由于百位以内不够三位,我们用 zfill 在前面补 0,就实现了一次生成三天的情况。然后计算这些数字字符中 1 ~ 4(意为下雨)的数量,筛选值为 2(意为两天下雨)的数据,最后与总数据量(天数)相比得到结果。
思考 1: 能否用古典概型来求解,为什么?
不能,恰有一天下雨和恰有两天下雨的可能性不一样,不符合古典概型。
思考 2: 你如何模拟每一天下雨为40%的概率?
可以用计算机产生 0 到 9 之间的整数随机数,用 1,2,3, 4 表示下雨,用 5,6,7,8,9, 0 表示不下雨。
思考3: 试验时,用什么数来表示三天中下雨这一事件?
因为是3天,所以每三个随机数作为一组
用 Numpy 生成随机值(控制在三位数字),由于百位以内不够三位,我们用 zfill 对前边补 0,就实现了一次生成三天的情况。然后计算这些数字字符中 1-4(意为下雨)的数量,筛选值为 2 (意为两天下雨)的数据,最后与总数据量相比得到结果。
import pandas as pd
import numpy as np
rng = np.random.default_rng()
days = 100000
arr = rng.integers(0, 1000, days)
(
pd.DataFrame()
.assign(x=arr)
.astype(str)
.assign(x=lambda d: d.x.str.zfill(3))
.assign(a=lambda d: d.x.str.count(r'1|2|3|4'))
.query('a==2')
)
'''
x a
3 923 2
9 325 2
19 130 2
22 381 2
28 339 2
... ... ..
99975 474 2
99977 523 2
99978 484 2
99988 532 2
99989 722 2
[28570 rows x 2 columns]
'''
len(_)/days
# 0.28652
验证一下:
先在三天里面选下雨的两天即C3(2)=3
有两天下雨一天不下的概率=0.4x0.4x0.6=0.096
这三天中恰好有两天下雨的概率=0.096x3=0.288
3*0.4*0.4*0.6
# 0.28800000000000003
因此得到近似正确结果。
(完)
注:此案例收录在《深入浅出Pandas:利用Python进行数据处理与分析》17.2.10 小节。
更新时间:2024-08-18 16:29:56 标签:pandas numpy python 概率