2017-03-28 1 views
1

Ich habe den folgenden Datenrahmen (tatsächliche Länge des Datenrahmen ist viel größer) zu berechnen:schnellster Weg, um einen Datenrahmen zu mischen P-Wert in Pandas

spend_df: 

var spend 
1  120 
2  200 
1  111 
1  143 
1  230 
2  180 
2  190 
2  94 
2  100 
1  278 

hier'var' Spalt sagen der Gruppe der Testreihe gehört, muss ich die df 1000 mal mischen, um jede reihe zufällig zu verschiedenen seiten von test zufällig groupby 'var' zuzuordnen und die differenz für jede iteration zu berechnen. Am Ende berechnet, wie viel Mal, wenn die Differenz zwischen den Gruppen Summe größer war, dass die tatsächliche Differenz:

i den folgenden Ansatz:

def simulate(df): 
    simul_df = df.copy() 

    shuffled_var = simul_df.sample(frac=1) 
    shuffled_var.index = simul_df.index # replace shuffled series' index with the real one 

    simul_df['var'] = shuffled_var 
    simul_grouped = simul_df.groupby('var').sum()['spend'] 
    simul_difference = simul_grouped.iloc[1] - simul_grouped.iloc[0] 
    return simul_difference 


simulate(spend_df) 

und das ist, wie ich berechnen, wie viele Male simuliert Unterschied größer war, dass die tatsächlichen Unterschied:

simulations = np.array([simulate(spend_df) for i in range(1000)]) 
(simulations > real_difference).mean() 

hier real_difference ist der Unterschied zwischen Summen von zwei Gruppen verbringen (Gruppe von 'var'):

grouped=df.groupby('var').sum().reset_index() 
real_diff=grouped.iloc[1] - grouped.iloc[0] 

in diesem Fall ist es: 882-764 = 118

wenn ich den Datenrahmen mische ich brauche, wie ich oben, dann müssen Sie den Unterschied für neue Gruppen zu berechnen, wie oft diese simulierten Unterschiede herauszufinden, wo mehr als real_diff

Diese Lösung scheint ein bisschen hacky zu mir gibt es keine schnellere oder besser organisierte Art und Weise zu dieser Simulation Aufgabe für die Berechnung von P-Wert? ohne auf statistische Methoden einzugehen.

Antwort

1

Versuch 1

def gdif(df): 
    v, s = df.values.T 
    return np.diff(df.groupby('var').spend.sum().values)[0] 

def shuf(df): 
    np.random.shuffle(df['var'].values) 
    return df 

def sim1(df): 
    sdf = df.copy() 

    real_diff = gdif(sdf) 

    return (np.array([gdif(shuf(sdf)) for _ in range(1000)]) > real_diff).mean() 

sim1(spend_df) 

0.52900000000000003 

Versuch 2
mit mehr numpy

def gdif2(values): 
    v, s = values.T 
    r = np.arange(v.size) 

    a = v.argsort() 
    c = s[a].cumsum() 
    d0 = c[np.flatnonzero(np.diff(v[a]))[0]] 
    return c[-1] - 2 * d0 

def shuf2(v): 
    np.random.shuffle(v[:, 0]) 
    return v 

def sim2(df): 
    values = df.values 

    real_diff = gdif2(values) 

    return (np.array([gdif2(shuf2(values)) for _ in range(1000)]) > real_diff).mean() 

sim2(spend_df) 

0.52700000000000002 

naive Zeit tetsting

enter image description here

+0

Danke, ich frage mich, wie es wirklichen Unterschied berechnet. was ich mit readl difference meine, ist groupby ('var'). sum(), so dass wir einige Ausgaben für zwei Gruppen var1 und var2 haben, die dann subtrahiert werden. Ist deine Funktion dasselbe? – sanaz

+0

Warum redest du deine Frage nicht mit einer Berechnung dessen, was 'real_difference' für deine Probe' spend_df' ist? – piRSquared

+0

Bearbeitet die Frage, hoffentlich ist es jetzt klarer – sanaz

Verwandte Themen