如何对pandas dataframe执行蒙特卡洛模拟计算预测值≤0的概率并新增列
实现方案
你可以用numpy的向量化操作实现高性能的蒙特卡洛模拟,完全满足可扩展需求,即使数据量很大也能快速跑完:
步骤1:导入依赖库
import pandas as pd import numpy as np
步骤2:执行模拟计算
# 构造示例DataFrame d = {'Name': ['Jim', 'Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim', 'Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim','Jim'], 'Predict': [2.901826509,3.212149337,2.388237651,3.744206058,1.944415024,2.719441794,2.543629608,3.264809759,3.661189232,2.509445492,4.784738653,3.305165944,4.03919276,2.708492579,3.172120051, 1.774120629,4.40550619,2.426048696,3.767313548,4.108914912,3.198379034,4.078331863,3.652025]} df = pd.DataFrame(data=d) df['Mean'] = 4 df['StDev'] = 6 # 定义模拟次数 n_sim = 10000 # 固定随机种子可复现结果,不需要可以删除 np.random.seed(123) # 一次性生成所有样本,形状为(行数, 模拟次数),完全对应Excel的NORM.INV逻辑 samples = np.random.normal( loc=df['Predict'].values.reshape(-1, 1), scale=df['StDev'].values.reshape(-1, 1), size=(len(df), n_sim) ) # 计算每行样本<=0的比例,作为新列追加到原表 df['prob_le_0'] = (samples <= 0).mean(axis=1)
可选:精确概率计算(无需模拟)
如果不需要模拟过程,只需要最终概率结果,可以直接用正态分布累积分布函数计算精确值,速度比模拟更快、结果更准:
from scipy.stats import norm df['exact_prob_le_0'] = norm.cdf(0, loc=df['Predict'], scale=df['StDev'])
内容的提问来源于stack exchange,提问作者SOK
相关产品推荐
相关产品推荐

