pandas 每小时计算累计 p_value

Calculate cumulative p_value hourly in pandas

我想知道是否有一种方法可以计算数据帧中每小时数据的累积 p_value。例如,如果您有 24 小时的数据,则 p_value 会有 24 次测量,但它们会累积当前小时之前的所有小时。

通过按小时对数据进行分组,然后应用我编写的 agg_func 来计算计算 p 所需的所有相关统计数据,我已经能够获得每小时的 p_value。但是,这种方法不会产生累积结果,只会产生每个小时的 p。

给定一个带有列 id、ts(作为 unix 时间戳)的 df,ab_group,结果。我 运行 以下代码计算整点的 p_value 秒。

df['time'] = pd.to_datetime(df.ts, unit='s').values.astype('<m8[h]')

def calc_p(group):
    df_old_len = len(group[group.ab_group == 0])
    df_new_len = len(group[group.ab_group == 1])
    ctr_old = float(len(group[(group.ab_group == 0) & (df.result == 1)]))/ df_old_len
    ctr_new = float(len(group[(group.ab_group == 1) & (df.converted == 1)]))/ df_new_len
    nobs_old = df_old_len
    nobs_new = df_new_len
    z_score, p_val, null = z_test.z_test(ctr_old, ctr_new, nobs_old, nobs_new, effect_size=0.001)
    return p_val

grouped = df.groupby(by='time').agg(calc_p)

N.B。 z_test 是我自己的模块,其中包含 z_test 的实现。

非常感谢任何关于如何为累积 p 修改此的建议。

所以我自己想出了一个解决方法。

我想到的是修改 calc_p() 以便它利用全局变量,因此每次被 aggfunc 调用时都可以使用更新的值。下面是编辑后的代码:

def calc_p(group):
    global df_old_len, df_new_len, clicks_old, clicks_new
    clicks_old += len(group[(group.landing_page == 'old_page') & (group.converted == 1)])
    clicks_new += len(group[(group.landing_page == 'new_page') & (group.converted == 1)])
    df_old_len += len(group[group.landing_page == 'old_page'])
    df_new_len += len(group[group.landing_page == 'new_page'])
    ctr_old = float(clicks_old)/df_old_len
    ctr_new = float(clicks_new)/df_new_len
    z_score, p_val, null = z_test.z_test(ctr_old, ctr_new, df_old_len, df_new_len, effect_size=0.001)
    return p_val

# Initialize global values to 0 for cumulative calc_p
df_old_len = 0
df_new_len = 0
clicks_old = 0
clicks_new = 0

grouped = df.groupby(by='time').agg(calc_p)