Dynami c Расчет мощности в Python - PullRequest
1 голос
/ 01 мая 2020

Мне удалось перевести следующую функцию в 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])

В результате я стремлюсь к создайте следующую тепловую карту:

enter image description here

Расчет тока в Python создает вывод в нижней левой ячейке тепловой карты.

Пожалуйста, помогите мне снять это, и спасибо заранее!

1 Ответ

1 голос
/ 01 мая 2020

Это очень похоже на R, сначала мы создаем data.frame, который фиксирует комбинации удержания / подъема, а также функцию для тестирования:

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...