2016-09-16 56 views
0

我想知道是否有一种方法可以计算数据框中每小时数据的累计p_value。例如,如果您有24小时的数据,则会有24个p_value的度量值,但在当前小时之前的所有小时内它们都会累计。在熊猫中每小时计算一次累计p_value

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

给定一个带有列id,ts(如unix时间戳),ab_group,结果的df。我运行下面的代码来计算小时的p_values。

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的实现。

任何关于如何修改这个累积值的建议非常感谢。

+1

http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples –

+0

我不认为P值本身,或它的计算的组成部分,很容易转化为某种添加剂。 –

+0

@AmiTavory我想出了一个解决方案。最终必须将每个组件设置为全局变量并在函数内进行更新。 – Grr

回答

0

所以我想出了一个解决方案,我自己的这一个。

我想到的是修改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)