In [58]:
import numpy as np
import pandas as pd
import scipy.stats as stats
from matplotlib import pyplot as plt
import matplotlib.pylab as pylab
import seaborn as sns
import json
%run -i nb_analysis # Run instead of import so we can access 'df' defined in notebook
%matplotlib inline
users = np.array(['A', 'B', 'C', 'D', 'E'])
noc = np.array(['A', 'B', 'D', 'E'])

In [117]:
df_all = pd.read_json('combined.json', orient='records')

In [111]:
#pd.DataFrame(df, columns=['tabsActivated'])
#df.info() # Column information
colors = sns.color_palette()
c = colors[0]
con, coff = colors[1], colors[0]
co = 'y'

df_all.info()
dfnoc = df_all[:].drop(df_all.index[[4,5]]).reset_index()
dfnoc.index


<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 30 columns):
endTime                          10 non-null int64
groupBy                          8 non-null object
helpOpenedFromPopup              10 non-null int64
length                           10 non-null int64
markTabFromHotkey                10 non-null int64
markTabFromPanelTree             10 non-null int64
markTabFromPopup                 10 non-null int64
markTabFromVisualization         10 non-null int64
name                             10 non-null object
openFrequentFromPopup            10 non-null int64
openRecentFromPopup              10 non-null int64
popupOpened                      10 non-null object
startTime                        10 non-null int64
state                            10 non-null object
switchToMarkedTabFromHotkey      10 non-null int64
switchToMarkedTabFromPopup       10 non-null int64
switchToTabFromPanelTree         10 non-null int64
switchToTabFromVisualization     10 non-null int64
tabsActivated                    10 non-null object
tabsClosed                       10 non-null object
tabsCreated                      10 non-null object
tabsMarked                       10 non-null object
tabsMoved                        10 non-null object
tabsOpen                         10 non-null object
urlsRevisited                    8 non-null float64
urlsVisited                      8 non-null float64
visualizationOpened              10 non-null object
visualizationOpenedFromHotkey    10 non-null int64
visualizationOpenedFromPopup     10 non-null int64
when                             10 non-null int64
dtypes: float64(2), int64(17), object(11)
Out[111]:
Int64Index([0, 1, 2, 3, 4, 5, 6, 7], dtype='int64')

In [105]:
#df['name'][2],df['state'][2], df['tabsOpen'][2], df['name'][3], df['state'][3], df['tabsOpen'][3]
#[df['tabsOpen'][index].keys() for index in df.index]
#df['tabsActivated'][0]['index'][23:26], df['tabsActivated'][0]['numOpenTabs'][23:26], df['tabsActivated'][0]['id'][23:26]


Out[105]:
([7, 6, 6], [11, 10, 9], [401, 397, 387])

In [ ]:
# URLs visited vs URLs revisited

In [54]:
# Tab switching over time
fig = plt.figure(figsize=(16, 8)) # Larger figure
nrows, ncols = len(df.index) / 2, 2
for index in df.index:
    x, y = nestedxy(index=index, maincol='tabsActivated', xcol='time', ycol='index')
    plt.subplot(nrows, ncols, index + 1)
    plt.hold(True)
    plt.plot(x, y, 'ro', markersize=3)
    plt.plot(x, y)
    plt.xlabel('Time (s)')
    plt.ylabel('Active tab index')
    plt.title('Run %d (%s)' % (index, df['state'][index]))
plt.autoscale(tight='x')
plt.tight_layout()



In [137]:
from scipy.stats import ttest_ind, ttest_rel
# Number of tab switches per second (ON vs OFF)
on, off = [], []
for index in df.index:
    state = df['state'][index]
    n_switches = len(df['tabsActivated'][index]['index'])
    last_switch_time = df['tabsActivated'][index]['time'][-1]
    first_switch_time = df['tabsActivated'][index]['time'][0]
    #duration = (df['endTime'][index] - df['startTime'][index]) / 1000. # ms -> s
    duration = last_switch_time - first_switch_time
    duration /= 1000. # ms -> s
    switches_per_second = n_switches / duration
    if state == 'ON':
        on.append(switches_per_second)
    else:
        off.append(switches_per_second)

        
on = 60 * np.array(on)
off = 60 * np.array(off)
print on
print off
print "Independent: ", ttest_ind(on, off, equal_var=False)
print "Dependent: ", ttest_rel(on, off)


[  3.03155233   5.93350979  20.71276272   6.1160286    1.39844558]
[ 0.8871545   1.70732054  1.71949702  3.00609746  0.70434783]
Independent:  (array(1.6859886959449242), 0.16512349045744917)
Dependent:  (array(1.7462211656384088), 0.15570199912667629)

In [151]:
# Number of tabs open, average
#on = np.array([df['tabsOpened'][index]['numOpenTabs'])
on = [np.array(df['tabsOpen'][index]['numOpenTabs']).mean() for index in df.index if index % 2 == 0]
off = [np.array(df['tabsOpen'][index]['numOpenTabs']).mean() for index in df.index if index % 2 == 1]

ttest_ind(on, off, equal_var=False)


Out[151]:
(array(1.2496616342053846), 0.26286334973123704)

In [223]:
# Tab switching over time
def tab_diff(y0, y1, n1):
    """Returns the min number of shifts required to go from tab y0 to tab y1.
    
    Args:
      y0: Initial tab index
      y1: Final tab index
      n1: Number of open tabs when switch occurs
      
    Returns:
      Minimum number of switches required.
    """
    diff_right = (y1 - y0) % n1
    diff_left = (y0 - y1) % n1
    return min(diff_right, diff_left)

df = dfnoc
fig = plt.figure(figsize=(32, 16)) # Larger figure
nrows, ncols = len(df.index) / 2, 2
for index in df.index:
    x, y = nestedxy(df=df, index=index, maincol='tabsActivated', xcol='time', ycol='index')
    _, y_open = nestedxy(df=df, index=index, maincol='tabsActivated', xcol='time', ycol='numOpenTabs')
    x_diff = x[1:]

    y_diff = [tab_diff(y[i], y[i+1], y_open[i+1]) for i in range(len(y) - 1)]
    #y_diff = [abs(y[i+1] - y[i]) % (y_open[i+1]) for i in range(len(y) - 1)] # Difference in tab index
    #y_diff = [abs(y[i+1] - y[i]) for i in range(len(y) - 1)] # Difference in tab index
    plt.subplot(nrows, ncols, index + 1)
    plt.hold(True)
    plt.plot(x, y_open, 'g--')
    plt.plot(x_diff, y_diff, 'ro', markersize=3)
    plt.plot(x_diff, y_diff)

    plt.xlabel('Time (s)')
    plt.ylabel('Tab index change')
    plt.title('Run %d (%s)' % (index, df['state'][index]))
plt.autoscale(tight='x')
plt.tight_layout()



In [124]:
x0, y0 = nestedxy(index=0, maincol='tabsActivated', xcol='time', ycol='numOpenTabs')
x4, y4 = nestedxy(index=4, maincol='tabsActivated', xcol='time', ycol='numOpenTabs')
plt.hold(True)
plt.plot(x0, y0, 'b')
plt.plot(x4, y4, 'g')
plt.hold(False)



In [217]:
# Tab switching over time
df = dfnoc
u = noc

fig = plt.figure(figsize=(12, 12)) # Larger figure
nrows, ncols = len(df.index) / 2, 2
colors = sns.color_palette()
for index in df.index:
    if index % 2 == 1:
        continue
    start_time = min(df['startTime'][index], df['startTime'][index + 1])
    # Tabs activated
    x0, y0 = nestedxy(df=df, index=index, maincol='tabsActivated', xcol='time', ycol='index', start_time=start_time)
    x1, y1 = nestedxy(df=df, index=index+1, maincol='tabsActivated', xcol='time', ycol='index', start_time=start_time)
    
    # Tabs open
    x0_open, y0_open = nestedxy(df=df, index=index, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    x1_open, y1_open = nestedxy(df=df, index=index+1, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    
    plt.subplot(nrows, ncols, index / 2 + 1)
    plt.hold(True)
    
    #plt.plot(x0, y0, 'ro', markersize=3)
    plt.plot(x0, y0, color=con, label='On')
    plt.plot(x1, y1, color=coff, label='Off')
    
    plt.plot(x0_open, y0_open, '--', color=co, markersize=3, label='Open tabs')
    plt.plot(x1_open, y1_open, '--', color=co, markersize=3)
    
    plt.xlabel('Time (s)')
    plt.ylabel('Tab index')
    plt.title('%s' % (u[index / 2]))
    
    plt.legend()
    plt.autoscale(tight='x')
    plt.tight_layout()
    
plt.savefig('switching.png', bbox_inches='tight')



In [224]:
# Tab marking over time
df = dfnoc
u = noc

fig = plt.figure(figsize=(16, 8)) # Larger figure
#nrows, ncols = len(df.index) / 2, 2
nrows, ncols = 3, 2
for index in df.index:
    if index % 2 == 1:
        continue
    start_time = min(df['startTime'][index], df['startTime'][index + 1])
    # Tabs marked
    x0, y0 = nestedxy(df=df, index=index, maincol='tabsMarked', xcol='time', ycol='numMarkedTabs', start_time=start_time)
    x1, y1 = nestedxy(df=df, index=index+1, maincol='tabsMarked', xcol='time', ycol='numMarkedTabs', start_time=start_time)
    
    # Tabs open
    x0_open, y0_open = nestedxy(df=df, index=index, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    x1_open, y1_open = nestedxy(df=df, index=index+1, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    
    # Tabs moved
    x0_moved, y0_moved = nestedxy(df=df, index=index, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    x1_open, y1_open = nestedxy(df=df, index=index+1, maincol='tabsOpen', xcol='time', ycol='numOpenTabs', start_time=start_time)
    
    
    plt.subplot(nrows, ncols, index / 2 + 1)
    plt.hold(True)
    
    plt.plot(x0, y0, 'ro', markersize=3)
    plt.plot(x0, y0, label='Marked')
    
    # Redundant - no marked tabs in OFF
    #plt.plot(x1, y1, 'ro', markersize=3)
    #plt.plot(x1, y1)
    
    plt.plot(x0_open, y0_open, '--', color=con, markersize=3, label='ON')
    plt.plot(x1_open, y1_open, '--', color=coff, markersize=3, label='OFF')
    
    #plt.plot(x, y1, 'g--', markersize=3)
    
    plt.xlabel('Time (s)')
    plt.ylabel('Number of marked tabs')
    plt.title('%s' % (u[index / 2]))
    
    plt.autoscale(tight='x')
    plt.tight_layout()
    plt.legend()



In [91]:
# Open over time, with and without extension
fig = plt.figure(figsize=(16, 8)) # Larger figure
nrows, ncols = len(df.index) / 2, 2
for index in df.index:
    if index % 2 == 1:
        continue
    state0 = df['state'][index]
    x0, y0 = nestedxy(index=index, maincol='tabsOpen', xcol='time', ycol='numOpenTabs')
    state1 = df['state'][index+1]
    x1, y1 = nestedxy(index=index+1, maincol='tabsOpen', xcol='time', ycol='numOpenTabs')
    plt.subplot(nrows, ncols, index + 1)
    plt.hold(True)
    # ON: blue, OFF: red
    color0 = 'b' if state0 == 'ON' else 'r'
    color1 = 'b' if state1 == 'ON' else 'r'
    plt.plot(x0, y0, color0)
    plt.plot(x1, y1, color1)
    #plt.plot(x, y1, 'g--', markersize=3)
    plt.xlabel('Time (s)')
    plt.ylabel('Number of open tabs')
    plt.title('Run %d (%s)' % (index, df['state'][index]))
plt.autoscale(tight='x')
plt.tight_layout()



In [61]:
# URL revisitation; info missing in runs where older version that did not log this was used
nrows, ncols = len(df.index) / 2, 2
x0, y0 = scalarxy(ycol='urlsVisited')
x1, y1 = scalarxy(ycol='urlsRevisited')
plt.plot(x0, y0, label='URLs visited')
plt.plot(x1, y1, label='URLs revisited')

annotate(x=x0, y=y0) # Show y values
annotate(x=x1, y=y1)
plt.autoscale(tight='x')
plt.tight_layout()
plt.legend()


Out[61]:
<matplotlib.legend.Legend at 0x49eb6d0>

In [133]:
# URL revisitation; info missing in runs where older version that did not log this was used
df = df_all

nrows, ncols = len(df.index) / 2, 2
x0, y0 = scalarxy(df=df, ycol='urlsVisited')
x1, y1 = scalarxy(df=df, ycol='urlsRevisited')

ind = np.arange(len(x0) / 2)
width = 0.35

color_revisit = sns.color_palette()[1]

plt.bar(ind, y0[::2], width=width, hold=True)
plt.bar(ind + width, y0[1::2], width=width, hold=True, label='URLs visited')

plt.bar(ind, y1[::2], color=color_revisit, width=width, hold=True)
plt.bar(ind + width, y1[1::2], color=color_revisit, width=width, hold=True, label='URLs revisited')
plt.ylabel('Visits')

plt.xticks(ind+width, users)
plt.xlabel('User (Left: ON, Right: OFF)')
plt.title('Page revisits')
plt.legend()
plt.savefig('revisits.png', bbox_inches='tight')



In [120]:
sns.palplot(sns.color_palette())



In [120]:


In [132]:
# Tabs moved
df = dfnoc

for index in df.index:
    state = df['state'][index]
    n_moved = len(df['tabsMoved'][index]['time'])
    print "State: %s Moved: %d" % (state, n_moved)


State: ON Moved: 6
State: OFF Moved: 0
State: ON Moved: 0
State: OFF Moved: 0
State: ON Moved: 12
State: OFF Moved: 1
State: ON Moved: 0
State: OFF Moved: 0

In [136]:
# Scanning vs visualization
vi = np.array([6, 10, 11, 3.4, 3.5])
sc = np.array([7, 12, 12, 5.14, 7])
print sc.mean(), sc.var()
print vi.mean(), vi.var()


8.628 8.041536
6.78 10.1936

In [154]:
n_marked = sum([len(df['tabsMarked'][index]['numMarkedTabs']) for index in df.index])
n_marked


Out[154]:
26

In [168]:
item = 'tabsMarked'
a = np.array([(index, len(df[item][index]['time'])) for index in df.index if index % 2 == 0])
print a[:,1]
print a[:,1].mean(), a[:, 1].std()


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-168-e7a831d259bd> in <module>()
      1 item = 'openRecentFromPopup'
----> 2 a = np.array([(index, len(df[item][index]['time'])) for index in df.index if index % 2 == 0])
      3 print a[:,1]
      4 print a[:,1].mean(), a[:, 1].std()

IndexError: invalid index to scalar variable.

In [171]:
item = 'openFrequentFromPopup'
a = np.array([(index, df[item][index]) for index in df.index if index % 2 == 0])
print a[:,1]
print a[:,1].mean(), a[:, 1].std()


[0 0 0 0 0]
0.0 0.0

In [210]:
only_on = True
for column in df.columns:
    try:
        if not np.isscalar(df[column].max()):
            if only_on:
                l = np.array([len(df[column][index]['time']) for index in df.index if index % 2 == 0])
            else:
                l = np.array([len(df[column][index]['time']) for index in df.index])
            print column, " ", l.max(), " ", l.mean(), " ", l.std(), " ", df.name[l.argmax()], " ", users[l.argmax() / 2], " ", users[l.argmin() / 2]
            print
            continue
        col = df[column][::2] if only_on else df[column]
        print column, col.max(), col.mean(), col.std(), df.name[col.argmax()], users[col.argmax() / 2], " ", users[col.argmin() / 2]
        print
    except:
        pass


endTime 1399011803444 839398163865.0 766262181861.0 SK E   C

helpOpenedFromPopup 3 1.6 1.3416407865 XI D   C

length 30 30.0 0.0 SR A   A

markTabFromHotkey 12 4.4 4.50555213043 SR A   C

markTabFromPanelTree 0 0.0 0.0 SR A   A

markTabFromPopup 0 0.0 0.0 SR A   A

markTabFromVisualization 1 0.2 0.4472135955 SK E   A

name ZY openFrequentFromPopup 0 0.0 0.0 SR A   A

openRecentFromPopup 0 0.0 0.0 SR A   A

popupOpened   22   8.4   7.4188947964   ZY   B   A

startTime 1399009622017 1.39899579264e+12 10033859.0974 SK E   A

state ON switchToMarkedTabFromHotkey 34 11.0 13.6014705087 ZY B   C

switchToMarkedTabFromPopup 0 0.0 0.0 SR A   A

switchToTabFromPanelTree 0 0.0 0.0 SR A   A

switchToTabFromVisualization 17 6.8 6.45755371639 XI D   A

tabsActivated   292   114.4   90.541923991   ZY   B   C

tabsMarked   12   5.2   3.91918358845   SR   A   B

tabsOpen   183   69.0   58.0241329104   ZY   B   A

urlsRevisited 26.0 14.75 12.5266382827 XI D   E

urlsVisited 168.0 76.0 71.9814790994 XI D   E

visualizationOpened   45   19.4   14.3749782609   ZY   B   A

visualizationOpenedFromHotkey 12 5.4 4.82700735446 WK C   E

visualizationOpenedFromPopup 2 0.4 0.894427191 XI D   A

when 2 1.4 0.547722557505 XI D   A


In [166]:
df.info()


<class 'pandas.core.frame.DataFrame'>
Int64Index: 10 entries, 0 to 9
Data columns (total 30 columns):
endTime                          10 non-null int64
groupBy                          8 non-null object
helpOpenedFromPopup              10 non-null int64
length                           10 non-null int64
markTabFromHotkey                10 non-null int64
markTabFromPanelTree             10 non-null int64
markTabFromPopup                 10 non-null int64
markTabFromVisualization         10 non-null int64
name                             10 non-null object
openFrequentFromPopup            10 non-null int64
openRecentFromPopup              10 non-null int64
popupOpened                      10 non-null object
startTime                        10 non-null int64
state                            10 non-null object
switchToMarkedTabFromHotkey      10 non-null int64
switchToMarkedTabFromPopup       10 non-null int64
switchToTabFromPanelTree         10 non-null int64
switchToTabFromVisualization     10 non-null int64
tabsActivated                    10 non-null object
tabsClosed                       10 non-null object
tabsCreated                      10 non-null object
tabsMarked                       10 non-null object
tabsMoved                        10 non-null object
tabsOpen                         10 non-null object
urlsRevisited                    8 non-null float64
urlsVisited                      8 non-null float64
visualizationOpened              10 non-null object
visualizationOpenedFromHotkey    10 non-null int64
visualizationOpenedFromPopup     10 non-null int64
when                             10 non-null int64
dtypes: float64(2), int64(17), object(11)

In [201]:
a = np.array([len(df['visualizationOpened'][index]['time']) for index in df.index])
print a.mean(), a.max(), a.std()


10.1 45 13.8235306633

In [204]:
df['markTabFromHotkey']


Out[204]:
0    12
1     0
2     3
3     0
4     0
5     0
6     3
7     0
8     4
9     0
Name: markTabFromHotkey, dtype: int64

In [212]:
df['urlsVisited'].sum()


Out[212]:
496.0

In [213]:
df['urlsRevisited'].sum()


Out[213]:
114.0

In [214]:
114./496


Out[214]:
0.22983870967741934

In [344]:
# Number of tabs used vs number of open tabs
# Five or ten minute intervals
df = dfnoc
df_used = pd.DataFrame(columns=['name', 'state', 't_dwell', 'index_used', 'ids_used', 'n_dwelt'])
for index in df.index:
    t_outer, ids_outer = nestedxy(df=df, maincol='tabsActivated', xcol='time', ycol='id', index=index)
    t_outer, indices_outer = nestedxy(df=df, maincol='tabsActivated', xcol='time', ycol='index', index=index)
    t_outer, open_tabs_outer = nestedxy(df=df, maincol='tabsActivated', xcol='time', ycol='numOpenTabs', index=index)
    dt = 60 * 5 # Time interval to measure over

    for t_dwell in range(0, 20, 2):
        dwelt = [i for i in range(len(t_outer) - 1) if t_outer[i+1] - t_outer[i] >= t_dwell]

        ids = np.array(ids_outer)[dwelt]
        indices = np.array(indices_outer)[dwelt]
        open_tabs = np.array(open_tabs_outer)[dwelt]
        t = np.array(t_outer)[dwelt]

        bins = np.arange(0, t[-1], dt)
        nbins = len(bins)
        inds = np.digitize(t, bins)

        indices_by_bin = [indices[np.where(inds == b)[0]] for b in np.unique(inds)]
        ids_by_bin = [ids[np.where(inds == b)[0]] for b in np.unique(inds)]
        open_by_bin = [open_tabs[np.where(inds == b)[0]] for b in np.unique(inds)]
        
        n_indices_used_by_bin = np.array([len(np.unique(ind)) for ind in indices_by_bin])
        n_ids_used_by_bin = np.array([len(np.unique(tab_ids)) for tab_ids in ids_by_bin])
        n_open_by_bin = np.array([np.max(tabs) for tabs in open_by_bin])
  
        pct_index_used = np.mean(100 * n_indices_used_by_bin / n_open_by_bin)
        pct_ids_used = np.mean(100 * n_ids_used_by_bin / n_open_by_bin)

        df_used = df_used.append({'state': df['state'][index], 't_dwell': t_dwell, 
                                  'index_used': pct_index_used, 'ids_used': pct_ids_used, 
                                  'name': df['name'][index], 'n_dwelt': len(dwelt)}, ignore_index=True)
        #print "State: %-3s t_dwell: %ds index_used: %.3f%% ids_used: %.3f%% n_dwelt: %d" % (
        #    df['state'][index], t_dwell, pct_index_used, pct_ids_used, len(dwelt))
    #print "-" * 75
df_used


Out[344]:
name state t_dwell index_used ids_used n_dwelt
0 SR ON 0 54.33333 68.83333 93
1 SR ON 2 51.66667 63.5 77
2 SR ON 4 45.5 50.83333 54
3 SR ON 6 41.83333 47.16667 44
4 SR ON 8 36.83333 42.16667 39
5 SR ON 10 35.5 39.83333 35
6 SR ON 12 35.5 39.83333 35
7 SR ON 14 34.16667 38.5 34
8 SR ON 16 32.16667 34.5 30
9 SR ON 18 27.33333 30.66667 25
10 SR OFF 0 22.75 24 26
11 SR OFF 2 21.25 22.5 24
12 SR OFF 4 19 19 20
13 SR OFF 6 16.25 16.25 16
14 SR OFF 8 15 15 14
15 SR OFF 10 13.75 13.75 13
16 SR OFF 12 13.75 13.75 13
17 SR OFF 14 12.25 12.25 12
18 SR OFF 16 11.25 11.25 11
19 SR OFF 18 11.25 11.25 11
20 ZY ON 0 51 62.33333 84
21 ZY ON 2 47 54.66667 39
22 ZY ON 4 36.33333 44 26
23 ZY ON 6 24 33.66667 18
24 ZY ON 8 24 33.66667 18
25 ZY ON 10 20.33333 29.66667 15
26 ZY ON 12 20.33333 29.66667 15
27 ZY ON 14 16.66667 26.66667 13
28 ZY ON 16 16.66667 20.66667 10
29 ZY ON 18 12 16.33333 8
30 ZY OFF 0 35 42 27
31 ZY OFF 2 35 42 27
32 ZY OFF 4 33 35.66667 21
33 ZY OFF 6 31 33.66667 20
34 ZY OFF 8 29 31.66667 19
35 ZY OFF 10 29 29 17
36 ZY OFF 12 26.66667 26.66667 15
37 ZY OFF 14 26.66667 26.66667 15
38 ZY OFF 16 26.66667 26.66667 15
39 ZY OFF 18 23.66667 23.66667 13
40 XI ON 0 50.7 83.5 291
41 XI ON 2 47.4 73.9 164
42 XI ON 4 35.4 52 97
43 XI ON 6 26.2 38.9 72
44 XI ON 8 23.9 34.6 63
45 XI ON 10 21.9 29.6 53
46 XI ON 12 19.7 25.7 44
47 XI ON 14 19.2 22.6 40
48 XI ON 16 17.7 20.5 35
49 XI ON 18 19.1 22.6 34
50 XI OFF 0 77.71429 148.2857 103
51 XI OFF 2 77.71429 139.7143 75
52 XI OFF 4 67.28571 113.8571 55
53 XI OFF 6 65.71429 113.7143 50
54 XI OFF 8 60 98.57143 42
55 XI OFF 10 60.85714 100.4286 39
56 XI OFF 12 60.85714 98 37
57 XI OFF 14 55.85714 84.85714 30
58 XI OFF 16 53 78.42857 28
59 XI OFF 18 49.42857 70.14286 26
... ... ... ... ... ...

80 rows × 6 columns


In [292]:


In [ ]: