2016-09-16 53 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)