我一直致力于创建一个montecarlo模拟,它将遍历我的数据帧的每个ID,并得出它们各自的平均值和标准差。我已经能够为任何一个ID编写代码来获取它,但是不能遍历dataframe中的整个ID列表。所以我可以单独编写每一行,但是我需要代码来遍历任何可变的id列表。在
在这里,我尝试创建一个列表列表,其中可以存储每组montecarlo观测值(并且可以从中获取平均值和std)。我不相信这将是最有效的编码方式,但这是我目前所知道的。有没有必要对每个id运行montecarlo模拟(而不是专门调用每个id)?我需要能够从列表中添加和删除各种ID和相应的数据。在
以下是后续内容:Utilizing Monte Carlo to Predict Revenue in Python
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
ID = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Revenue = [1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800, 1000, 1200, 1300, 100 ,500, 0, 800, 950, 4321, 800]
odds = [0.5, 0.6, 0.33, 0.1, 0.9, 0.87, 0.37, 0.55, 0.97, 0.09, 0.5, 0.6, 0.33, 0.1, 0.9, 0.87, 0.37, 0.55, 0.97, 0.09]
d = {'ID': ID, 'Revenue': Revenue, 'Odds': odds}
df = pd.DataFrame(d)
df['Expected Value'] = df['Revenue']*df['Odds']
print(df)
num_samples = 100
df['Random Number'] = np.random.rand(len(df))
def monte_carlo_array(df):
for _ in range(len(df)):
yield []
mc_arrays = list(monte_carlo_array(df))
# Fill each list with 100 observations (no filtering necessary)
id_1 = []
filter_1 = (df['ID'] == 5)
for _ in range(num_samples):
sample = df['Revenue'] * np.where(np.random.rand(len(df)) < \
df['Odds'], 1, 0)
for l in monte_carlo_array(df):
for i in l:
mc_arrays[i].append(sample.sum())
id_1.append(sample.loc[filter_1].sum())
# Plot simulation results.
n_bins = 10
plt.hist([id_1], bins=n_bins, label=["ID: 1"])
plt.legend()
plt.title("{} simulations of revenue".format(num_samples))
print(mc_arrays)
df['Monte Carlo Mean'] = np.mean(mc_arrays[0])
print(df['Monte Carlo Mean'])
IIUC,这就是你要做的:
ID
),您需要总共num_samples
的蒙特卡罗模拟,以判断该行是否实现了它的Revenue
。在Revenue
的方法是将[0,1]
中随机抽取的值与该行的Odds
进行比较(以标准montecarlo方式)。在Revenue
的平均值和标准差。在如果是这样,您可以通过利用二项式分布的采样函数来实现这一点,而不是从一个均匀分布中提取,然后基于
Odds
进行过滤。我将在这篇文章的最后用一个答案来回答。在但是,由于您已经开始使用统一绘制方法:我建议首先使用
num_samples
来生成n_rows = len(df)
的采样矩阵s_draws
(在我下面的代码中又称n_draws
)。然后对Odds
的每一行中的所有样本应用Odds
检查。然后乘以Revenue
,取每行的平均值和sd。像这样:首先,绘制采样矩阵:
现在找出哪些示例实例“实现”了目标
^{pr2}$Revenue
:最后,计算每行/
ID
的摘要统计信息:下面是使用二项式抽样的版本:
注意:如果
ID
在df
中的多行中重复执行,则这一切的工作方式会略有不同。在这种情况下,可以使用groupby
,然后获取摘要统计信息。但是在您的例子中,ID
从来没有重复过,所以我将把答案保留到现在。在相关问题 更多 >
编程相关推荐