2017-12-08 2 views
1

Ich muss die Unterschiede innerhalb von Gruppen für Tausende von simulierten Experimenten berechnen. Hier ist eine vereinfachte Version der Daten:Berechnung von Diff auf einen bestimmten Wert innerhalb von Gruppen

import pandas as pd 

data = { 
    'experiment':['exp_1','exp_1','exp_1','exp_2','exp_2','exp_3','exp_3','exp_3','exp_3'], 
    'variation':['control','variation_1','variation_2','control','variation_1','control','variation_1','variation_2','variation_3'], 
    'revenue': [100,120,155,50,95,300,500,350,610] 
} 
df = pd.DataFrame(data,columns=['experiment','variation','revenue']) 

In [16]: df 
Out[16]: 
    experiment variation revenue 
0  exp_1  control  100 
1  exp_1 variation_1  90 
2  exp_1 variation_2  155 
3  exp_2  control  50 
4  exp_2 variation_1  95 
5  exp_3  control  300 
6  exp_3 variation_1  500 
7  exp_3 variation_2  250 
8  exp_3 variation_3  610 

Beachten Sie, dass jedes Experiment nicht eine feste Anzahl Anzahl von Varianten hat - kann es nur ein A/B-Test oder ein A/B/C/D Prüfung.

Ziel ist es, die Diffs zu berechnen, indem jede Variation mit der Kontrolle in jedem Experiment verglichen wird. Das würde die folgenden Ergebnisse für die Beispieldaten geben:

In [17]: df 
Out[17]: 
    experiment variation revenue diffs 
0  exp_1  control  100 NaN 
1  exp_1 variation_1  90 -10 
2  exp_1 variation_2  155  55 
3  exp_2  control  50 NaN 
4  exp_2 variation_1  95  45 
5  exp_3  control  300 NaN 
6  exp_3 variation_1  500 200 
7  exp_3 variation_2  250 -50  
8  exp_3 variation_3  610 310 

This answer ganz in der Nähe, aber es ist ein kumulativer diff an jedem Punkt in der Zeit, anstatt auf einen Vergleich mit dem ersten Wert in jeder Gruppe.

Antwort

0

IIUC, können wir mit transform und fillna

df['diff']=np.nan 

df['diff']=df.loc[df.variation!='control','diff'].\ 
       fillna(df.revenue-df.groupby('experiment').revenue.transform('first')) 
df 
Out[498]: 
    experiment variation revenue diff 
0  exp_1  control  100 NaN 
1  exp_1 variation_1  90 -10.0 
2  exp_1 variation_2  155 55.0 
3  exp_2  control  50 NaN 
4  exp_2 variation_1  95 45.0 
5  exp_3  control  300 NaN 
6  exp_3 variation_1  500 200.0 
7  exp_3 variation_2  250 -50.0 
8  exp_3 variation_3  610 310.0 
0

konnte ich dies erreichen, indem Sie einen neuen Datenrahmen von nur Zeilen mit Variation machen == Kontrolle, dann-Außen Verschmelzung es zurück in den ursprünglichen Datenrahmen und Subtrahieren der resultierenden Spalten.

controls = df[df.variation == 'control'][['experiment','revenue']] 
merged = pd.merge(controls,df,on='experiment',how='outer',suffixes=['_control','']) 
df['diffs'] = merged['revenue'] - merged['revenue_control'] 
Verwandte Themen