python - Python中的动态功率计算
问题描述
我设法在 R 中翻译了以下函数:
p=pwr.2p2n.test(
h=ES.h(conversion_rate_test, conversion_rate_control),
n1=total_group_size*(1-holdout),
n2=total_group_size*holdout,
sig.level=0.1,
alternative="two.sided")
进入 Python:
import statsmodels.stats.api as sms
es = sms.proportion_effectsize(conversion_rate_test, conversion_rate_control)
sms.NormalIndPower().solve_power(es, nobs1=n1, alpha=alpha, ratio=n2/n1, alternative='two-sided')
但是,Python 中用于计算的所有输入现在都是硬编码的:
lift = 0.01
conversion_rate_control = 0.151169
conversion_rate_test = conversion_rate_control*(1+lift)
holdout = 0.01
n1 = 38820.0*(1-holdout)
n2 = 38820.0*holdout
cl = 0.9
alpha = 1-cl
计算有效,但需要根据以下数组而不是编码值动态完成:
# providing arrays of values for future heatmap
holdout=np.array([0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5])
lift=np.array([0.01, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.125, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4])
因此,我的目标是构建以下热图:
Python 中的当前计算在热图左下角的单元格中生成输出。
请帮我把它取下来,提前谢谢你!
解决方案
它与 R 非常相似,首先我们制作一个 data.frame 来捕获holdout / lift 的组合,以及一个用于测试的函数:
import pandas as pd
import itertools
import numpy as np
import statsmodels.stats.api as sms
import seaborn as sns
def expand_grid(data_dict):
rows = itertools.product(*data_dict.values())
return pd.DataFrame.from_records(rows, columns=data_dict.keys())
def test(holdout,lift):
conversion_rate_control = 0.151169
conversion_rate_test = conversion_rate_control*(1+lift)
es = sms.proportion_effectsize(conversion_rate_test, conversion_rate_control)
n1 = 38820.0*(1-holdout)
n2 = 38820.0*holdout
cl = 0.9
alpha = 1-cl
return sms.NormalIndPower().solve_power(es, nobs1=n1, alpha=alpha, ratio=n2/n1, alternative='two-sided')
holdout=np.array([0.01, 0.02, 0.03, 0.04, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5])
lift=np.array([0.01, 0.02, 0.025, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1, 0.125, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4])
df = expand_grid({'holdout':holdout,'lift':lift})
力量,基本上是按行应用函数:
df['power'] = df.apply(lambda x:test(x[0],x[1]),axis=1)
然后我们通过传入一个 pivot_wide data.frame 进行绘图:
fig, ax = plt.subplots(figsize = (13,6))
ax = sns.heatmap(data=df.pivot(index='lift',columns='holdout',values='power'),
annot=True,cmap="inferno")
fig.axes[0].invert_yaxis()
plt
推荐阅读
- python - 从今日图片中抓取维基百科内容
- c-preprocessor - 如何执行 C 预处理器宏的逐步扩展?
- django - 如何将detailview字段绑定到django中的表单字段并保存到数据库中
- xamarin.forms - 在 Xamarin 表单弹出窗口中包含标签页
- node.js - 将 node_modules 资产插入我的项目
- sql-server - 设计存储过程以处理具有不同格式和逻辑的多个表
- python - 如何在熊猫数据框中选择两个日期内的行?
- c++ - 试图创建一个基类的对象数组,然后在这个数组中创建派生类的对象,但是没有成功
- azure - 哪种消息服务可与 Azure 函数扇出模式一起使用而无需扇回?
- docker - Docker 应用的 Nginx SSL