Используйте строки в фрейме данных в качестве входных данных для функций и визуализации - PullRequest
1 голос
/ 07 мая 2020

Пожалуйста, помогите мне перебрать каждую строку следующего файла .CSV, загруженного как Pandas фрейм данных с именем df_data в моем последующем коде:

aud,wllt_cnt,bcr
Group A,64700,0.15116928389684975
Group B,7654,0.02786525362332031
Group C,11183,0.01278621197465396
Group D,8025,0.00881753794562903

В настоящее время я создал следующую функцию путем предоставления ссылок на указанные c местоположения (см. переменные total_group_size и cr c):

import pandas as pd
import itertools
import numpy as np
import statsmodels.stats.api as sms
import seaborn as sns
%matplotlib inline
from matplotlib import pyplot as plt

# Group A
# making a dataframe that captures the combinations of holdout / lift
def expand_grid(data_dict):
    rows = itertools.product(*data_dict.values())
    return pd.DataFrame.from_records(rows, columns=data_dict.keys())

# making a function for testing
def test(holdout,lift):
    cl = 0.9
    alpha = 1-cl
    total_group_size = df_data.iloc[0,1]
    wllt_cnt_reach = total_group_size*0.6
    crc = df_data.iloc[0,2]
    conversion_rate_control = crc
    conversion_rate_test = conversion_rate_control*(1+lift)
    es = sms.proportion_effectsize(conversion_rate_test, conversion_rate_control)
    n1 = wllt_cnt_reach*(1-holdout)
    n2 = wllt_cnt_reach*holdout
    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)

И построение тепловой карты (здесь я также использовал ссылку на df_data dataframe при указании заголовка графика (см. plt_title ):

plt_title = df_data.iloc[0,0]
x_axis_labels = [1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
y_axis_labels = [1, 2, 2.5, 3, 4, 5, 6, 7, 8, 9, 10, 12.5, 15, 20, 25, 30, 35, 40]

fig, ax = plt.subplots(figsize = (13,6))
ax = sns.heatmap(data=df.pivot(index='lift',columns='holdout',values='power'),
            annot=True, fmt='.0%', cmap=sns.color_palette("RdYlGn", 200), xticklabels=x_axis_labels, yticklabels=y_axis_labels,
            cbar_kws={'label': 'Power'})
fig.axes[0].invert_yaxis()
ax.set_title(plt_title)
plt.xlabel("Holdout")
plt.ylabel("% Lift")
b, t = plt.ylim() 
b -= 0.5
t += 0.5
plt.ylim(b, t)
plt.show()

Мне нужно оптимизировать этот код, чтобы мне не приходилось копировать и вставлять тот же код в примените его к каждой строке кадра данных df_data . Я понимаю, что мне нужно изменить функцию test сверху, чтобы получить больше входных данных, а затем обернуть построение в другую функцию и показать тепловую карту для каждой из групп (строки в моем файле .CSV), но я застрял на первом этапе этого плана действий.

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

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