Python 更有效地替代scipy.stats expect函数

Python 更有效地替代scipy.stats expect函数,python,scipy,Python,Scipy,我正在为一批产品做一个简单的模拟。具体来说,我想计算不同服务级别的产品预期短缺量。例如,如果我假设一个产品的需求服从正态分布,平均值为100,标准偏差为20,那么对于90%的服务水平,就必须有125.63个产品库存。我预计届时仍将短缺0.9469套: 我目前的做法是解决以下问题: # Import libraries import pandas as pd import numpy as np from scipy.stats import norm # Create an exemplar

我正在为一批产品做一个简单的模拟。具体来说,我想计算不同服务级别的产品预期短缺量。例如,如果我假设一个产品的需求服从正态分布,平均值为100,标准偏差为20,那么对于90%的服务水平,就必须有125.63个产品库存。我预计届时仍将短缺0.9469套:

我目前的做法是解决以下问题:

# Import libraries
import pandas as pd
import numpy as np
from scipy.stats import norm

# Create an exemplary dataset
idx = pd.Index(range(0, 1000), name='productid')
df = pd.DataFrame({'loc': np.random.normal(100, 30, 1000),
               'scale': np.random.normal(20, 5, 1000)}, index=idx)

# Calculate quantile
df['quantile'] = norm.ppf(0.9, df['loc'], df['scale'])

# Calculate expected shortage
df['shortage'] = df.apply(lambda row: norm(row['loc'], row['scale'])\
.expect(lambda x: x-row['quantile'], lb=row['quantile']), axis=1)
代码实际上运行得很好,但是性能有问题。对于1000种产品,预计短缺的计算大约需要15秒。在真实的数据集中,我有10000个产品,我需要重复操作大约100次,因为我想对各种服务级别进行模拟


因此,如果有人知道scipy.stats expect函数更有效的替代方法,或者知道如何通过调整现有代码来提高性能,我会非常高兴。

速度问题不在于
norm
本身,而在于必须对每行应用
一次。@hpaulj是的,但是对于scipy.stats expect函数,除此之外别无选择。显然,
norm(df['loc'],df['scale'])。expect(lambda x:x-df['quantile'],lb=df['quantile'])
将导致错误。因此,我要求提供一个替代方案我刚才写的关于dataframe
apply
替代方案的答案可能是相关的
apply
似乎比numpy数组上的行迭代要慢,尤其是在不需要创建新数据帧的情况下。速度问题不在于
norm
本身,而在于必须对每行应用一次
apply
。@hpaulj是的,但是使用scipy.stats expect函数,没有其他选择。显然,
norm(df['loc'],df['scale'])。expect(lambda x:x-df['quantile'],lb=df['quantile'])
将导致错误。因此,我要求提供一个替代方案我刚才写的关于dataframe
apply
替代方案的答案可能是相关的
apply
似乎比numpy数组上的行迭代要慢,特别是在不需要创建新数据帧的情况下。