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)
我想知道是否有一种方法可以计算数据帧中每小时数据的累积 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)