Python - 将 SciPy Beta 分布应用于 Pandas DataFrame 的所有行
Python - Apply SciPy Beta Distribution to all rows of Pandas DataFrame
在 SciPy 中,可以按如下方式实现 beta 分布:
x=640495496
alpha=1.5017096
beta=628.110247
A=0
B=148000000000
p = scipy.stats.beta.cdf(x, alpha, beta, loc=A, scale=B-A)
现在,假设我有一个包含 x、alpha、beta、A、B 列的 Pandas 数据框。如何将 beta 分布应用于每一行,并将结果附加为新列?
需要 apply
函数 scipy.stats.beta.cdf
和 axis=1
:
df['p'] = df.apply(lambda x: scipy.stats.beta.cdf(x['x'],
x['alpha'],
x['beta'],
loc=x['A'],
scale=x['B']-x['A']), axis=1)
样本:
import scipy.stats
df = pd.DataFrame({'x':[640495496, 640495440],
'alpha':[1.5017096,1.5017045],
'beta':[628.110247, 620.110],
'A':[0,0],
'B':[148000000000,148000000000]})
print (df)
A B alpha beta x
0 0 148000000000 1.501710 628.110247 640495496
1 0 148000000000 1.501704 620.110000 640495440
df['p'] = df.apply(lambda x: scipy.stats.beta.cdf(x['x'],
x['alpha'],
x['beta'],
loc=x['A'],
scale=x['B']-x['A']), axis=1)
print (df)
A B alpha beta x p
0 0 148000000000 1.501710 628.110247 640495496 0.858060
1 0 148000000000 1.501704 620.110000 640495440 0.853758
鉴于我怀疑 pandas apply 只是循环遍历所有行,并且 scipy.stats 分布在每次调用中都有相当多的开销,我会使用矢量化版本:
>>> from scipy import stats
>>> df['p'] = stats.beta.cdf(df['x'], df['alpha'], df['beta'], loc=df['A'], scale=df['B']-df['A'])
>>> df
A B alpha beta x p
0 0 148000000000 1.501710 628.110247 640495496 0.858060
1 0 148000000000 1.501704 620.110000 640495440 0.853758
在 SciPy 中,可以按如下方式实现 beta 分布:
x=640495496
alpha=1.5017096
beta=628.110247
A=0
B=148000000000
p = scipy.stats.beta.cdf(x, alpha, beta, loc=A, scale=B-A)
现在,假设我有一个包含 x、alpha、beta、A、B 列的 Pandas 数据框。如何将 beta 分布应用于每一行,并将结果附加为新列?
需要 apply
函数 scipy.stats.beta.cdf
和 axis=1
:
df['p'] = df.apply(lambda x: scipy.stats.beta.cdf(x['x'],
x['alpha'],
x['beta'],
loc=x['A'],
scale=x['B']-x['A']), axis=1)
样本:
import scipy.stats
df = pd.DataFrame({'x':[640495496, 640495440],
'alpha':[1.5017096,1.5017045],
'beta':[628.110247, 620.110],
'A':[0,0],
'B':[148000000000,148000000000]})
print (df)
A B alpha beta x
0 0 148000000000 1.501710 628.110247 640495496
1 0 148000000000 1.501704 620.110000 640495440
df['p'] = df.apply(lambda x: scipy.stats.beta.cdf(x['x'],
x['alpha'],
x['beta'],
loc=x['A'],
scale=x['B']-x['A']), axis=1)
print (df)
A B alpha beta x p
0 0 148000000000 1.501710 628.110247 640495496 0.858060
1 0 148000000000 1.501704 620.110000 640495440 0.853758
鉴于我怀疑 pandas apply 只是循环遍历所有行,并且 scipy.stats 分布在每次调用中都有相当多的开销,我会使用矢量化版本:
>>> from scipy import stats
>>> df['p'] = stats.beta.cdf(df['x'], df['alpha'], df['beta'], loc=df['A'], scale=df['B']-df['A'])
>>> df
A B alpha beta x p
0 0 148000000000 1.501710 628.110247 640495496 0.858060
1 0 148000000000 1.501704 620.110000 640495440 0.853758