{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function\n", "\n", "import numpy as np\n", "import pandas as pd\n", "from collections import OrderedDict #sorting participant df dict before pd.concat()\n", "import matplotlib.pylab as plt\n", "%matplotlib inline\n", "pd.options.display.mpl_style = 'default'\n", "\n", "TASK_NAMES_USING = [\n", " 'T1_SMS_5', 'T1_SMS_8', \n", " 'Ticks_ISO_T2_5', 'Ticks_ISO_T2_8',\n", " 'Ticks_Linear_5', 'Ticks_Linear_8',\n", " 'Ticks_Phase_5', 'Ticks_Phase_8',\n", " 'Jits_ISO_5', 'Jits_ISO_8',\n", " 'Jits_Phase_5', 'Jits_Phase_8', \n", " 'Jits_Linear_5', 'Jits_Linear_8',\n", " 'ISIP_5', 'ISIP_8', \n", " 'Improv_Metronome',\n", " 'Improv_Melody', \n", " ]\n", "\n", "pid_exclusions = {k: [] for k in TASK_NAMES_USING}\n", "\n", "REMOVE_TASKS = ['Ticks_Pract_8', 'Ticks_Pract_5', \n", " 'Practice_Tick_8', 'Practice_Tick_5',\n", " 'Jits_Pract_8', 'Jits_Pract_5',\n", " 'Practice_jittr_8', 'Practice_jittr_5',\n", " 'Pattern_Practice', ]\n", "\n", "PRACTICE_TASK_NUMBERS = [0, 1, 11, 24, 25]\n", "PITCH_R_PAD = 48\n", "PITCH_L_PAD = 38\n", "#PITCH_TICK = 42\n", "\n", "CHANNEL_TAP = 1\n", "CHANNEL_PIANO = 2\n", "CHANNEL_LOOPBACK = 5" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#EXPECTED_LOOPBACK_COUNTS = {\n", "# 'T1_SMS_5': 130,\n", "# 'T1_SMS_8': 120,\n", "# 'Ticks_ISO_T2_5': 130,\n", "# 'Ticks_ISO_T2_8': 120,\n", "# 'Ticks_Linear_5': 170,\n", "# 'Ticks_Linear_8': 170,\n", "# 'Ticks_Phase_5': 170,\n", "# 'Ticks_Phase_8': 170,\n", "# 'Jits_ISO_5': 360,\n", "# 'Jits_ISO_8': 360,\n", "# 'Jits_Phase_5': 510,\n", "# 'Jits_Phase_8': 510,\n", "# 'Jits_Linear_5': 510,\n", "# 'Jits_Linear_8': 510,\n", "# 'ISIP_5': 40,\n", "# 'ISIP_8': 30,\n", "# 'Improv_Metronome': 140,\n", "# 'Improv_Melody': 162,\n", "# }" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def participant_df(csvfilename):\n", " '''\n", " clean up some of the raw CSVs' idiosyncracies \n", " and load into a one-participant DataFrame.\n", " '''\n", " import os #getting csv file paths\n", " from StringIO import StringIO\n", " csv_lines = open(csvfilename).readlines()\n", " csv_edited = ('csv_line,stamp_type,' +\n", " 'run_count,task_id,task_name,i,channel,pitch,velocity,micros,blank' + \n", " '\\n')\n", " for idx, line in enumerate(csv_lines):\n", " # Lines not to parse: per-task headings, end markers, non-timestamped targets\n", " # (silent, unused targets in ISIP timestamped micros=0 in early admin software version)\n", " if any(s in line for s in ['[', 'taskRunCount', 'end,end,end', 'IntervalOut,X,X,0']):\n", " continue\n", " line_number = str(idx)\n", " if ('IntervalOut' in line):\n", " stamp_type = 'target' \n", " line = line.replace('X,', ',') \n", " line = line.replace('IntervalOut,', ',')\n", " else:\n", " stamp_type = 'midi' #this doesn't distinguish between performance (ch1) and loopback (ch5)\n", " #...let alone left/right tap!\n", " csv_edited += (line_number + ',' + \n", " stamp_type + ',' +\n", " line)\n", " df = pd.read_csv(StringIO(csv_edited), \n", " index_col = ['task_name','csv_line'], #was taskname, stamp_type, csvline\n", " header = 0, \n", " )\n", " df = df.drop('blank', axis=1)\n", " return df" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "slideshow": { "slide_type": "slide" } }, "outputs": [], "source": [ "#list files in subdir that end in .csv\n", "import os\n", "\n", "path = './csv_raw_data'\n", "allfiles = os.listdir(path)\n", "csvfiles = [os.path.join(path, f) \n", " for f in list(allfiles) \n", " if os.path.splitext(f)[1]==\".csv\"]\n", "\n", "#something fails at this point when running on Wakari \n", "#(so, maybe any linux platform?) - the file names are correct,\n", "# but participant_df(f) returns blank dataframes.\n", "sub_dfs = {os.path.basename(f)[3:6]: participant_df(f) \n", " for f in csvfiles}\n", "sub_dfs_sorted = OrderedDict(sorted(sub_dfs.items(), key=lambda t: t[0]))\n", "\n", "dbase = pd.concat(sub_dfs_sorted.values(), \n", " #axis=0, #defaults\n", " #join='outer', \n", " #join_axes=None, \n", " #ignore_index=False, \n", " keys=sub_dfs_sorted.keys(), # participant id strings\n", " #levels=None, \n", " names=['pid'], \n", " #verify_integrity=False\n", " )" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['015', '016', '017', '018', '019', '020', '021', '022', '023', '024', '025', '026', '027', '028', '029', '030', '031', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '043', '044', '045', '046', '047', '048', '049', '050', '051', '052', '053', '054', '055', '056', '057', '058', '059', '060', '061', '062', '063', '064', '065', '066', '067', '068', '069', '070', '071', '072', '073', '074', '075', '076', '077', '078', '079', '080', '081', '082', '083', '084', '085', '086', '087', '088', '089', '090', '091', '092', '093', '094', '095', '096', '097', '098', '099', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121']\n", "['ISIP_5', 'ISIP_8', 'Improv_Melody', 'Improv_Metronome', 'Jits_ISO_5', 'Jits_ISO_8', 'Jits_Linear_5', 'Jits_Linear_8', 'Jits_Phase_5', 'Jits_Phase_8', 'Pattern_Record', 'T1_SMS_5', 'T1_SMS_8', 'Ticks_ISO_T2_5', 'Ticks_ISO_T2_8', 'Ticks_Linear_5', 'Ticks_Linear_8', 'Ticks_Phase_5', 'Ticks_Phase_8']\n" ] } ], "source": [ "for t in REMOVE_TASKS:\n", " dbase = dbase.drop(REMOVE_TASKS, axis=0, level='task_name')\n", " \n", "pid_list = sorted(list(dbase.index.get_level_values('pid').unique()))\n", "print(pid_list)\n", "task_name_list = sorted(list(dbase.index.get_level_values('task_name').unique()))\n", "print(task_name_list)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# promote task_name above pid to top of index hierarchy\n", "dbase = dbase.swaplevel(0,1, axis=0) \n", "dbase = dbase.sort()\n", "#This puts the tasks in alphabetical order, but we'll need to get the original\n", "#task presentation order eventually. Can't use run_count easily (because it \n", "#goes back to 1 if the machine was reset), but we could compare the \n", "#min(csv_line) for each task, since that doesn't reset.\n", "\n", "dbase.loc[(dbase.channel==CHANNEL_TAP) & (dbase.pitch==PITCH_R_PAD), 'stamp_type'] = 'tap_r'\n", "dbase.loc[(dbase.channel==CHANNEL_TAP) & (dbase.pitch==PITCH_L_PAD), 'stamp_type'] = 'tap_l'\n", "dbase.loc[(dbase.channel==CHANNEL_TAP) \n", " & (dbase.pitch != PITCH_L_PAD) \n", " & (dbase.pitch != PITCH_R_PAD), 'stamp_type'] = 'tap_trigger_error'\n", "dbase.ix[dbase.channel==CHANNEL_PIANO, 'stamp_type'] = 'piano'\n", "dbase.ix[dbase.channel==CHANNEL_LOOPBACK, 'stamp_type'] = 'loopback'\n", "\n", "assert set(dbase.stamp_type.values) == set(['loopback', 'piano', 'tap_r', \n", " 'tap_l', 'tap_trigger_error', \n", " 'target'])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# removing duplicate tasks manually from CSV files-- running out of memory\n", "# while trying to do this in pandas (below)\n", "\n", "#grouped = dbase.groupby(level=['task_name', 'pid'])\n", "#\n", "#def select_rerun_tasks(df):\n", "# trc_min = df.run_count.min()\n", "# trc_max = df.run_count.max() \n", "# df['trc_min'] = trc_min\n", "# df['trc_max'] = trc_max \n", "# subset = df.loc[df.trc_min != df.trc_max]\n", "# return subset\n", "#\n", "#db_duplicate_issues = grouped.apply(select_rerun_tasks)\n", "#\n", "#dbdi = db_duplicate_issues.loc[(db_duplicate_issues.stamp_type=='loopback')\n", "# & (db_duplicate_issues.task_id != PRACTICE_TASK_NUMBERS[0])\n", "# & (db_duplicate_issues.task_id != PRACTICE_TASK_NUMBERS[1])\n", "# & (db_duplicate_issues.task_id != PRACTICE_TASK_NUMBERS[2])\n", "# & (db_duplicate_issues.task_id != PRACTICE_TASK_NUMBERS[3])\n", "# & (db_duplicate_issues.task_id != PRACTICE_TASK_NUMBERS[4])\n", "# ]\n", "#\n", "#dbdi.to_csv('duplicate_issues_v3.csv')\n", "#currently: remaining duplicate issue is pid 013, improv_metronome. Couldn't\n", "# resolve this based on my notes-- listen to the audio recording." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Convert timestamps to milliseconds relative to start of task\n", "grouped = dbase.groupby(level=['task_name', 'pid'])\n", "def compute_within_task_millis(df):\n", " df_loopback = df.loc[df.stamp_type=='loopback']\n", " start_micros = df_loopback.micros.min()\n", " df['task_ms'] = (df.micros - start_micros)/1000.\n", " return df\n", "dbase = grouped.apply(compute_within_task_millis)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Computing intervals within task+pid+stamptype (mainly useful for ISIP tasks)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", " | \n", " | \n", " | \n", " | run_count | \n", "task_id | \n", "i | \n", "channel | \n", "pitch | \n", "velocity | \n", "micros | \n", "task_ms | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|
task_name | \n", "pid | \n", "stamp_type | \n", "csv_line | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
ISIP_5 | \n", "015 | \n", "loopback | \n", "8777 | \n", "12 | \n", "5 | \n", "0 | \n", "5 | \n", "42 | \n", "127 | \n", "1338601736 | \n", "0.000 | \n", "
8778 | \n", "12 | \n", "5 | \n", "1 | \n", "5 | \n", "42 | \n", "127 | \n", "1339101656 | \n", "499.920 | \n", "|||
8779 | \n", "12 | \n", "5 | \n", "2 | \n", "5 | \n", "42 | \n", "127 | \n", "1339602176 | \n", "1000.440 | \n", "|||
8780 | \n", "12 | \n", "5 | \n", "3 | \n", "5 | \n", "42 | \n", "127 | \n", "1340101948 | \n", "1500.212 | \n", "|||
8782 | \n", "12 | \n", "5 | \n", "5 | \n", "5 | \n", "42 | \n", "127 | \n", "1340601716 | \n", "1999.980 | \n", "
5 rows × 8 columns
\n", "\n", " | \n", " | \n", " | \n", " | run_count | \n", "task_id | \n", "i | \n", "channel | \n", "pitch | \n", "velocity | \n", "micros | \n", "task_ms | \n", "int_raw | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|
task_name | \n", "pid | \n", "stamp_type | \n", "csv_line | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
ISIP_5 | \n", "015 | \n", "loopback | \n", "8777 | \n", "12 | \n", "5 | \n", "0 | \n", "5 | \n", "42 | \n", "127 | \n", "1338601736 | \n", "0.000 | \n", "NaN | \n", "
8778 | \n", "12 | \n", "5 | \n", "1 | \n", "5 | \n", "42 | \n", "127 | \n", "1339101656 | \n", "499.920 | \n", "499.920 | \n", "|||
8779 | \n", "12 | \n", "5 | \n", "2 | \n", "5 | \n", "42 | \n", "127 | \n", "1339602176 | \n", "1000.440 | \n", "500.520 | \n", "|||
8780 | \n", "12 | \n", "5 | \n", "3 | \n", "5 | \n", "42 | \n", "127 | \n", "1340101948 | \n", "1500.212 | \n", "499.772 | \n", "|||
8782 | \n", "12 | \n", "5 | \n", "5 | \n", "5 | \n", "42 | \n", "127 | \n", "1340601716 | \n", "1999.980 | \n", "499.768 | \n", "
5 rows × 9 columns
\n", "\n", " | \n", " | \n", " | \n", " | run_count | \n", "task_id | \n", "i | \n", "channel | \n", "pitch | \n", "velocity | \n", "micros | \n", "task_ms | \n", "int_raw | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|
task_name | \n", "pid | \n", "stamp_type | \n", "csv_line | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
ISIP_5 | \n", "015 | \n", "loopback | \n", "8777 | \n", "12 | \n", "5 | \n", "0 | \n", "5 | \n", "42 | \n", "127 | \n", "1338601736 | \n", "0.000 | \n", "NaN | \n", "
8778 | \n", "12 | \n", "5 | \n", "1 | \n", "5 | \n", "42 | \n", "127 | \n", "1339101656 | \n", "499.920 | \n", "499.920 | \n", "|||
8779 | \n", "12 | \n", "5 | \n", "2 | \n", "5 | \n", "42 | \n", "127 | \n", "1339602176 | \n", "1000.440 | \n", "500.520 | \n", "|||
8780 | \n", "12 | \n", "5 | \n", "3 | \n", "5 | \n", "42 | \n", "127 | \n", "1340101948 | \n", "1500.212 | \n", "499.772 | \n", "|||
8782 | \n", "12 | \n", "5 | \n", "5 | \n", "5 | \n", "42 | \n", "127 | \n", "1340601716 | \n", "1999.980 | \n", "499.768 | \n", "|||
8784 | \n", "12 | \n", "5 | \n", "7 | \n", "5 | \n", "42 | \n", "127 | \n", "1341101468 | \n", "2499.732 | \n", "499.752 | \n", "|||
8786 | \n", "12 | \n", "5 | \n", "9 | \n", "5 | \n", "42 | \n", "127 | \n", "1341602040 | \n", "3000.304 | \n", "500.572 | \n", "|||
8788 | \n", "12 | \n", "5 | \n", "11 | \n", "5 | \n", "42 | \n", "127 | \n", "1342101840 | \n", "3500.104 | \n", "499.800 | \n", "|||
8790 | \n", "12 | \n", "5 | \n", "13 | \n", "5 | \n", "42 | \n", "127 | \n", "1342601588 | \n", "3999.852 | \n", "499.748 | \n", "|||
8792 | \n", "12 | \n", "5 | \n", "15 | \n", "5 | \n", "42 | \n", "127 | \n", "1343102384 | \n", "4500.648 | \n", "500.796 | \n", "
10 rows × 9 columns
\n", "\n", " | run_count | \n", "task_id | \n", "i | \n", "channel | \n", "pitch | \n", "velocity | \n", "micros | \n", "task_ms | \n", "int_raw | \n", "
---|---|---|---|---|---|---|---|---|---|
pid | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
010 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
011 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
012 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
014 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
015 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
016 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
017 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
018 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
019 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
020 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
021 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
022 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
023 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
024 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
025 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
026 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
027 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
028 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
029 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
030 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
032 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
033 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
034 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
035 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
036 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
037 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
038 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
039 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
040 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
041 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
092 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
093 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
094 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
095 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
096 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
097 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
098 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
099 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
100 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
101 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
102 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
103 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
104 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
105 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
106 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
107 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
108 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
109 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
110 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
111 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
112 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
113 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
114 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
115 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
116 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
117 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
118 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
119 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
121 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "120 | \n", "119 | \n", "
110 rows × 9 columns
\n", "