In [1]:
import numpy as np
In [3]:
import explogger
# import experiment
In [4]:
from explogger import ExperimentLog
from explogger import pseudo, extract
In [5]:
import datetime
datetime_format = "%Y-%m-%d_%H:%M:%S"
def datetime_now():
return datetime.datetime.now().strftime(datetime_format)
The purpose of this notebook is to produce the data and run the analysis that is described in http://ademos.people.uic.edu/Chapter21.html.
In [6]:
factors = [('F0', ['a', 'b']), ('F1', ['x', 'y'])]
levels = [np.array(['a', 'b']), np.array(['x', 'y'])]
In [7]:
e = ExperimentLog(":memory:", ntp_sync=False)
In [8]:
if e.meta.stage == 'init':
# needed?
e.create('SESSION', 'data', description='')
e.create('USER', 'user', description='user session')
for factor in factors:
e.create("SESSION", factor[0], stype='factor')
for level in factor[1]:
e.create("SESSION", level, stype='level')
e.meta.stage='setup'
In [9]:
import hashlib
def seed_rng_with_username(username):
m = hashlib.md5(username)
seed = int(m.hexdigest()[:8], 16)
np.random.seed(seed)
def shuffle_(data):
t = data[:]
np.random.shuffle(t)
np.random.shuffle(t.T)
return t
def cartesian_product(*arrays):
la = len(arrays)
dtype = np.find_common_type([a.dtype for a in arrays], [])
arr = np.empty([len(a) for a in arrays] + [la], dtype=dtype)
for i, a in enumerate(np.ix_(*arrays)):
arr[...,i] = a
return arr.reshape(-1, la)
In [10]:
n_users = 3
design = []
for user in range(n_users):
username = pseudo.get_pseudo()
cp = cartesian_product(*levels)
shuffle_(cp)
cdt = cp[:,0] + cp[:,1]
design.append((username, cdt.tolist()))
In [11]:
# save the users
for r in design:
username = r[0]
# meta = extract.meta_dataframe(e.cursor)
# is_new_user = not meta['USER']['name'].isin([username]).any()
# if is_new_user: e.create("USER", name=username)
e.create("USER", name=username)
In [12]:
meta = extract.meta_dataframe(e.cursor)
In [13]:
sessions = extract.dump_sessions_dataframe(e.cursor)
meta = extract.meta_dataframe(e.cursor)
In [14]:
sessions
Out[14]:
In [15]:
meta['USER']
Out[15]:
In [16]:
meta['SESSION']
Out[16]:
In [17]:
# run the full experiment
for run in design:
# select the user
user = run[0]
# get a unique session
session_now = user + '_' + datetime_now()
e.create('SESSION', session_now, data={'user':user}, stype='exprun')
e.enter("data", session = session_now)
# bind after the first enter
e.bind('USER', user)
# iterate through the treatments
for t in run[1]:
f0, f1 = t
e.enter(f0, session = f0)
e.enter(f1, session = f1)
for i in range(3):
e.enter()
data = np.random.random_sample(1)[0]
# tweak the data to show effect and interaction
e.log("data", data={'d':data, 'F0':f0, 'F1':f1, 'level':t, 'user': user})
e.leave()
e.leave()
e.leave()
e.leave()
In [22]:
flatdf = extract.dump_flat_dataframe(e.cursor)
flatdf['data'].head(10)
Out[22]:
In [19]:
sessions = extract.dump_sessions_dataframe(e.cursor)
sessions.head(10)
Out[19]:
In [20]:
meta = extract.meta_dataframe(e.cursor)
meta['SESSION']
Out[20]:
In [ ]: